我们的kafka streams应用程序的streamthread使用者之一在生成以下日志消息后进入僵尸状态:
[用户客户端ID=notification-processor-db9aa8a3-6c3b-453b-b8c8-106bf2fa257d-streamthread-1-用户,groupid=notification processor]member notification-processor-db9aa8a3-6c3b-453b-b8c8-106bf2fa257d-streamthread-1-consumer-b2b9eac3-c374-43e2-bbc3-d9ee514a3c16向协调器发送leavegroup请求****:9092(id:2147483646 rack:null),因为使用者轮询超时已过期。这意味着对poll()的后续调用之间的时间间隔长于配置的max.poll.interval.ms,这通常意味着poll循环在处理消息方面花费了太多时间。您可以通过增加max.poll.interval.ms或使用max.poll.records减少poll()中返回的批的最大大小来解决此问题。
似乎streamthread的kafka消费者已经离开了消费者组,但是kafka streams应用程序仍然处于运行状态,同时没有消费任何新记录。
我想检测,Kafka流应用程序已进入这样一个僵尸状态,所以它可以关闭,并替换为一个新的示例。通常,我们通过kubernetes健康检查来验证kafka streams应用程序是否处于运行或重新分区状态,但这在这种情况下不起作用。
因此我有两个问题:
当kafka streams应用程序没有活动消费者时,它会保持运行状态吗?如果是:为什么?
我们如何(以编程方式/通过度量)检测到kafka streams应用程序进入了这样一个没有活动消费者的僵尸状态?
1条答案
按热度按时间tkqqtvp11#
当kafka streams应用程序没有活动消费者时,它会保持运行状态吗?如果是:为什么?
这取决于版本。在旧版本(2.1.x及更旧版本)中,kafka流确实会保持在运行状态,即使所有线程都死掉了。此问题已在中修复
v2.2.0
通过https://issues.apache.org/jira/browse/kafka-7657.我们如何(以编程方式/通过度量)检测到kafka streams应用程序进入了这样一个没有活动消费者的僵尸状态?
即使在旧版本中,也可以在
KafkaStreams
客户。每次StreamThreads
死了。顺便说一句:在即将发布的2.6.0版本中,一个新的度量
alive-stream-threads
添加以跟踪正在运行的线程数:https://issues.apache.org/jira/browse/kafka-9753