Tudor Golubenco:使用 pgstream 实现 Postgres Webhooks
内容提要
这篇文章介绍了如何使用pgstream在PostgreSQL数据库中基于数据更改来设置和触发webhooks。pgstream是一个专注于PostgreSQL的CDC(Change-Data-Capture)工具,可以在Postgres数据库中的数据(或模式)更改时调用webhooks。文章详细介绍了pgstream的webhooks功能,包括发送旧值和新值、TOAST支持和模式更改支持等高级主题。通过将pgstream集成到PostgreSQL环境中,可以自动化工作流程、触发实时通知,并构建更具响应性的应用程序。
延伸解读
REPLICA IDENTITY FULL 的权衡
将表的 REPLICA IDENTITY 设置为 FULL 后,UPDATE 和 DELETE 事件会包含完整的旧行数据,并且 TOAST 存储的大字段也会被包含在 identity 部分。这解决了默认情况下大字段可能缺失的问题。但文章指出,这样做会带来性能影响,尤其是在 Postgres 到 Postgres 的复制场景中更为明显,而对于 webhook 调用场景影响较小。因此,在决定是否启用 FULL 时,需要根据实际使用场景权衡数据完整性与性能开销。
模式变更的 webhook 支持
Postgres 的逻辑复制事件默认不包含模式变更,这可能导致应用程序无法及时感知表结构变化。pgstream 通过安装 DDL 事件触发器,将模式变更记录到 pgstream.schema_log 表中,并允许像订阅普通表一样订阅该表,从而接收模式变更的 webhook。事件中不仅包含新增列的名称和类型,还包含是否可空、是否唯一、默认值等元数据,以及稳定的 pgstream_id,便于跟踪列的重命名。
事件中的 LSN 与列 ID 用途
每个 webhook 事件都包含 LSN(Log Sequence Number),这是 Postgres 生成的唯一且有序的值,可用于在事件乱序处理时进行排序。此外,每个列都有一个由 pgstream 生成的唯一 ID,例如 cr2a0enjc0j00h93rdj0-2,该 ID 在列重命名后保持不变,因此可以用于跨重命名跟踪列。这些设计有助于构建可靠的事件处理逻辑,尤其是在分布式系统中。
Q&A
pgstream是什么,它的主要功能是什么?
pgstream是一个专注于PostgreSQL的CDC工具,主要用于在数据或模式更改时调用webhooks。
如何在PostgreSQL中启用pgstream?
需要启用逻辑复制并加载wal2json输出插件,然后使用docker-compose启动Postgres实例并初始化pgstream。
pgstream如何处理更新操作并发送旧值和新值?
通过设置REPLICA IDENTITY FULL,可以在更新操作中获取旧值和新值,并在webhook事件中发送。
如何创建webhook订阅以接收数据更改通知?
可以通过调用pgstream提供的API,指定URL、模式和表名来创建webhook订阅。
pgstream如何处理模式更改的webhook?
pgstream通过安装DDL事件触发器来记录模式更改,并维护一个单独的表来处理这些事件。
使用pgstream的webhooks有什么实际应用场景?
pgstream的webhooks可以用于自动化工作流程、触发实时通知和构建响应式应用程序。