卡夫卡-同一笔交易中的不同卡夫卡生产者

时间:2019-10-08 11:01:34

标签: apache-kafka transactions avro

出于迁移目的,我们需要在同一事务中使用两个不同的序列化程序来生成记录,因此要使用两个不同的KafkaProducer(一个String和一个Avro)来生成记录。 但是所有的事务工作都是通过一个KafkaProducer实例完成的,如下所示:

kafkaProducer.beginTransaction();
...
kafkaProducer.send(record);
...
kafkaProducer.commitTransaction();

我可以使用第二个kafkaProducer(与第二个序列化程序一起)并使用相同的transactionnal.id并执行以下操作:

kafkaProducer.beginTransaction();
...
kafkaProducer.send(record);
kafkaProducer2.send(record);
...
kafkaProducer.commitTransaction();

全部将是同一笔交易的一部分,都一致吗?

编辑1:

根据我在Java实现中看到的内容,在调用commitTransaction()时有某种机制,例如在生产者本身上调用flush()。所以我认为上面的模型不起作用。 是否有可能在不实例化所有实例的全新实例的情况下实现这一目标?

1 个答案:

答案 0 :(得分:0)

您一次只能在交易中拥有一个生产者。

如果您以相同的transactional.id来启动2个生产者,那么其中一个生产者将被围起来,将无法提交其记录,并且所有ecords都不属于同一笔交易。

您需要使用单个生成器,一种可能的解决方法是将其配置为使用BytesSerializer并明确处理Objects到逻辑中字节的转换。

相关问题