卡夫卡消费者未正确提交偏移量

时间:2019-08-07 18:04:12

标签: spring spring-boot apache-kafka kafka-consumer-api spring-kafka

我有一个具有以下属性的Kafka使用者:

session.timeout.ms = 60000
heartbeat.interval.ms = 6000

我们注意到大约有2000条消息滞后,并发现消费者(通过我们的应用程序日志)多次消耗同一条消息。另外,请注意,某些消息大约需要10秒钟才能被完全处理。我们怀疑消费者没有正确地提交偏移量(或重复提交相同的旧偏移量),因此,消费者正在拾取相同的消息。

为解决此问题,我们引入了更多属性:

auto.commit.interval.ms=20000 //To ensure that commit is happening only after processing of message is completed
max.poll.records=10 //To make the consumer pick only 10 messages in one go

And, we set the concurrency to 1.

这解决了我们的问题。滞后开始减少,最终变为零。

但是,我仍然不清楚为什么首先出现此问题。 据我了解,默认情况下:

enable.auto.commit = true
auto.commit.interval.ms=5000

因此,理想情况下,消费者应该每5秒提交一次。如果在此时间段内未完全处理消息,会发生什么?消费者要承担什么补偿?是否由于较大的轮询记录大小(默认为500)而发生了问题

另外,关于poll()方法,我读到了:

  

在设置auto.commit.interval.ms的后台发出poll()调用。

因此,最初,如果poll()是每5秒更早发生一次(默认为auto.commit.interval),为什么不提交最新的偏移量呢?因为消费者仍然没有完成处理呢?然后,它应该在接下来的5秒内提交该偏移量。

有人可以回答这些问题并解释为什么出现原始问题吗?

1 个答案:

答案 0 :(得分:3)

如果您将Spring用于Apache Kafka,建议将enable.auto.commit设置为false,以便容器将以更具确定性的方式提交偏移量(在每条记录或每批记录之后) -默认值)。

问题很可能是max.poll.interval.ms,默认情况下是5分钟。如果您的这批消息花费的时间长于此时间,您将看到该行为。您可以增加max.poll.interval.ms,也可以减少max.poll.records

关键是您必须在不到max.poll.interval.ms的时间内处理民意测验返回的记录。