Kafka消费者组再均衡问题

Kafka消费者组再均衡问题 在Kafka中,当有新消费者加入或者订阅的topic数发生变化时,会触发Rebalance(再均衡:在同一个消费者组当中,分区的所有权从一个消费者转移到另外一个消费者)机制,Rebalance顾名思义就是重新均衡消费者消费。Rebalance的过程如下:第一步:所有成员都向coordinator发送请求,请求入组。...
摘要由CSDN通过智能技术生成

Kafka消费者组再均衡问题

在Kafka中,当有新消费者加入或者订阅的topic数发生变化时,会触发Rebalance(再均衡:在同一个消费者组当中,分区的所有权从一个消费者转移到另外一个消费者)机制,Rebalance顾名思义就是重新均衡消费者消费。Rebalance的过程如下:

第一步:所有成员都向coordinator发送请求,请求入组。一旦所有成员都发送了请求,coordinator会从中选择一个consumer担任leader的角色,并把组成员信息以及订阅信息发给leader。

第二步:leader开始分配消费方案,指明具体哪个consumer负责消费哪些topic的哪些partition。一旦完成分配,leader会将这个方案发给coordinator。coordinator接收到分配方案之后会把方案发给各个consumer,这样组内的所有成员就都知道自己应该消费哪些分区了。

所以对于Rebalance来说,Coordinator起着至关重要的作用,那么怎么查看消费者对应的Coordinator呢,我们知道某个消费者组对应__consumer_offsets中的哪个Partation是通过hash计算出来的:partation=hash("test_group_1")%50=28,表示test_group_1这个消费者组属于28号partation,通过命令:

 

./kafka-topics.sh --zookeeper 192.168.33.11:2181 --describe --topic __consumer_offsets

可以找到28号Partation所对应的信息:

从而可以知道coordinator对应的broker为1

 

在Rebalance期间,消费者会出现无法读取消息,造成整个消费者群组一段时间内不可用,假设现在消费者组当中有A,代码逻辑执行10s,如果消费者组在消费的过程中consumer B加入到了该消费者组,并且B的代码逻辑执行20s,那么当A处理完后先进入Rebalance状态等待,只有当B也处理完后,A和B才真正通过Rebalance重新分配,这样显然A在等待的过程中浪费了资源。

消费者A:

 1 """
 2 consumer_rebalance_a.py a消费者
 3 """
 4 import pickle
 5 import uuid
 6 import time
 7 from kafka import KafkaConsumer
 8 from kafka.structs import TopicPartition, OffsetAndMetadata
 9 from kafka import ConsumerRebalanceListener
10 
11 consumer = KafkaConsumer(
12     bootstrap_servers=['192.168.33.11:9092'],
13     group_id="test_group_1",
14     client_id="{}".format(str(uuid.uuid4())),
15     enable_auto_commit=False,
16     key_deserializer=lambda k: pickle.loads(k),
17     value_deserializer=lambda v: pickle.loads(v)
18 )
19 
20 # 用来记录最新的偏移量信息.
21 consumer_offsets = {}
22 
23 
24 class MineConsumerRebalanceListener(ConsumerRebalanceListener):
25     def on_partitions_revoked(self, revoked):
26         """
27         再均衡开始之前 下一轮poll之前触发
28         :param revoked:
29         :return:
30         """
31         print('再均衡开始之前被自动触发.')
32         print(revoked, type(revoked))
33         consumer.commit_async(offsets=consumer_offsets)
34 
35     def on_partitions_assigned(self, assigned):
36         """
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值