Spring boot 使用Spring Cloud Stream Kafka binder重复使用消息

Spring boot 使用Spring Cloud Stream Kafka binder重复使用消息,spring-boot,apache-kafka,spring-kafka,spring-cloud-stream,spring-cloud-stream-binder-kafka,Spring Boot,Apache Kafka,Spring Kafka,Spring Cloud Stream,Spring Cloud Stream Binder Kafka,我们有几个使用Spring Boot和Spring Cloud Stream Kafka binder进行通信的微服务 偶尔,我们会观察到消费者收到的重复消息的突发性——通常是在首次消费和处理(成功)后的几天 虽然我知道卡夫卡不能保证一次交付,但考虑到经纪人和服务的日志中都没有再平衡事件或任何“可疑”活动,这看起来仍然很奇怪。由于使用者与外部API交互,因此使其幂等有点困难 有没有提示重复的原因是什么?我应该寻找什么来解决这个问题 我们使用的是Kafka broker 1.0.0,而这个特定的消

我们有几个使用Spring Boot和Spring Cloud Stream Kafka binder进行通信的微服务

偶尔,我们会观察到消费者收到的重复消息的突发性——通常是在首次消费和处理(成功)后的几天

虽然我知道卡夫卡不能保证一次交付,但考虑到经纪人和服务的日志中都没有再平衡事件或任何“可疑”活动,这看起来仍然很奇怪。由于使用者与外部API交互,因此使其幂等有点困难

有没有提示重复的原因是什么?我应该寻找什么来解决这个问题


我们使用的是Kafka broker 1.0.0,而这个特定的消费者使用的是Spring Cloud Stream Binder Kafka 2.0.0,它基于Kafka客户端1.0.2(其他服务的版本可能有点不同)。

在提出类似问题时,您应该显示您的配置

最佳猜测是代理的
偏移量.保留时间.分钟数


对于现代代理版本(自2.0以来),它默认为1周;对于较旧的版本,这仅仅是一天。

非常感谢,@gary russell!实际上,这个参数没有设置,看起来偏移量正在重置,消息被重新使用。然而,消费者群体的运行没有长时间中断。你知道会发生什么会导致经纪人触发清理吗?请参阅上的Loooong讨论。事实证明,对于较旧的代理,
offset.retention.minutes
只是自上次提交以来的时间,即使消费者只是短暂停止(如果它在最后一天没有收到任何记录),也会重置偏移量。对于较新的代理,消费者必须脱机才能删除
offset.retention.minutes
。我不知道它什么时候变了(但是属性描述在2.1中变了),它实际上比我想象的更糟糕;对于1.0代理,即使消费者仍在使用,也会删除偏移量。这不是一个真正的问题,因为
位置()
仍然保留。但是,如果您有两个应用程序实例共享分区,并且偏移保留时间在没有提交的情况下流逝,则会删除偏移。如果随后关闭一个实例,则会发生重新平衡,并在其余实例上重放所有记录。这不是当前经纪人的问题(使用2.4.1和2.5测试),因为直到消费者下跌那么久,他们才被移除。非常感谢!这真的很有帮助。我们一定会考虑升级到一个新版本的经纪人。同时,希望增加补偿保留期会有所帮助。