多线程情况下的Kafka事务

时间:2020-10-13 11:27:05

标签: apache-kafka kafka-producer-api

我正在尝试通过交易创建kafka生产者,即,如果有人失败,我想编写一组msg,我想回滚所有msg。

kafkaProducer.beginTransaction();
try
{
    // code to produce to kafka topic
}
catch(Exception e)
{
    kafkaProducer.abortTransaction();
}
kafkaProducer.commitTransaction();

问题在于上面的单个线程可以正常工作,但是当多个线程写入时会引发异常

尝试从状态IN_TRANSITION到IN_TRANSITION的无效交易

在调试时,我发现如果线程1事务正在进行中,并且线程2也说“ beingTransaction”,则会引发此异常。我没有找到如何解决此问题的方法。我可能找到的一件事是创建一个生产池。

kafka生产者池中是否已有任何可用的API,否则我将不得不创建自己的API。

下面是已经针对此报告的改进jira。 https://issues.apache.org/jira/browse/KAFKA-6278

任何其他建议都会很有帮助

2 个答案:

答案 0 :(得分:1)

与生产者实例一次只能进行一个事务。

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

答案 1 :(得分:0)

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