首页 > 解决方案 > Kafka - 同一事务中的不同 KafkaProducers

问题描述

出于迁移目的,我们需要使用两个不同的序列化器生成记录,因此在同一事务中需要使用两个不同的 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()..所以我认为上面的模型不起作用..在不实例化的情况下实现这一点的任何机会一切并行的全新实例?

标签: apache-kafkatransactionsavro

解决方案


您一次只能让一个生产者在事务中处于活动状态。

如果您使用相同的 2 个生产者启动transactional.id,其中一个将被隔离并且无法提交其记录,并且所有记录都不会成为同一事务的一部分。

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


推荐阅读