消费者组对于消息消费的方式:集群、广播
- pull拉取消费:Consumer主动从Broker拉取消息,实时性较弱。便于控制消息拉取
- push推送消费:Broker收到数据主动推送给消费者。实时性较高。发布-订阅模式,Queue中有消费者注册的监听器,一旦有新消息就会回调执行。这些都是基于消费者与Broker的长链接,需要消耗系统资源。
- 广播模式
每条消息都会发送给消费者。 - 集群模式
消费者平均分摊消息,每条消息只会被发送到消费者组内的某个消费者中。
- Rebalance机制(再均衡)集群消费
一个Topic下的多个Queue在同一个Consumer Group中 的多个Consumer间进行重新分配的过程。提高消息并行能力。
1)限制:队列最多分配给一个消费者,消费者数量大于队列数量时,会有部分消费者分配不到队列。
2)危害:
消费暂停:增加消费者时,其他消费者暂停消费,分配之后再继续消费。
消费重复:新增加的消费者消费队列接着之前的offset进度继续消费。默认情况下,offset是异步提交的,异步性导致提交到Broker的offset与Consumer实际消费的消息并不一致,这个不一致会导致消息消费重复问题。
消费突刺:需要重复消费的消息过多或暂停时间过长,会导致Rebalance结束后瞬间消费很多消息。
3)产生原因:Topic Queue数量发生变化、消费者组中消费者数量发生变化。
例如:Broker或Consumer扩容、缩容、升级;Broker或Consumer与Name Server网络异常;
4)产生过程:Broker中存放两个集合,当前Topic和Consumer的信息,一旦数量发生变化,立即向Consumer Group中的每个实例发出Rebalance通知。存放三个map、一个存放topic、一个存放consumer、一个存放topic与group订阅关系value为queue消费进度。 - Queue分配算法
创建Consumer时通过构造器传入。
1)平均分配策略
avg=QueueCount / ConsumerCount的计算结果如果可以整除,则按顺序将avg个Queue逐个分配给Consumer;不能整除将多余的按照Consumer顺序逐个分配。
2)环形平均策略
根据消费者顺序,依次由Queue队列组成的环形图中逐个分配。
3)一致性hash策略
Consumer 、Queue的hash值放在hash环上,顺时针距离queue最近的consumer就是消费该queue的。会存在消费分配不均匀现象。
4)同机房策略
先按照同机房分、再按照平均或环形平均策略分配,如果没有同机房的,按照平均分配策略分配。
总结:两种平均分配效率较高,涉及到的算法简单。一致性hash策略分配很大程度上存在分配不均匀情况,但很大程度上可以减少由于消费者组扩容或缩容所带来的大量的Rebalance。一致性算法应用场景:Consumer数量变化比较频繁的场景。
- 至少一次原则(每条消费必须要被成功消费一次)consumer消费成功会向消费进度器提交消费消息的offset,offset被成功记录到记录器中,那么这条消息为消费成功。
消费进度器:广播模式下:consumer本身为消费进度器;集群模式下broker为消费进度器。



