为了保证消息消费的有序性,Rocketmq在发送消息时需要通过MessageQueueSelector指定具体发送的consumerQueue。
顺序消费的事件监听器为 MessageListenerOrderly,表示顺序消费。
在使用时,需求注意以下几点:
1. 消费端为了保证有序消费,在拉取消费和消费消息时,都会在broker端获取queue的锁。如果topic的队列个数小于消费组中消费者的个数,会导致多个消费者消费同一个queue,会频繁的获取queue的锁,释放锁,产生竞争 。因此在使用顺序消费的场景时,应尽量设置较大的topic的队列个数,以减少锁冲突,提升消费性能。
2.并发消费消息时,当消费失败时,会默认延迟重试16次。顺序消费消息时,重试次数为 Integer.MAX_VALUE,而且不延迟。换言之,如果某一条消息消费失败且重试始终失败,将会导致后续的消息无法消费,产生消息的积压。因为顺序消费消息时,一定要谨慎处理异常情况。
3.在topic扩容调整队列个数时,有可能会打乱消息对应的队列,出现部分消息并非顺序消费。