PostgreSQL 和事务上的 Debezium CDC

Debezium CDC on PostgreSQL and transactions

我想在 PostgreSQL 数据库上使用 Debezium 进行变更数据捕获 (CDC)。现在我不完全明白如何在 Debezium 中处理交易。

让我们考虑以下示例 - 我在源 PostgreSQL 数据库中有 2 个 table。我在单个数据库事务的范围内将数据插入到这两个 table 中。换句话说,我必须执行两个单独的 INSERT 语句。如果我对 Debezium CDC 的理解正确,它将导致两条单独的消息进入两个单独的 Kafka 主题(或 AWS Kinesis 流)。这些消息中的每一个都将由自己的消费者使用,并在单独的事务中插入到目标数据库中。万一一个事务失败,另一个可以成功,我就运行进入目标数据库的数据不一致状态。

Debezium 中是否有任何标准机制来处理这种情况?或者例如,为了避免它,我必须使用 Kafka Streams API 并将这两个主题合并为一个主题(在 transactionId 上),然后再更新目标数据库?

您正确描述了默认行为。

如果您想使用一个事务将多条记录写入接收器数据库,您可能必须使用定制的消费者应用程序,该应用程序在内部缓冲源自一个事务的事件并将它们写出到接收器数据库一次在一次交易中。简单地将事件集中在一个主题上对您没有帮助,因为通用接收器连接器仍然不知道源事务边界。

您可以为此使用 Debezium 的 transaction metadata 主题。它提供了此类消费者应用程序实现此类缓冲逻辑所需的所有信息。不幸的是,我们还没有一个全面的演示,但我希望我们很快就会写一篇关于这个的博客。