我们在Java Kafka消费者中看到了意外的重新平衡,如下所述。这些问题对任何人来说都很熟悉吗?有关API或调试技术的任何提示,以找出重新平衡的原因吗?
两个进程正在阅读主题。有时,主题上的所有分区都会重新平衡到单个读取器进程。重启两个进程后,分区均衡均衡。
两个进程正在阅读主题。有时,一系列重新平衡会使读者之间的分区反弹。我们称消费者暂停/恢复背压,这可以防止这种情况。
两个进程正在阅读主题。有时,当两个进程看起来都正常时,会发生重新平衡。之后,阅读工作正常,但这是处理过程中的一个小问题。
我们希望分区在没有看到某些原因或失败的情况下不会重新平衡。
有时poll()
卡住(超过超时),我们使用wakeup()
和close()
,然后创建新的消费者。有时协调员心跳线程在消费者关闭后继续运行(我们已经看到了数千个)。时间似乎与重新平衡无关,因此重新平衡似乎是一个单独的问题,但也许心跳正在打击一个未记录的网络问题。
我们使用ConsumerRebalanceListener
来记录和处理某些重新平衡,但Kafka API似乎没有公开有关重新平衡原因的数据。
重新平衡是间歇性的,难以重现。它们以每秒10,000到80,000的消息速率发生。我们在日志中看不到明显的错误。
我们的读取循环非常简单 - 基本上是#34;在运行时,使用超时和错误处理轮询,然后将收到的消息排入队列"。
人们已经提出了相关的问题,但答案并没有帮助我们:
配置:
KafkaConsumer.poll()
的超时时间为1000毫秒。影响重新平衡的配置是:
max.poll.interval.ms=50000
max.poll.records=100
request.timeout.ms=40000
session.timeout.ms=20000
我们使用默认值:
heartbeat.interval.ms=3000
group.max.session.timeout.ms=300000
group.min.session.timeout.ms=6000
答案 0 :(得分:0)
检查gc日志,并确保不经常有完整的gc,这将阻止心跳线程正常工作。