消息队列RocketMQ版的消息负载策略针对发布方和订阅方有所差异。对订阅方而言,消息负载策略在一定程度上影响消息堆积。

发布方消息负载均衡策略

消息队列RocketMQ版针对发布方采取的是轮询制,即Producer的消息以轮询的方式发送至Queue,如下图所示。

LVS Policy

图中箭头线条上的标号代表顺序,发布方会把第一条消息发送至Queue 0,然后第二条消息发送至Queue 1,以此类推,第八条消息发送至Queue 7,第九条消息又发送至Queue 0,循环往复。

订阅方消息负载均衡策略

消息队列RocketMQ版包含Broker和Name Server等节点,其中Broker节点负责将Topic的路由信息上报至Name Server节点。

假设目前消息队列RocketMQ版只有一个Broker节点,消息从Producer发送至消息队列RocketMQ版的Topic,默认会将这些Topic下的消息均衡负载至8个Queue(逻辑概念)。消息队列RocketMQ版 Broker会将这些Queue再平均分配至属于同一个Group ID的订阅方集群。

因此,每台订阅方机器处理的Queue的数量有以下几种可能:

  • 若订阅方机器数量大于Queue的数量,则超出Queue数量的机器会处理0个Queue上的消息,如下图所示。Consumer LVS Policy
  • 若订阅方机器数量等于Queue的数量,则每台机器会处理1个Queue上的消息,如下图所示。Consumer LVS Policy
  • 若订阅方机器数量小于Queue的数量,则每台机器会处理多个Queue上的消息,如下图所示。Consumer LVS Policy

如果其中一台机器处理变慢,可能是机器硬件、系统、远程RPC调用或Java GC等原因导致分配至此机器上的Queue的消息不能及时处理;此外,消息队列RocketMQ版的消息负载是按Queue为粒度维护,所以,整个Queue上的消息都会堆积。