如果Kafka Consumer实例死亡会怎样?

时间:2017-05-17 12:15:59

标签: apache-kafka kafka-consumer-api partition

  • Kafka Broker有3个分区。
  • Kafka Consumer实例'计数为3。
  • 突然,一个消费者实例死亡。

我知道如果Kafka Consumer实例死亡,Kafka Broker将重新平衡,另一个消费者实例将分配给该分区。

我想知道假设另一个实例消耗它最初消耗的所有分区然后分配和使用死分区是否正确。

(我是否必须在客户端代码中实现ConsumerRebalanceListener?)

如果是这种情况,消费信息会有延迟吗?

谢谢。

2 个答案:

答案 0 :(得分:0)

默认分区分配策略为RangeAssignor。对于每个订阅的主题,此策略:

  • 将分区按数字顺序排序。
  • 将消费者按字典顺序排序。
  • 尝试为每个使用者分配相同数量的分区。如果消费者的数量没有平均分配到分区数量,那么前几个消费者将有一个额外的分区。

在您的示例开头,有

  • 分区0,1,2
  • 消费者A,B,C

此策略指定:

  • 消费者A:分区0
  • 消费者B:分区1
  • 消费者C:分区2

假设消费者C死亡。

重新平衡执行此策略
  • 分区0,1,2
  • 消费者A,B

战略分配:

  • 消费者A:分区0,1
  • 消费者B:分区2

因此,在此方案中,重新平衡后分配给使用者B的分区集不包含在重新平衡之前分配给它的分区。

答案 1 :(得分:0)

如果我没记错的话,重新平衡会中断您其他消费者的处理。

如果您在每个批次的末尾提交偏移量,则意味着将重新处理批次中所有已处理的数据。

为避免这种情况,您可以使用consumer.commitAsync()(允许您在批处理过程中提交偏移量),也可以根据推断实现ConsumerRebalanceListener

  

public void onPartitionsRevoked(Collection<TopicPartition> partitions)

     

在重新平衡开始之前和使用者停止使用消息之后调用。这是您要提交偏移量的位置,因此下一个获得此分区的人将知道从何处开始。

来自Kafka the definitive Guide

回答最后一个问题:是的,重新平衡意味着延迟了邮件的使用。