和Kafka只支持同一个Partition 内的消息的顺序性一样,RocketMQ中的也提供了基于队列(分区)的顺序消费。即同一个队列内的消息可以做到有序,但是不同队列内的消息是无序的!
当我们作为MQ生产者需要发送顺序消息时,需要在send方法中,传入一个MessageQueueSelector。
MessageQueueSelector中需要实现一个select方法,这个方法就是用来定义要把消息发送到哪个MessageQueue的,通常可以使用取模法进行路由:
通过以上形式就可以将需要有序的消息发送到同一个队列中。需要注意的时候,这里需要使用同步发送的方式!
消息按照顺序发送的消息队列中之后,那么,消费者如何按照发送顺序进行消费呢?
RocketMQ的MessageListener回调函数提供了两种消费模式,有序消费模式MessageListenerOrderly和并发消费模式MessageListenerConcurrently。所以,想要实现顺序消费,需要使用MessageListenerOrderly模式接收消息:
当我们用以上方式注册一个消费之后,为了保证同一个队列中的有序消息可以被顺序消费,就要