今天,我们很高兴地宣布发布了Supabase Queues,它可用于持久性后台任务的处理。
Supabase Queues 是一个原生于 Postgres 的持久化消息队列,确保消息可靠投递,提高应用程序的可扩展性和健壮性。它设计为与整个 Supabase 平台无缝协作。
Supabase 队列特性Supabase Queues 是基于 Tembo 团队的 pgmq 扩展构建的。
Supabase 有一项政策,即尽可能支持现有的工具,并且 Tembo 团队慷慨地以 OSI 兼容的 PostgreSQL 许可证 开放了他们的扩展。
我们非常感谢所有贡献者,并期待与 Tembo 社区合作。
- Postgres原生:基于开源的pgmq数据库扩展构建,使用任何Postgres工具创建和管理队列。
- 细粒度的授权:通过API权限和行级安全性(RLS)策略控制客户端消费者的队列访问权限。
- 消息可靠传递:添加到队列中的消息保证会被发送到您的消费者。
- 恰好一次的消息传递:消息在可自定义的可见期内恰好被一个消费者接收一次。
- 队列管理和监控:在Supabase仪表板中创建、管理和监控队列和消息。
- 消息持久性和归档:消息存储在Postgres数据库中,您可以选择将其归档以供分析或审计使用。
队列用于异步管理和处理任务。通常,你使用队列来处理长时间运行的异步任务,以确保应用程序的稳定和健壮。
比如说,发邮件
假设你想在用户注册你的网站后发送一封欢迎邮件。而不是在注册过程中立即发送邮件——这可能会影响用户体验——你可以将“发送邮件的任务项”放入队列中。这样一来,一个独立的邮件服务可以处理这个任务,这样就不会影响到注册流程。更棒的是:如果邮件发送失败退回,任务会重新出现在队列中,以便再次处理。
在这个情况下,队列提高了你的应用程序的性能和稳定性。其他例子有:
- 异步处理任务:将耗时的操作(如发送电子邮件、处理图像和生成嵌入)异步执行。
- 服务间通信:通过中心消息队列解耦服务间的通信。
- 负载均衡:将任务均匀分配给多个工作者节点。
队列不仅可以在仪表板上创建,还可以通过 SQL 或数据库迁移来实现。
队列类型在这一部分,我们将重点介绍控制面板。可以参考这里的文档获取SQL的相关信息。
这里有几种可以使用的队列类型:
这图是关于类型的。
基本队列功能:简单但可靠,拥有核心功能的队列,适用于大多数情况。消息在Postgres中通过标准事务保证进行存储和处理。
未记录的队列:为了性能的提升,未记录的队列不写入磁盘,因此更快,但如果数据库崩溃,数据可能无法保存。适用于临时或不太重要的任务。
分区队列(即将推出,敬请期待):专为高吞吐量和可扩展性而设计,分区队列通过将消息分布到多个分区来实现,从而实现并行处理,提高负载处理效率。
使用 Postgres 行级安全性的队列Supabase 队列功能与 Postgres 行级安全功能(RLS)兼容,提供对消息的细粒度访问权限控制。RLS 策略限制了哪些用户或角色可以对特定队列中的消息进行插入、选择、更新或删除操作。
添加信息配置好队列后,你就可以开始添加消息。
在仪表盘上添加信息我们来创建一个新的队列。然后添加一个消息。
添加来自服务器的消息如果你是从服务器连接到你的Postgres数据库的话,你可以通过使用任何Postgres客户端并添加消息内容,来通过SQL进行操作:
select * from pgmq.send(
queue_name => 'foo',
msg => '{ "hello": "world" }',
);
-- 发送消息到 'foo' 队列
全屏查看,退出全屏
客户端消息或
从客户端发来的消息我们提供了可以从[客户端库]中调用的功能,如果你想从浏览器或移动应用中添加消息。比如说:
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('发送', {
queue_name: 'foo',
message: { hello: 'world' },
})
console.log('消息:', 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 强大的索引、JSONB 支持和分区功能也使你能够直接在数据库中高效管理队列,实现可扩展且高性能的队列管理。
通过消除对独立基础设施(如 RabbitMQ 或 Kafka)的需求,您可以降低成本,简化部署流程,并利用现有的 Postgres 工具来进行监控、备份和安全相关的操作。行级安全性、丰富的 SQL 查询以及内置归档使得这成为可能,从而使得 Postgres 成为一个强大的、统一的解决方案,既可用于数据存储,又可用于消息传递。
更多关于LW13的内容第一天:Supabase AI 助手 V2
第二天:Supabase 函数(后台任务和 WebSocket)
第三天:使用 Postgres 调度重复任务
01 - OrioleDB 公开版 Alpha (链接)