1 消费者负载均衡
消费者从Apache RocketMQ获取消息消费时,通过消费者负载均衡策略,可以将主题内的消息分配给指定消费者分组中的多个消费者共同分担,提高消费并发能力和消费者的水平扩展能力。
1.1 背景信息
了解消费者负载均衡策略,可以解决以下问题:
1、消息消费处理的容灾能力:根据消费者负载均衡策略,明确当局部节点出现故障时,消息如何进行消费重试和容灾切换。
2、消息消费的顺序性机制:通过消费者负载均衡策略,可以进一步了解消息消费时,如何保证同一消息组内消息的先后顺序。
3、消息分配的水平拆分策略:了解消费者负载均衡策略,可以明确消息消费压力如何被分配到不同节点,有针对性的进行流量迁移和水平扩缩容。
1.2 广播消息和共享消费
在Apache RocketMQ领域模型中,同一条消息支持被多个消费者分组订阅,同时,对于每个消费者分组可以初始化多个消费者。可以根据消费者分组和消费者的不同组合,实现以下两种不同的消费效果:

消费组间广播消息:如上图所示,每个消费者分组只初始化唯一一个消费者,每个消费者可消费到消费者分组内的所有的消息,各消费者分组都订阅相同的消息,以此实现但客户端级别的广播一对多推送效果。该方式一般可用于网关推送、配置推送等场景。
消费组内共享消费:如上图所示,每个消费者分组下初始化了多个消费者,这些消费者共同分担消费者分组内的所有消息,实现消费者分组内流量的水平拆分和负载均衡。该方式一般可用于微服务解耦场景。
1.3 什么是消费者负载均衡
如上文所述,消费组间广播消费场景下,每个消费者分组内只有一个消费者,因此不涉及消费者的负载均衡。
消费组内共享消费场景下,消费者分组内多个消费者共同分担消息,消息按照哪种逻辑分配给哪个消费者,就是由消费者负载均衡策略决定的。
根据消费者类型的不同,消费者负载均衡策略分为以下两种模式:
消息粒度负载均衡:PushConsumer和SimpleConsumer默认负载策略。
队列粒度负载均衡:PullConsumer默认负载策略
1.4 消息粒度负载均衡
使用范围
对于PushConsumer和SimpleConsumer类型的消费者,默认且仅使用消息粒度负载均衡策略。
【注意】上述说明是指5.0 SDK,PushConsumer默认使用消息粒度负载均衡。
策略原理
消息粒度负载均衡策略中,同一消费者分组内的多个消费者将按照消息粒度平均分摊主题中的所有消息,即同一个队列中的消息,可被平均分配给多个消费者共同消费。

如上图所示,消费者分组Group A 中有三个消费者A1 A2 和A3 ,这三个消费者将共同主题中同一队列Queue1的多条消息。注意 消息粒度负载均衡策略保证同一个队列的消息可以被多个消费者共同处理,但是该策略使用的消息分配算法结果是随机的,并不能指定消息被哪一个特定的消费者处理。
消息粒度负载均衡机制,是基于内部的单条消息确认语义实现的。消费者获取某条消息后,服务端会将该消息加锁,保证这条信息对其他消费者不可见,直到该消息消费成功或消费超时。因此,即使多个消费者同时消费同一队列的消息,服务端也保证消息不回被多个消费者重复消费。
顺序消息负载机制
在顺序消息中,消息的顺序性指的是同一消息组内的多个消息之间的先后顺序。因此,顺序消息场景下,消息粒度负载均衡策略还需要保证同一消息组内的消息,按照服务端存储的先后顺序进行消费。不同消费者处理同一个消费组内的消息时,会严格按照先后顺序锁定消息状态,确保同一消息组的消息串行消费。

如上图所示,队列Queue1中有4条顺序消息,这4条信息属于同一消息组G1,存储顺序由M1到M4。在消费过程中, 前面的消息M1 M2被消费者ConsumerA1处理,只要消费状态没有提交,消费者A2是无法并行消费后面的M3 M4消息的,必须等前面的消息提交消费状态后才能消费后面的消息。
策略特点
相对于队列粒度负载均衡策略,消息粒度负载均衡策略有以下特点:
1、消费分摊更均衡:对于传统队列级的负载均衡策略,如果队列数量和消费者数量不均衡,则可能会出现部分消费者空闲,或部分消费者处理过多消息的情况。消息粒度负载均衡策略无需关注消费者和队列的相对数量,能够更均匀的分摊消息。
2、对非对等消费者更友好:在线上生产环境中,由于网络机房分区延迟、消费者物理资源规格不一致等原因,消费者的处理能力可能会不一致,如果按照队列分配消息,则可能出现部分消费者消息堆积、部分消费者空闲的情况。消息粒度负载均衡策略按需分配,消费者处理任务更均衡。
3、队列分配运维更方便:传统基于绑定队列的负载均衡策略必须保持队列数量大于等于消费者数量,以免产生部分消费者获取不到队列出现空转的情况,而消息粒度负载均衡策略则无需关注队列数量。
适用场景
&

最低0.47元/天 解锁文章
1066

被折叠的 条评论
为什么被折叠?



