我有一个具有以下属性的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秒内提交该偏移量。
有人可以回答这些问题并解释为什么出现原始问题吗?
答案 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
的时间内处理民意测验返回的记录。