我有以下Kafka设置
Number of producer : 1
Number of topics : 1
Number of partitions : 2
Number of consumers : 3 (with same group id)
Number of Kafka cluster : none(single Kafka server)
Zookeeper.session.timeout : 1000
Consumer Type : High Level Consumer
生产者生成没有任何特定分区逻辑的消息(默认分区逻辑)。 消费者1持续消费消息。我突然杀死了消费者1,除了消费者2或消费者3之外,我会在消费者1失败后消费消息。
在某些情况下,会发生重新平衡,而消费者2会开始使用消息。这很好。 但在某些情况下,消费者2或消费者3根本不消费。我必须手动杀死所有消费者并再次启动所有三个消费者。 只有在重新启动之后,消费者1才会再次开始消费。
在某些情况下,精确重新平衡是成功的,而在某些情况下,重新平衡不成功。 是否有任何我缺少的配置。
答案 0 :(得分:1)
Kafka使用Zookeeper协调高级别消费者。
来自http://kafka.apache.org/documentation.html:
分区所有者注册表
每个代理分区由给定的单个使用者使用 消费者群体。消费者必须确定其给定的所有权 任何消费开始之前的分区。建立它的 所有权,消费者在其下的短暂节点中写入自己的id 它声称的特定经纪人分区。
/ consumers / [group_id] / Owner / [topic] / [broker_id-partition_id] - > consumer_node_id(短暂节点)
有一个已知的短暂节点怪癖,他们可以在ZK客户端突然停机后延迟30秒: http://developers.blog.box.com/2012/04/10/a-gotcha-when-using-zookeeper-ephemeral-nodes/
因此,如果您希望消费者2和3在#1终止后立即开始阅读消息,那么您可能会遇到此问题。
您还可以在重新平衡后检查/ consumers / [group_id] / owners / [topic] / [broker_id-partition_id]是否包含正确的数据。