首页 > 解决方案 > 在 MANUAL_IMMEDIATE 模式下根本不确认 kafka 消息

问题描述

我找不到与此问题相关的任何文档,因此问题。

如果设置为时@KafkaListener方法根本不调用acknowledgement.acknowledge(),但没有任何异常成功退出方法,会发生什么情况。ackModeMANUAL_IMMEDIATE

我们在我们的一个消费者中遇到了这个问题并丢失了消息(确切地说是偏移量移动了,我们预计偏移量不会移动,因为我们从未调用过acknowledgement.acknowledge()),这是预期的行为吗?

这里的问题似乎解决了同样的问题,但从未收到关于没有异常时会发生什么的答案,因为我相信错误处理程序和恢复器仅在引发异常时才起作用,而不是在消息未确认的情况下。

标签: apache-kafkakafka-consumer-apispring-kafka

解决方案


Kafka 维护了两个指针;提交的偏移量和当前位置。

如果不调用acknowledge(),正常退出,提交的偏移量不会移动,但位置会移动;您将在下一个获得下一个记录poll()

如果您重新启动应用程序,您将再次获得相同的记录。

您还必须将 Kafka 消费者属性设置enable.auto.commmitfalse- spring-kafka(自 2.3 起)会自动执行此操作,除非您已明确设置它。


推荐阅读