我有一个Spring-boot应用程序,可以监听kafka。为了避免重复处理,我尝试进行手动提交。为此,我提到了Commit Asynchronously a message just after reading from topic。但是我坚持如何实现 消费者幂等 ,这样记录就不会被处理两次。
答案 0 :(得分:3)
Kafka根本不具备等幂(恰好一次)的消费者。
Kafka 确实为
提供了一次语义kafkaRead -> process -> kafkaWrite
但是“恰好一次”仅适用于整个流程。 process
步骤是at least once
。
换句话说,仅当写入成功时才提交读取偏移。如果写入失败,将再次执行读取/处理/写入。
这是通过Kafka transactions实现的。
如果您要在process
步骤中与其他商店进行交互(或者根本不进行卡夫卡写入-kafkaRead -> process
),则必须编写自己的幂等(重复数据删除)代码。 / p>
但这比较容易,因为消费者记录通过topic/partition/offset
具有唯一键-只需将这些记录与数据一起存储,并检查您是否尚未处理该记录。
Kafka 确实支持幂等生产者。