Apache kafka 多线程情况下的Kafka事务

Apache kafka 多线程情况下的Kafka事务,apache-kafka,kafka-producer-api,Apache Kafka,Kafka Producer Api,我正在尝试在trasnsaction中创建kafka producer,即,我想编写一组msg,如果有人失败,我想回滚所有msg kafkaProducer.beginTransaction(); try { // code to produce to kafka topic } catch(Exception e) { kafkaProducer.abortTransaction(); } kafkaProducer.commitTransaction(); 问题是上面的单个

我正在尝试在trasnsaction中创建kafka producer,即,我想编写一组msg,如果有人失败,我想回滚所有msg

kafkaProducer.beginTransaction();
try
{
    // code to produce to kafka topic
}
catch(Exception e)
{
    kafkaProducer.abortTransaction();
}
kafkaProducer.commitTransaction();
问题是上面的单个线程工作正常,但当多个线程写入时会抛出异常

试图从\u转换中的状态转换为\u转换中的状态的事务无效

在调试时,我发现如果thread1事务正在进行,而thread2也表示beingTransaction,则会抛出此异常。我不知道如何解决这个问题。我能找到的一件可能的事情是创建一个农产品库

卡夫卡制作人池是否已有可用的API,否则我将不得不创建自己的API

以下是jira已经报告的这方面的改进。


任何其他建议都会非常有用

您一次只能有一个事务在进行中,并且有一个producer实例


如果有多个线程执行单独的处理,并且它们都需要一次语义,那么每个线程应该有一个producer实例。

不确定是否解决了这个问题。 您可以使用apache common pool2创建生产者实例池。
在factory实现的create()方法中,您可以生成并分配唯一的transactionalID以避免冲突(ProducerFencedException)

kafka中是否有可用于ProducerPool的api,以便我们不创建那么多的生产者然后关闭它们。这不是Apache kafka api的一部分。有些框架(如SpringKafka)提供了此功能