我正处于探索Kafka的初始阶段,版本0.8.1.1。
我已成功运行消费者群体示例,其中包含多个分区及其在消费者中的分发消息。
我想要运行的一个测试用例是当组中的消费者突然死亡时(例如,kill -9)。当我这样做时,我预计会发生再平衡,但它没有发生。那么,我可以做其中一件事吗?
这里的问题是,分配给死消费者的分区中的所有消息都保留在队列中,并且在重新平衡发生之前永远不会被处理。
答案 0 :(得分:9)
重新平衡将自动发生,可以在消费者配置(zookeeper.session.timeout.ms)中设置。根据文件
zookeeper.session.timeout.ms :ZooKeeper会话超时。如果消费者在这段时间内未能对动物园管理员心跳,则认为它已经死亡并且将发生再平衡。默认值为6000毫秒
同一组中的另一个实时消费者将在超时间隔后开始接收消息。
根据您的要求配置此超时值。
还有一些来自kafka文档的更多信息:
消费者重新平衡失败(您将看到ConsumerRebalanceFailedException):这是由于两个消费者试图拥有相同主题分区时的冲突。日志将显示导致冲突的原因(搜索“冲突”)。
- 如果您的消费者订阅了许多主题并且您的ZK服务器很忙,这可能是因为消费者没有足够的时间来查看同一组中所有消费者的一致视图。如果是这种情况,请尝试增加rebalance.max.retries和rebalance.backoff.ms。
- 另一个原因可能是其中一名消费者被杀死了。重新平衡期间的其他消费者将不会意识到在zookeeper.session.timeout.ms时间之后消费者已经消失。在这种情况下,请确保rebalance.max.retries * rebalance.backoff.ms> zookeeper.session.timeout.ms。
醇>