RocketMQ可以保证queue的消息顺序。
如果希望保证消息顺序,可以这怎么做:
(1)Producer对于需要顺序的消息发送到同一个queue中
(2)Consumer使用MessageListenerOrderly来对消息进行有序消费
代码示例在之前写过:https://blog.csdn.net/lblblblblzdx/article/details/87939187
接下来以push模式为例,详细分析消息流转的整个过程,是如何保障消息在经过多次流转后仍保持有序的。
1. Producer同步发送
对于需要有序的消息
- 需要选择同一个queue,因为RocketMQ只保证queue的局部有序,无法保证topic的消息有序。
- 需要等待上一个发送成功,收到成功的回复后,才可以发送下一个。
2. broker接收消息并落盘
broker底层使用netty,对于同一个连接,均会使用同一个线程来处理其I/O请求,在读取到RequestCommand后,会交给业务线程池异步处理,业务线程会将消息取出并且存储到commitLog中。
可以看出broker是会异步处理消息的,所以第一步中的Producer必须等待上一个消息完全成功后,才允许发送下一个,否则会导致在broker落盘的环节无序。
此时,依然可以保证commitLog中的消息是有序的。