关于PostgreSQL和事务的Debezium CDC

关于PostgreSQL和事务的Debezium CDC,postgresql,transactions,cdc,debezium,Postgresql,Transactions,Cdc,Debezium,我想在PostgreSQL数据库上使用Debezium进行变更数据捕获(CDC)。现在我不完全理解如何处理Debezium中的事务 让我们考虑下面的例子——我在源PostgreSQL数据库中有2个表。我在单个数据库事务的范围内将数据插入这两个表中。换句话说,我必须执行两条独立的INSERT语句。如果我对Debezium CDC的理解正确的话,它将导致两个独立的消息进入两个独立的卡夫卡主题(或AWS动觉流)。这些消息中的每一条都将由自己的使用者使用,并在单独的事务中插入到目标数据库中。如果其中一个

我想在PostgreSQL数据库上使用Debezium进行变更数据捕获(CDC)。现在我不完全理解如何处理Debezium中的事务

让我们考虑下面的例子——我在源PostgreSQL数据库中有2个表。我在单个数据库事务的范围内将数据插入这两个表中。换句话说,我必须执行两条独立的

INSERT
语句。如果我对Debezium CDC的理解正确的话,它将导致两个独立的消息进入两个独立的卡夫卡主题(或AWS动觉流)。这些消息中的每一条都将由自己的使用者使用,并在单独的事务中插入到目标数据库中。如果其中一个事务失败,另一个事务可以成功,我将在目标数据库中遇到数据不一致状态


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

您正确描述了默认行为

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


你可以用Debezium的主题来做这个。它提供了消费者应用程序实现缓冲逻辑所需的所有信息。不幸的是,我们还没有一个全面的演示,但我希望我们能很快在博客上看到这一点。

谢谢你的回答。请让我总结一下我对你所说的话的理解。我需要实现定制的应用程序,它将列出参与我的业务事务的表的所有Kafka主题,并在某个缓冲区(内存或数据库)的某个位置收集所有事件。此外,我还需要监听Debezium的事务元数据主题中的事件,因此我将知道每个源事务边界(事件编号等)。一旦我了解到我已在本地收集了特定事务的所有事件,我将在单个事务的范围内将这些更改复制到我的接收器数据库。并将对Debezium的事务元数据主题中的每个事务重复此步骤。我说的对吗?如果是的话,那么Debezium将在第一次执行后尝试加载的源数据库中现有数据的初始快照如何?Debezium会在源数据库中的现有数据上遵循这种情况吗?您的前两条评论是正确的。关于快照,该TX当前未在TX元数据主题中表示(我们计划添加该主题)。更改事件的
source
块中有一个标记,它告诉您这是否是最后一个快照事件。这样,您应该能够等待所有快照事件,但在一次写出所有事件时,您可能会得到一个大型事务。是的,快照是通过JDBC读取的,即WAL格式对此没有任何影响。你甚至可以(仅)用第9.2页拍摄快照。