KafkaConsumer

KafkaConsumer

消费者群组和分区再平衡

一个新的消费者加入群组时,它读取的是原本由其他消费者读取的消息。当一个消费者被关闭或发生崩溃时,它就离开群组,原本由它读取的分区将有群组里的其他消费者来读取。在主题发生变化时,比如加入了新的分区,也将发生重新分配。

分区的所有权从一个消费者转移到另一个消费者,称为再均衡。再均衡期间,消费者无法读取消息,造成整个群组一小段时间不可用。当分区被重新分配给另一个消费者时,消费者当前的读取状态会丢失,有可能还需要去刷新缓存。这样会拖慢整个应用程序。

消费者通过向被指派为群组(消费者群组)协调器的broker发送心跳来维持他们和群组的从属关系以及它们对分区的所有权关系。消费者以正常时间间隔发送心跳,就认为是活跃的,说明它还在读取分区里的消息。消费者会在轮询消息(为了获取消息)或提交偏移量时发送心跳。如果消费者停止心跳时间足够长,会话就会过期,群组协调器认为它已经死亡,会触发一次再均衡。

如果消费者是崩溃停止的,那么群组协调器会等待几秒钟,确认它死亡了才会触发再均衡。在这几秒里,死掉的消费者不会读取分区里的消息。在清理消费者时,消费者会通知协调器它将要离开群组,协调器会立即触发一次再均衡,尽量降低处理停顿。

max.poll.interval.ms

轮询消息的时间间隔,如果超过,会导致broker认为消费者已经崩溃了。这个用来设置可以多长时间不去轮询数据。

分配分区的过程

当消费者要加入群组时,首先它会向群组协调器发送一个JoinGroup请求。第一个加入群组的消费者将成为"群主",群主从协调器那获取群组成员列表,并负责给每一个消费者分配分区。使用一个PartitionAssignor接口的类决定哪些分区应该被分配给哪个消费者。这里有两种分配算法,分配完毕后,群主把分配情况列表发送到群组协调器,协调器再把这些信息发送给所有消费者。每个消费者只能看到自己的分配信息,只有群主知道群里所有消费者的分配信息。

创建消费者
Properties props = new Properties();
props.put("bootstrap.servers", "broker1:9092,broker2:9092");
props.put("group.id", "CountryCounter");
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("value.deserializer","org.apache.kafka.common.serialization.StringDeserializer");
KafkaConsumer<String, String> consumer = new KafkaConsumer<String, String>(props);
订阅主题
consumer.subscribe(Collections.singletonList("customerCountries"));
consumer.subscribe("test.*");
轮询
try {
   
    ConsumerRecords
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值