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" }',
);
添加来自客户端的消息
如果您需要从浏览器或移动应用添加消息,我们提供了几个可从客户端库调用的函数。例如:
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)
为了安全起见,此功能默认禁用。模式中定义了几个函数pgmq_public
:send
,,,,,,。您可以在文档中找到更多详细信息。send_batch
read
pop
archive
delete
安全和权限
默认情况下,队列只能通过 SQL 访问,无法通过 Supabase 数据 API 公开。您可以在数据 API 设置中通过公开 pgmq_public 架构来管理此操作。如果公开此架构,则必须使用行级安全性(RLS) 来管理对队列的访问。
除了 RLS 之外,还可以授予 Postgres 角色与队列交互的细粒度权限。
例如,以下权限允许经过身份验证的用户可以完全操作消息,而匿名用户只能添加/检索消息:
postgres
和角色service_role
默认接收权限,并且应保持启用状态以进行服务器端操作。
监控队列和消息
您可以使用控制面板检查您的消息,包括:状态、重试次数和有效负载。您还可以随时推迟、存档或删除消息。
在“队列”页面中,只需点击某个队列即可查看。在这里,您可以点击某条消息查看更多详细信息:
立即试用 Supabase 队列
- - 访问项目中的集成页面。
- - 启用队列Postgres 模块。
- - 创建您的第一个队列。
Postgres 适用于一切
使用 Postgres 作为队列系统,可以让您的堆栈保持精简和熟悉。您可以在修改相关数据的同一事务中将消息添加到队列,从而避免不一致并减少额外协调的需要。Postgres 强大的索引功能、JSONB 支持和分区功能,还能直接在您的数据库中实现可扩展的高性能队列管理。
通过消除对 RabbitMQ 或 Kafka 等独立基础架构的需求,您可以降低成本、简化部署,并利用现有的 Postgres 工具进行监控、备份和安全管理。行级安全性、丰富的 SQL 查询和内置归档等功能使 Postgres 成为强大的统一数据存储和消息传递解决方案。
有关 LW13 的更多信息
第 1 天 - Supabase AI Assistant V2
第 2 天 - Supabase 函数:后台任务和 WebSockets
第 3 天 -
Supabase Cron:在 Postgres 中安排重复作业