【问题标题】:Kafka single consumer failure in a groupKafka 单个消费者在一个组中失败
【发布时间】:2014-08-28 04:20:24
【问题描述】:

我正处于探索 Kafka 版本 0.8.1.1 的初始阶段。

我已经成功运行了消费者组示例,具有多个分区,并且它在消费者之间很好地分发消息。

我想运行的一个测试用例是组中的一个消费者突然死亡(例如 kill -9 )。当我这样做时,我预计会发生再平衡,但它没有发生。那么,我可以做这些事情之一吗?

  1. 使用 API 触发重新平衡
  2. 将 kafka 配置为等待消费者活动的特定时间,并在假设它被非正常关闭的情况下自动重新平衡。

这里的问题是,分配给死消费者的分区中的所有消息都保留在队列中,并且在重新平衡发生之前永远不会被处理。

【问题讨论】:

标签: apache-kafka


【解决方案1】:

重新平衡将自动发生,可以在消费者配置 (zookeeper.session.timeout.ms) 中设置。根据文档

zookeeper.session.timeout.ms:ZooKeeper 会话超时。如果消费者在这段时间内未能向 Zookeeper 发送心跳,则认为它已死亡,并且将发生重新平衡。默认值为 6000 毫秒

同一组中的其他在线消费者将在超时间隔后开始接收消息。

根据您的要求配置此超时值。

还有一些来自 kafka 文档的更多信息:

消费者重新平衡失败(您将看到 ConsumerRebalanceFailedException):这是由于两个消费者试图拥有相同的主题分区时发生冲突。日志将显示导致冲突的原因(搜索“conflict in”)。

  1. 如果您的消费者订阅了许多主题并且您的 ZK 服务器很忙,这可能是由于消费者没有足够的时间查看同一组中所有消费者的一致视图。如果是这种情况,请尝试增加 rebalance.max.retries 和 rebalance.backoff.ms。
  2. 另一个原因可能是其中一个消费者被硬杀。重新平衡期间的其他消费者不会意识到消费者在 zookeeper.session.timeout.ms 时间之后消失了。在这种情况下,请确保 rebalance.max.retries * rebalance.backoff.ms > zookeeper.session.timeout.ms。

【讨论】:

  • 谢谢,我已经在这样做了,已经多次阅读文档。但可能我的代码的杀死“模拟”还不够。我已经通过 consumerThread.interrupt() 杀死了消费者线程;可能这并没有中断与 zk 的联系。当我将消费者作为多个进程运行并杀死它们时,它工作得很好,即发生了重新平衡。谢谢!
  • 我也试过了,但没有解决我的问题。 stackoverflow.com/questions/39241872/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-27
  • 2015-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多