对使用新的Kafka幂等生产者API防止重复感到困惑

时间:2018-08-14 00:07:05

标签: apache-kafka kafka-producer-api spring-kafka

我的应用有5个以上的使用者,消耗了kafka主题上的五个分区(使用kafka版本11)。我的使用者的每个消费者都向另一个主题生成一条消息,然后将某些状态保存到数据库中,然后进行手动立即确认并移动进入下一条消息。

当它们向出站主题发出成功消息时,我正在尝试解决这种情况。那么我们就会失败/失去消费者。当另一个使用者接管分区时,它将向出站主题发出一条ANOTHER消息。这很糟糕:(

我发现kafka现在拥有幂等的生产者,但据我所读,它只能保证进行生产者会议。

“生产者重新启动时,将分配新的PID。因此,仅针对单个生产者会话承诺了幂等性”--(博客)-https://hevodata.com/blog/kafka-exactly-once

这对我来说似乎毫无用处。在我的用例中,重点是当我在另一个使用者上重播一条消息时,它不会复制出站消息。

我有什么想念的吗?

1 个答案:

答案 0 :(得分:1)

在使用交易记录时,您不应使用任何基于消费者的机制(手动或其他方式)来提交偏移量。

相反,您使用生产者将偏移量发送到事务,因此偏移量提交是事务的一部分。

如果配置了KafkaTransactionManagerChainedKafkaTransactionManager,Spring侦听器容器将在侦听器正常退出时将偏移量发送到事务。

如果您不使用Kafka交易管理器,则需要使用KafkaTemplate(如果使用的是本机API,则需要使用Producer)将偏移量发送到交易。

使用使用者提交偏移量不是事务的一部分,因此事情将无法按预期进行。

使用事务管理器时,侦听器容器将Producer绑定到线程,以便任何下游KafkaTemplate操作都参与使用者启动的事务。参见the documentation