Apache kafka Kafka JDBC事务源配置

Apache kafka Kafka JDBC事务源配置,apache-kafka,apache-kafka-connect,Apache Kafka,Apache Kafka Connect,我正在尝试使用kafka connect从两个表中获取行。 我以这种方式配置了连接文件source.properties name=jdbc_source_postgres_foobar_01 connector.class=io.confluent.connect.jdbc.JdbcSourceConnector key.converter=org.apache.kafka.connect.json.JsonConverter #key.converter.schema.registry.ur

我正在尝试使用kafka connect从两个表中获取行。 我以这种方式配置了
连接文件source.properties

name=jdbc_source_postgres_foobar_01
connector.class=io.confluent.connect.jdbc.JdbcSourceConnector
key.converter=org.apache.kafka.connect.json.JsonConverter
#key.converter.schema.registry.url=http://localhost:8081
value.converter=org.apache.kafka.connect.json.JsonConverter
#value.converter.schema.registry.url=http://localhost:8081
connection.url=jdbc:postgresql://localhost:5432/store?user=postgres&password=root
table.whitelist=author,book
mode=incrementing
incrementing.column.name=id
validate.non.null=false
topics=author,book
topic.prefix=
涉及的表有
author
book
,后者有一个外键引用
author

然后我注册了一个监听器来使用来自“author”和“book”主题的消息,以便将它们插入到另一个数据库中

@KafkaListener(
主题={“作者”、“书”},
groupId=“foo”,
containerFactory=“fooKafkaListenerContainerFactory”
)
public void listenGroupFoo(@Payload PostgresTableRow message){
System.out.println(“已接收”+消息);
字符串tableName=message.tableName();
HashMap params=message.params();
插入(表名、参数);
}
当涉及的表彼此之间没有约束时,这很好,但在本例中,当“book”主题的消息在“author”主题的消息之前被使用时,我会遇到错误

例如,我在源数据库中插入作者“George Orwell”,id=23和书籍“1984”,id=37和
authorId=23
,两条消息被推入卡夫卡,一条在“作者”主题中,另一条在“书籍”主题中。 如果先从“book”主题,然后从“author”主题中使用消息,我会得到一个错误,即无法将id为37的书插入我的sink DB,因为不存在id为23的作者


那么我该如何解决这个问题呢?有一种方法将多个表推到一个主题中,并给出顺序?

你面临着一个复杂的问题,在CDC(变化数据捕捉)世界中用卡夫卡来解决。 您希望实现从数据库到Kafka以及从Kafka到另一个数据库的事务一致、有序、一次复制,以避免您面临的引用完整性问题,即:由于竞争条件,不会发生

我建议阅读罗宾·莫法特(Robin Moffatt)关于CDC和卡夫卡连接JDBC连接器的文章,以及肖恩·罗伯逊(Shawn Robertson)在卡夫卡峰会18上关于同一问题的演讲


  • 不幸的是,如果没有现成的端到端CDC解决方案,我想您要么需要非常有创意,要么需要投入大量精力来解决这个问题。

    您使用的是哪种源和目标db引擎?