当你一个业务系统部署多台机器的时候,每个系统里都启动了一个Consumer,多个Consumer会组成一个ConsumerGroup,也就是消费组,此时就会有一个消费组内的多个Consumer同时消费一个Topic,而且这个Topic是有多个MessageQueue分布在多个Broker上的,如下图所示:
那么现在问题就来了,假设咱们一个业务系统部署在两台机器上,对应一个消费组里就有两个Consumer,那么现在一个Topic有三个MessageQueue,该怎么分配呢?这就涉及到了Consumer的负载均衡的问题了。
在Consumer启动的时候,会初始化几个关键的组件,分别是重平衡组件、消息拉取组件、消费进度组件。其实里面有一个Balancer重平衡组件,就是在这里专门负责多个Consumer的负载均衡的,如下图。
那么这个RebalancerImpl重平衡组件是如何将多个MessageQueue均匀的分配给一个消费组内的多个Consumer的呢?