RocketMQ负载均衡 | 青训营笔记

111 阅读3分钟

这是我参与「第五届青训营 」笔记创作活动的第16天

消费者的负载均衡

一个Topic中的Queue只能有Consumer Group中的一个Consumer进行消费,那么他们之间的配对关系如何确定的,即Queue要分配给那个Consumer进行消费?也就是算法策略,常见有4中策略,这些策略通过创建Consumer时的构造器传进去的。

平均分配策略

计算公式:

avg=QueueCount/ConsumerCount avg=QueueCount/ConsumerCount

若能整除,则按照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中消息的堆积。