Rocketmq在顺序消费时,为了保证消息消费的有序性,使用了加锁机制,即对messageQueue进行全局加锁,其实现原理可参考源码分析RocketMQ顺序消息消费实现原理,本节不作源码分析,重点在解答为什么要全局加锁。不少文章给出的原因是:当topic的队列个数小于消费组中消费者的个数,会导致多个消费者消费同一个queue,存在竞争。但是查看AllocateMessageQueueStrategy的实现源码,发现topic的队列个数小于消费组中消费者的个数时,会导致超出个数的消费者无队列可消费,即负载不均衡,但并不会出现多个消费者争抢消费同一个消费队列的情况。具体可参考AllocateMessageQueueAveragely的实现。
@Override
public List<MessageQueue> allocate(String consumerGroup, String currentCID, List<MessageQueue> mqAll,
List<String> cidAll) {
if (currentCID == null || currentCID.length() < 1) {
throw new IllegalArgumentException("currentCID is empty");
}
if (mqAll == null || mqAll.isEmpty()) {
throw new IllegalArgumentException("mqAll is null or mqAll empty");
}
if (c