我的应用有5个以上的使用者,消耗了kafka主题上的五个分区(使用kafka版本11)。我的使用者的每个消费者都向另一个主题生成一条消息,然后将某些状态保存到数据库中,然后进行手动立即确认并移动进入下一条消息。
当它们向出站主题发出成功消息时,我正在尝试解决这种情况。那么我们就会失败/失去消费者。当另一个使用者接管分区时,它将向出站主题发出一条ANOTHER消息。这很糟糕:(
我发现kafka现在拥有幂等的生产者,但据我所读,它只能保证进行生产者会议。
“生产者重新启动时,将分配新的PID。因此,仅针对单个生产者会话承诺了幂等性”--(博客)-https://hevodata.com/blog/kafka-exactly-once
这对我来说似乎毫无用处。在我的用例中,重点是当我在另一个使用者上重播一条消息时,它不会复制出站消息。
我有什么想念的吗?
答案 0 :(得分:1)
在使用交易记录时,您不应使用任何基于消费者的机制(手动或其他方式)来提交偏移量。
相反,您使用生产者将偏移量发送到事务,因此偏移量提交是事务的一部分。
如果配置了KafkaTransactionManager
或ChainedKafkaTransactionManager
,Spring侦听器容器将在侦听器正常退出时将偏移量发送到事务。
如果您不使用Kafka交易管理器,则需要使用KafkaTemplate
(如果使用的是本机API,则需要使用Producer
)将偏移量发送到交易。
使用使用者提交偏移量不是事务的一部分,因此事情将无法按预期进行。
使用事务管理器时,侦听器容器将Producer
绑定到线程,以便任何下游KafkaTemplate
操作都参与使用者启动的事务。参见the documentation。