6 分区再均衡
代码地址:https://github.com/luslin1711/kafka_demo/tree/master/kafka_demo_06
消费者群组里的消费者共同读取主题的分区。一个新的消费者加入群组时,它读取的是原来由其他消费者读取的消息。当一个消费者被关闭或者发生崩溃时,他就离开群组,原本由它读取的分区将由群组里的其他消费者读取。在主题发生变化时,如添加了新的分区,也会发生分区重分配。
分区的所有权从一个消费者转移到另一个消费者,这被称为再均衡。再均衡非常重要,它为消费者群组带来了高可用性和伸缩性。不过在正常情况下,我们不希望发生这样的行为。在再均衡期间,消费者无法读取消息,造成整个群组一小段时间的不可用。另外,当分区被重新分配给另一个消费者时,消费者当前的读取状态会丢失,它有可能还需要去刷新缓存,在它重新恢复状态之前会拖慢应用程序。
一、 再均衡监听器
在为消费者分配新的分区或移除旧的分区时,可以通过消费者API执行一些应用程序代码,在调用subscribe()方法穿进去一个ConsumerRebalanceListener.
import org.apache.kafka.clients.consumer.ConsumerRebalanceListener;
import org.apache.kafka.clients.consumer.OffsetAndMetadata;
import org.apache.kafka.common.TopicPartition;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
public class DefaultRebalanceListener implements ConsumerRebalanceListener {
private Map<TopicPartition, OffsetAndMetadata> currentOffsets = new HashMap<>();
private org.apache.kafka.clients.consumer.Consumer consumer;
public DefaultRebalanceListener(org.apache.kafka.clients.consumer.Consumer consumer) {
this.consumer = consumer;
}
public void put(TopicPartition partition, OffsetAndMetadata offsetAndMetadata) {
currentOffsets.put(partition, offsetAndMetadata);
}
public Map<TopicPartition, OffsetAndMetadata> getCurrentOffsets(