RocketMQ消费模式分为集群消费模式与广播消费模式,生产者产生某个topic的消息后,在集群模式下,topic下的消息可以被同一分组下的多个实例消费掉,一条消息至少被一台实例消费成功便可;广播模式是每条消息必须被分组下的每台实例成功消费,每个实例维护自己的消费进度。
一、集群消费模式
producer在生产消息时会根据负载均衡策略为消息指定队列编号(queueId),消费者在拉取消息时会划定自己的消费队列,目标是消息能够最快被消费调。如消费队列有4个消费队列,queueId分别是0,1,2,3,在consumerGroup中有四个消费实例client0,client1,client2,client3,通过消费负载均衡得到的结果是client0对应queueId是0的队列,client1对应queueId是1的队列,client2对应queueId是2的队列,client3对应queueId是3的队列。因此一个topic下的消息便会通过4台实例消费掉,提高了消费效率。消费负载均衡策略可参照RocketMQ-负载均衡
当某个消费实例不能正常提供服务后,所涉及的消息队列会自动派送给其他消费实例,会按照故障实例的消费进度继续消费,因此broker需要管理每个消息队列的消费进度。RocketMQ的涉及理念是保证消息至少一次送达,因此存在重复消费的可能,只有当消息确定被消费成功后才在broker上更新消费进度。为了提高效率,此模式下broker上的消费进度并不会实时更新,消费实例会定时将消费的进度同步到broker上,因此在原理重复消息的情况就是存在的。
开源的代码中此模式存在一定缺陷,如果使用AllocateMessageQueueAveragely算法做负载均衡,当client1于client4同时消费队列mq1时,由于消费进度只会在启动时从broker获取,后面会顺序拉取消息,如果client1消费速度大于client4消费速度,client4并不会过滤调已经被client1消费过的消息,这种情况下就要考虑消息队列与消费实例之间的负载均衡情况,并不是说消费实例阅读,消费速度越快。

二、广播消费模式
广播消费模式在实现上不会做消费负载均衡,会拉取topic下的所有队列中的消息,每个队列消费进度有消费者自己管理,如果消费节点宕机后重新提供服务,会读取保存在本地的消费进度后继续拉取消息。