背景

我们有一个应用会发送用户点击事件到kafka主题中,然后我们使用消息作业消费kafka主题的点击事件消息,然后统计不同类型事件的计数值,但是生产上突然告警说kafka主题队列堆积超过1亿,惊讶万分,记录下本次问题查找的过程

无法消费kafka主题的消息

查询job消费域的日志,出现以下消息:

1.kafka.common.errors.TimeoutException: Timeout of 60000ms expired before the last committed offset for partitions could be determined. Try tuning default.api.timeout.ms larger to relax the threshold.

google发现这意味消费者在60s内没法拉取到kafka的offset偏移,一般是长gc导致,迅速查询了下gc日志,发现在这个错误之前确实有一个100s的gc,但是gc恢复后就开始出现这个日志,并且此时没有长gc存在了

2.The following partitions still have unstable offsets which are not cleared on the broker side:, this could be either transactional offsets waiting for completion, or normal offsets waiting for replication after appending to local log

随后出现的这个日志一开始以为是生产者域使用了kafka的事务,然后长时间未提交事务导致消费者没法消费,如果真的生产者使用事务并且长时间未提交的话,确实可能会导致消费者没法消费,此外,服务器的从broker长时间没法从主broker同步到消息也会导致这个日志的出现,但是这两种情形随后都被一一排除了,kafka生产者根本没有使用事务,并且kafka服务器集群并没有日志表明主从间数据复制延迟,

至此,陷入困境,只能重启job消费者域,发现依然未能恢复,此时由于错误日志显示它读取的offset应该是有某种问题,随后我们把这个kafka主题的消息进行回溯,跳过这个有问题的offset,问题竟然得到解决,令人惊异的是我们试验把kafka主题的offset重置到历史的offset,重复消费一些已经消费过的消息,发现也可以解决这个问题,消费者域在随后消费错误日志中显示的offset偏移时是正常的

https://forum.confluent.io/t/consumers-complaining-about-unstable-offsets/3102/2

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐