再均衡
再均衡是指分区的所属权从一个消费者转移到另一消费者的行为,它为消费组具备高可用
性和伸缩性提供保障,使我们可以既方便 又安全地删除消费组内的消费者或往消费组内添加消 费者。
不过在再均衡发生期间,消费组内的消费者是无法读取消息的。 也就是说,在再均衡发生期间的这一小段时间内,消费组会变得不可用 。另外,当 一个分区被重新分配给另一个消费 者时, 消费者当前的状态也会丢失。
比如消费者消费完某个分区中的一部分消息时还没有来得 及提交消费位移就发生了再均衡操作 , 之后这个分区又被分配给了消费组内的另一个消费者, 原来被消费完的那部分消息又被重新消费一遍,这也是Kafka消息重复消息的一个例子。
为了再均衡发生时候保证系统的稳定,Kafka为我们提供了 ConsumerRebalanceListener用来在在均衡发生的开始和末尾 做一些我们需要做的事情。
ConsumerRebalanceListener是一个接口,包含两个方法:
void onPartitionsRevoked(Collection<TopicPartition> partitions)
这个方法会在再均衡开始之前和消费者停止读取消息之后被调用。可以通过这个回调方法
来处理消费位移 的提交, 以此来避免一些不必要的重复消费现象的发生。参数 partitions 表 示再均衡前所分配到的分区。
void onPartitionsAssigned(Collection<TopicPartition> partitions)
这个方法会在重新分配分区之后和消费者开始读取消费之前被调用 。参数 partitions 表
示再均衡后所分配到的分区 。
实例代码:
public static Properties initConfig() {
Properties props = new Properties();
props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG,
StringDeserializer.class.getName());
props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG,
StringDeserializer.class.getName());
props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, brokerList);
props.put(ConsumerConfig.GROUP_ID_CONFIG, groupId);
return props;
}
public static void main(String[] args) {
Properties props = initConfig()