顺序消息

RocketMQ 顺序消息_发送消息


顺序消息指的是消费者消费消息的顺序按照发送者发送消息的顺序执⾏。



生产者去发了多条消息,先发了消息1,然后消息2,最后消息3。消费者在消费消息的时候我们追求的是顺序。对于消费者来说也是一样应该先消费消息1,再消费消息2,再消费消息3。



消费者既可以消费brokera也可以消费brokerb,目前消费者消费的是brokera上面的mytopic1队列msgqueue里面的消息。



在brokera里面主题为mytopic1下面的id为0 msgqueue里面会有三条消息在里面。m1是offset为0的位置,m5是放在offset为1的位置,m6是offset为2的位置。我们期望的是消费1 5 6,这样的就叫做顺序消费。



所谓的顺序消费比较简单就是生产者发送消息的顺序和消费者消费消息的顺序是一致的。生产者生产了1 5 6消费者也消费了1 5 6,这叫做顺序消费。



现在有多个broker,而且在一个topic里面有多个msgqueue,很有可能会出现没有顺序的效果。





 



顺序消息分成两种:局部顺序和全局顺序


局部顺序



局部消息指的是消费者消费某个 topic 的某个队列中的消息是顺序的。消费者使⽤ MessageListenerOrderly类做消息监听,实现局部顺序。



顺序的生产者,顺序生产者发送消息有点讲究,这里没有写nameserver的地址,因为这个可以配置在环境变量里面。


RocketMQ 顺序消息_监听器_02


在最里面5次循环里面都创建了msg对象,所有的消息都发往ordertopictest,tags用于区分消息,keys也是简单区分。

orderid为0的条件下会有5条消息,同理orderid为1的情况下也会有五条消息。 


RocketMQ 顺序消息_监听器_03


在发送的时候有个messagequeueselector,这个参数的作用就是在做选择,选择messagequeue。在选择某个队列。某个broker上面的主题topic默认的带四个队列的。消息到底往哪个队列上面发?

如果不去选择,那么默认会将消息负载均衡到msgqueue上面。也可以指定消息发到某一个队列里面。messagequeueselector就是用于选中某个队列的。

RocketMQ 顺序消息_发送消息_04

第一个参数是当前主题有多少个队列,这个参数不需要你提供,mq会自己拿到所有的队列。上面topic里面有两个broker,每个broker有四个队列,加起来就是有8个队列。也就是在这个方法里面会得到8个队列。

msg参数就是消息参数。

生产者去调用send方法的时候,第二个参数里面的方法是rocketmq去调用的,它会拿到所有broker上面的8个队列。

到底发在哪个队列是由orderid来实现的,id去取模运算,那么就是0-7,那么0-7的数值每个都是index索引。

RocketMQ 顺序消息_环境变量_05

可以看到是有序的存放在队列里面。

顺序消费

消费者从队列的第一个offset进行消费。


consumer . setConsumeFromWhere ( ConsumeFromWhere . CONSUME_FROM_FIRST_


OFFSET );



消费者的订阅,并且不做过滤。



consumer . subscribe ( "OrderTopicTest" , "*" );




这是顺序消费的监听,broker会主动的将消息推送给消费者,推给消费者会触发监听器取出消息。


consumer . registerMessageListener ( new



MessageListenerOrderly () {


RocketMQ 顺序消息_环境变量_06

 启动两个消费者实例,两个消费者都消费其中一部分的消息。


RocketMQ 顺序消息_监听器_07

RocketMQ 顺序消息_发送消息_08