Supabase 队列

2025-06-10

Supabase 队列

今天我们发布了Supabase Queues,用于持久的后台任务处理。

⚡️ 更多关于发布周的信息

Supabase Queues 是一个 Postgres 原生的持久化消息队列,提供可靠的投递保证,可提升应用程序的可扩展性和弹性。它旨在与整个 Supabase 平台无缝协作。

Supabase Queues 由Tembo团队基于 pgmq 扩展构建。Supabase
的政策是尽可能支持现有工具,Tembo 团队慷慨地为其扩展提供了与 OSI 兼容的PostgreSQL 许可证
我们非常感谢所有贡献者,并期待与 Tembo 社区合作。

Supabase 队列功能

  • Postgres Native:建立在开源 pgmq 数据库扩展之上,使用任何 Postgres 工具创建和管理队列。
  • 细粒度授权:使用 API 权限和行级安全 (RLS) 策略控制客户端消费者对队列的访问。
  • 保证消息传递:保证添加到队列的消息能够传递给您的消费者。
  • 恰好一次消息传递:在可自定义的可见性窗口内,一条消息恰好向消费者传递一次。
  • 队列管理和监控:在 Supabase 仪表板中创建、管理和监控队列和消息。
  • 消息持久性和存档:消息存储在 Postgres 中,您可以选择将其存档以用于分析或审计目的。

您需要队列吗?

队列用于异步管理和处理任务。通常,队列用于长时间运行的任务,以确保应用程序的健壮性。

例如发送电子邮件:

假设您想在用户注册网站后向其发送一封欢迎邮件。与其在注册过程中立即发送邮件(这可能会降低用户体验),不如将“邮件任务”放入队列中。之后,单独的邮件服务可以处理此任务,在不影响注册流程的情况下发送电子邮件。更妙的是:如果邮件被退回,该任务可以“重新出现”在队列中,再次进行处理。

在这种情况下,队列提高了应用程序的性能弹性。其他情况包括:

  • 异步处理任务:卸载耗时的操作,例如发送电子邮件、处理图像和生成嵌入。
  • 服务之间的通信:通过中央队列传递消息来解耦您的服务。
  • 负载平衡:在多个工作者之间均匀分配任务。

创建队列

可以在仪表板中或使用 SQL/数据库迁移创建队列。

本节我们将重点介绍仪表板。您可以参考SQL文档。

队列类型

有多种类型的队列可用:

类型

基本队列:简单、可靠,具备核心功能,适用于大多数用例。消息在 Postgres 中使用标准事务保证进行存储和处理。

未记录队列:针对性能进行了优化,未记录队列避免将消息写入磁盘,因此速度更快,但在数据库崩溃时持久性较差。适用于瞬时或不太重要的工作负载。

分区队列(即将推出):分区队列专为高吞吐量和可扩展性而设计,可将消息分布在多个分区中,从而实现并行处理和更高效的负载处理。

具有 Postgres 行级安全性的队列

Supabase 队列与 Postgres 行级安全性 (RLS) 兼容,提供对消息的细粒度访问控制。RLS 策略限制哪些用户或角色可以在特定队列中插入、选择、更新或删除消息。

添加消息

一旦配置了队列,您就可以开始添加消息。

仪表板添加消息

从仪表板添加消息

让我们创建一个新的基本队列并添加一条消息。

创建新的

添加消息

确认添加

从服务器添加消息

如果您从服务器连接到 Postgres 数据库,则可以使用 SQL 从任何 Postgres 客户端添加消息:

select * from pgmq.send(
  queue_name  => 'foo',
  msg         => '{ "hello": "world" }',
);

Enter fullscreen mode Exit fullscreen mode

添加来自客户端的消息

如果您需要从浏览器或移动应用添加消息,我们提供了几个可从客户端库调用的函数。例如:

import { createClient } from '@supabase/supabase-js'

const url = 'SUPABASE_URL'
const key = 'SUPABASE_ANON_KEY'

const queues = createClient(url, key, {
  db: { schema: 'pgmq_public' },
})

const { data, error } = await queues.rpc('send', {
  queue_name: 'foo',
  message: { hello: 'world' },
})

console.log('Message: ', data)

Enter fullscreen mode Exit fullscreen mode

为了安全起见此功能默认禁用。模式中定义了几个函数pgmq_publicsend,,,,,,您可以在文档中找到更多详细信息send_batchreadpoparchivedelete

安全和权限

默认情况下,队列只能通过 SQL 访问,无法通过 Supabase 数据 API 公开。您可以在数据 API 设置中通过公开 pgmq_public 架构来管理此操作。如果公开此架构,则必须使用行级安全性(RLS) 来管理对队列的访问。

除了 RLS 之外,还可以授予 Postgres 角色与队列交互的细粒度权限。

例如,以下权限允许经过身份验证的用户可以完全操作消息,而匿名用户只能添加/检索消息:

管理消息

postgres角色service_role默认接收权限,并且应保持启用状态以进行服务器端操作。

监控队列和消息

您可以使用控制面板检查您的消息,包括:状态、重试次数和有效负载。您还可以随时推迟、存档或删除消息。

在“队列”页面中,只需点击某个队列即可查看。在这里,您可以点击某条消息查看更多详细信息:

监控

立即试用 Supabase 队列

  1. - 访问项目中的集成页面。
  2. - 启用队列Postgres 模块。
  3. - 创建您的第一个队列。

集成页面

Postgres 适用于一切

使用 Postgres 作为队列系统,可以让您的堆栈保持精简和熟悉。您可以在修改相关数据的同一事务中将消息添加到队列,从而避免不一致并减少额外协调的需要。Postgres 强大的索引功能、JSONB 支持和分区功能,还能直接在您的数据库中实现可扩展的高性能队列管理。

通过消除对 RabbitMQ 或 Kafka 等独立基础架构的需求,您可以降低成本、简化部署,并利用现有的 Postgres 工具进行监控、备份和安全管理。行级安全性、丰富的 SQL 查询和内置归档等功能使 Postgres 成为强大的统一数据存储和消息传递解决方案。

有关 LW13 的更多信息

第 1 天 - Supabase AI Assistant V2
第 2 天 - Supabase 函数:后台任务和 WebSockets
第 3 天 -
Supabase Cron:在 Postgres 中安排重复作业

构建阶段

01-OrioleDB 公共 Alpha 版本

02- Supabase CLI v2:以代码形式配置

03 -高性能磁盘

社区聚会

鏂囩珷鏉ユ簮锛�https://dev.to/supabase/supabase-queues-5fne
PREV
Supabase:七个月的建设。
NEXT
Supabase Bootstrap:启动新项目的最快方式