1、Rebalance机制
- 前提:消费者没有指明分区消费;
- 表现:一直有消费者离线
- 触发条件:当topic个数发生变化、消费者组的消费者数量减少/增加、分区增加时,就要重新分配partition的分配,从而使得partition的分配达到平衡状态。
2、消费者消费分区的分配策略
2.1、轮询分配
按照消费者组进行轮询分配,将同个消费者监听的所有主题的所有partition和所有的consumer都列出来,进行轮询。
- 弊端:如果在同一个消费者组内,订阅的消息是不相同的,在执行分区分配的时候不是轮询分配,可能会导致分区分配的不均匀
#实际案例
消费者组:有三个消费者C1,C2,C3,共同订阅了3个主题,t0,t1,t2
topic分区情况:t0一个分区(p0),t1两个分区(p0,p1),t2(p0,p1,p2)
#共同订阅的轮询分配
消费者具体订阅主题情况:3个消费者都订阅t0,t1,t2
轮询分配:C1拿到t0(p0)、t2(p0)/C2拿到t1(p0)、t2(p1)/C3拿到t1(p1)、t2(p2)
#不同订阅的轮询分配
消费者具体订阅主题情况:C1订阅t1,C2订阅了t1,t2,C3订阅了t1,t2,t3
轮询分配方案:C1拿到t0(p0)/C2拿到t1(p0)/C3拿到t1(p1)、t2(p0)、t2(p1)、t2(p2)
2.2、范围分配
按照主题进行分配,如果不平均分配则对每一个Topi而言,前n个消费者会分配多一个分区。
消费者消费分区数目 = (sum/n) + 1
2.3、Sticky
在触发了rebalance后,在消费者消费原分区不变的基础上进行调整
消费者1:消费0,1,2
消费者2:消费3,4
消费者3:消费5,6
#消费者3挂掉后
消费者1:仍消费原分区(0,1,2),新消费分区5
消费者2:仍消费原分区(3,4),新消费分区6
3、Rebalace场景&处理方式
3.1、订阅topic的分区发生变化
(1)业务场景
partition扩容,即增加分区数。
(2)处理方式
-
出现问题:新分区扩容后,consumer并不能自动获取新的分区数,导致数据被写入新的分区,但是没人消费。
-
解决方案:重启服务即可,rrebalace方式具体根据分区分配策略实现。
3.2、订阅的topic个数发生变化
(1)业务场景
新增业务后,新增topic。
(2)rebalance策略
- 同上重启服务。
3.3、消费者组内成员个数发生变化
(1)新成员加入
- 手动操作
(2)组成员离开
- 手动操作
(3)组成员崩溃
-
业务场景:集群抖动、写入热点导致消费消息过慢
-
导致原因:主要心跳超时、消费者处理时间过长,导致rebalance。
-
处理流程:增加消费者处理时间,减少每次处理的消息数。
3.4、原因未知
-
业务场景:日志没问题,but集群多次rebalance
-
解决方案:报警设置&手动重启(重启大法好)