Springboot Kafka - 消费者幂等性

Posted

技术标签:

【中文标题】Springboot Kafka - 消费者幂等性【英文标题】:Springboot Kafka - Consumer idempotence 【发布时间】:2020-06-23 21:46:58 【问题描述】:

我有一个监听 kafka 的 Spring-boot 应用程序。为避免重复处理,我正在尝试手动提交。为此,我推荐了Commit Asynchronously a message just after reading from topic。但我不知道如何实现消费者幂等,这样记录就不会被处理两次。

【问题讨论】:

【参考方案1】:

Kafka 不存在幂等(恰好一次)消费者。

Kafka确实

提供了仅一次的语义
kafkaRead -> process -> kafkaWrite

但“恰好一次”仅适用于整个流程。 process 步骤是at least once

换句话说,只有在写入成功时才会提交读取的偏移量。如果写入失败,将再次执行读/处理/写。

这是使用Kafka transactions 实现的。

如果您在 process 步骤中与其他商店进行交互(或者根本不进行 kafka 写入 - kafkaRead -> process),您必须编写自己的幂等(重复数据删除)代码。

但这相对容易,因为消费者记录通过topic/partition/offset 有一个唯一键 - 只需将那些与数据一起存储并检查您是否尚未处理该记录。

Kafka确实支持幂等生产者。

【讨论】:

这似乎很完美。有没有优化的方法来存储来自 Kafka 的记录,比较每次新获取的记录以检查它是否已经处理?我可以想到传统的方法,例如存储在数据库或缓存中。

以上是关于Springboot Kafka - 消费者幂等性的主要内容,如果未能解决你的问题,请参考以下文章

kakfa从入门到放弃: 相关概念,幂等性&事务

kakfa从入门到放弃: 相关概念,幂等性&事务

如何保证消息不被重复消费?(如何保证消息消费时的幂等性)

如何保证消息不被重复消费?或者说,如何保证消息消费的幂等性?

如何保证消息不被重复消费啊(如何保证消息消费时的幂等性)?

Kafka幂等性原理及实现剖析