【发布时间】:2016-07-06 20:30:34
【问题描述】:
https://www.safaribooksonline.com/library/view/kafka-the-definitive/9781491936153/ch04.html 提到 “只要消费者定期发送心跳,它就被认为是活着的,并且正在处理来自其分区的消息。事实上,轮询消息的行为是导致消费者发送这些心跳。如果消费者停止发送心跳的时间足够长,它的会话将超时,组协调器将认为它已死并触发重新平衡。"
同样https://kafka.apache.org/090/javadoc/index.html?org/apache/kafka/clients/consumer/KafkaConsumer.html指定“broker会通过心跳机制自动检测test组中的失败进程,consumer会自动定时ping集群,让集群知道自己是存活的。只要消费者能够做到这一点,它就被认为是活着的,并保留从分配给它的分区中消费的权利。如果它停止心跳的时间比 session.timeout.ms 长,那么它将被认为是死的并且它的分区将被分配给另一个进程。"
在我的应用程序中,处理从之前的 poll() 收到的消息可能需要长达数小时才能调用另一个 poll()。注意:我禁用自动提交是因为我并不总是知道处理所有以前的消息需要多长时间。
a) 这是否会导致组协调员认为消费者已死亡或不活动?
b) 是否有其他方法可以向组协调员发送心跳消息以保持会话处于活动状态?
c) session.timeout.ms 对保持消费者活跃/活跃有任何影响吗?
【问题讨论】: