手记

Supabase消息队列系统详解

今天,我们很高兴地宣布发布了Supabase Queues,它可用于持久性后台任务的处理。

⚡️ 更多关于启动周活动的内容

Supabase Queues 是一个原生于 Postgres 的持久化消息队列,确保消息可靠投递,提高应用程序的可扩展性和健壮性。它设计为与整个 Supabase 平台无缝协作。

Supabase Queues 是基于 Tembo 团队的 pgmq 扩展构建的。

Supabase 有一项政策,即尽可能支持现有的工具,并且 Tembo 团队慷慨地以 OSI 兼容的 PostgreSQL 许可证 开放了他们的扩展。

我们非常感谢所有贡献者,并期待与 Tembo 社区合作。

Supabase 队列特性
  • Postgres原生:基于开源的pgmq数据库扩展构建,使用任何Postgres工具创建和管理队列。
  • 细粒度的授权:通过API权限和行级安全性(RLS)策略控制客户端消费者的队列访问权限。
  • 消息可靠传递:添加到队列中的消息保证会被发送到您的消费者。
  • 恰好一次的消息传递:消息在可自定义的可见期内恰好被一个消费者接收一次。
  • 队列管理和监控:在Supabase仪表板中创建、管理和监控队列和消息。
  • 消息持久性和归档:消息存储在Postgres数据库中,您可以选择将其归档以供分析或审计使用。
你需要排队吗?

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

比如说,发邮件

假设你想在用户注册你的网站后发送一封欢迎邮件。而不是在注册过程中立即发送邮件——这可能会影响用户体验——你可以将“发送邮件的任务项”放入队列中。这样一来,一个独立的邮件服务可以处理这个任务,这样就不会影响到注册流程。更棒的是:如果邮件发送失败退回,任务会重新出现在队列中,以便再次处理。

在这个情况下,队列提高了你的应用程序的性能和稳定性。其他例子有:

  • 异步处理任务:将耗时的操作(如发送电子邮件、处理图像和生成嵌入)异步执行。
  • 服务间通信:通过中心消息队列解耦服务间的通信。
  • 负载均衡:将任务均匀分配给多个工作者节点。
如何创建队列(Queue创建)

队列不仅可以在仪表板上创建,还可以通过 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中定义了几个函数:sendsend_batchreadpoparchivedelete。您可以在这里找到更多细节,请参阅文档

安全设置与权限

默认情况下,队列只能通过 SQL 访问,不通过 Supabase 数据 API 公开。您可以在数据 API 设置中通过公开 pgmq_public 模式来调整这一点。一旦公开了此模式,则必须使用行级安全性(RLS)来管理队列访问。

除了RLS外,Postgres的角色可以被赋予与队列交互的具体权限。

例如,以下权限允许经过身份验证的用户完全操控消息,而相比之下,匿名用户只能添加或检索消息。

postgresservice_role 这两个角色默认拥有权限,应一直保持启用以执行服务器端操作。

监控队列和消息的情况

你可以使用控制面板来检查你的消息,包括消息的状态、重试次数以及负载内容。你也可以随时选择延后、存档或删除消息。

在队列页面,只需点击一个队列即可查看。然后你可以点击某条消息查看更多详细信息。

监控图片如下,点击可查看大图

今天就试试 Supabase 队列吧
  1. - 访问你的项目的集成页面
  2. - 启用队列功能。
  3. - 创建你的第一个队列吧。

Postgres 无所不包

使用 Postgres 作为你的队列系统可以让你的技术栈保持精简且熟悉的环境。你可以在一个事务中添加队列消息的同时修改相关数据,避免数据不一致并减少额外的协调工作。Postgres 强大的索引、JSONB 支持和分区功能也使你能够直接在数据库中高效管理队列,实现可扩展且高性能的队列管理。

通过消除对独立基础设施(如 RabbitMQ 或 Kafka)的需求,您可以降低成本,简化部署流程,并利用现有的 Postgres 工具来进行监控、备份和安全相关的操作。行级安全性、丰富的 SQL 查询以及内置归档使得这成为可能,从而使得 Postgres 成为一个强大的、统一的解决方案,既可用于数据存储,又可用于消息传递。

更多关于LW13的内容

第一天:Supabase AI 助手 V2
第二天:Supabase 函数(后台任务和 WebSocket)
第三天:使用 Postgres 调度重复任务

构建阶段:

01 - OrioleDB 公开版 Alpha (链接)

02- Supabase CLI v2:配置即代码

03 - 高性能磁碟

社区聚会:https://supabase.com/events?category=meetup

0人推荐
随时随地看视频
慕课网APP