这是我参与「第五届青训营 」笔记创作活动的第16天
消费者的负载均衡
一个Topic中的Queue只能有Consumer Group中的一个Consumer进行消费,那么他们之间的配对关系如何确定的,即Queue要分配给那个Consumer进行消费?也就是算法策略,常见有4中策略,这些策略通过创建Consumer时的构造器传进去的。
平均分配策略
计算公式:
若能整除,则按照avg个Queue诸葛分配Consumer,如果不能整除,将多于的Queue按照Consumer顺序逐个分配。
环形平均策略
环形平均算法是指,根据消费者的顺序,以此由Queue队列组成的环形图逐个分配
一致Hash策略
该算法会将consumer的hash值作为Node节点存放到hash环上,然后将queue的hash值也放到hash环上,顺时针方向距离queue最近的那个consumer就是该queue要分配的consumer。
问题:
分配效率较低,容易导致分配不均的情况
优点:
其可以有效减少由于消费者组扩容或缩容所带来的大量的Rebalance。
适合用在Consumer变化较频繁的场景
同机房策略
该算法会根据Queue的部署机房位置和Consumer的位置,过滤出当前相同机房的Queue,然后按照平均分配活环形平均策略对同机房的Queue进行分配,如果没有同机房的Queue,则会按照平均策略或者环形平均策略对所有的Queue进行分配
至少一次原则
每条消息必须要被成功消费一次。
成功消费:即Consumer在消费完消息后会向其消费进度记录器提交其消费消息的offset, offset被成功记录到记录器中
消费进度记录器:广播模式中的Consumer本身,集群模式的Broker
生产者的负载均衡:
对于无序消息,其Queue选择算法,也称为消息投递算法,常见的有两种:
轮询算法
默认选择算法。该算法保证了每个Queue中可以均匀的获取到消息。
该算法存在一个问题:由于某些原因,在某些Broker上的Queue可能投递延迟较严重。从而导致Producer的缓存队列中出现较大的消息积压,影响消息的投递性能。
最小投递延迟算法
该算法会统计每次消息投递的时间延迟,然后根据统计出的结果将消息投递到时间延迟最小的Queue。
如果延迟相同,则采用轮询算法投递。该算法可以有效提升消息的投递性能。
该算法也存在一个问题:消息在Queue上的分配不均匀。投递延迟小的Queue其可能会存在大量的消息。而对该Queue的消费者压力会增大,降低消息的消费能力,可能会导致MQ中消息的堆积。