【问题标题】:Will group cordinator treat kafka consumer (0.9) dead if it doesn't call poll() for a very long time?如果很长时间不调用 poll(),组协调器是否会处理 kafka 消费者(0.9)死亡?
【发布时间】: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 对保持消费者活跃/活跃有任何影响吗?

【问题讨论】:

    标签: kafka-consumer-api


    【解决方案1】:

    a) 是的,如果您调用poll() 的时间不超过session.timeout.ms,Kafka 会认为消费者已经死亡。

    b) 作为替代方案,您可以在处理期间(即与处理交错)调用poll() 以触发心跳(并在每次“真实”轮询之前进行搜索)。使用额外的处理线程也是可能的,允许主线程定期轮询以发送心跳。 但是,您需要确保检测到处理线程上的故障(正确执行此操作很棘手)!

    c) 你可以增加超时值,但是,这可能不是你想要的,就像你的消费者失败了,这个失败会很晚才被检测到。

    您描述的问题实际上是已知的,未来消费者的行为可能会发生变化。已经有关于它的讨论。详情请见KIP-62

    更新

    由于 Kafka 0.10.1,消费者有两个配置参数:max.poll.interval.mssession.timeout.ms。第一个是两次连续轮询之间的最大时间,第二个是心跳超时。心跳在一个额外的线程中发送,因此现在与调用poll() 分离。因此,增加max.poll.interval.ms 不会产生无法快速检测到整个客户端故障(无心跳)的负面影响。

    【讨论】:

    • 感谢您针对此问题指出现有 KIP。接受你的建议 b),似乎我可以在主线程中的每个 poll() 调用之后创建一个新线程,并让它定期(使用 sleep())调用它自己的 poll(),从主线程从其最近获得的最低偏移量开始轮询()。一旦主线程完成处理来自之前 poll() 的所有消息,我就可以终止新线程。这看起来是个好方法吗?
    • 是的。两个线程都需要使用相同的消费者对象/实例!否则,他们将被视为两个消费者。这就是为什么您需要在每次真正的民意调查之前寻求正确的位置(爱心民意调查可能会改变消费者的立场)。
    • 在进一步阅读之后,似乎消费者实例不是多线程安全的,所以听起来需要另一种方法来保持消费者的活力。
    • 你是对的,它不是线程安全的(这就是为什么 (b) 很难正确...)。如答案中所述,您要么定期poll,要么增加超时时间。 KIP-62 将在未来解决这个问题。我没有更好的建议。对不起。
    • 感谢马特,似乎 KI-62 已在 0.10.1.0 中发布,但我无法在任何地方找到此版本的下载。有什么想法吗?
    猜你喜欢
    • 2018-07-10
    • 2016-06-08
    • 1970-01-01
    • 1970-01-01
    • 2017-10-16
    • 2017-09-17
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    相关资源
    最近更新 更多