出于迁移目的,我们需要在同一事务中使用两个不同的序列化程序来生成记录,因此要使用两个不同的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()。所以我认为上面的模型不起作用。 是否有可能在不实例化所有实例的全新实例的情况下实现这一目标?
答案 0 :(得分:0)
您一次只能在交易中拥有一个生产者。
如果您以相同的transactional.id
来启动2个生产者,那么其中一个生产者将被围起来,将无法提交其记录,并且所有ecords都不属于同一笔交易。
您需要使用单个生成器,一种可能的解决方法是将其配置为使用BytesSerializer
并明确处理Objects
到逻辑中字节的转换。