rocketMQ源码之 似乎并不能严格进行顺序消费

broker定时向namesrv 注册,会告诉namesrv自己的brokername、brokeraddress、topic+队列数量信息等,namesrv会把topic的信息放到topicQueueTable(只有版本号改变才修改,

broker只有topic信息发生改变了才改变版本号)中,同一个topic下,不同brokerName下的QueueData(队列信息)放在一个list里面,当producer这边用getTopicRouteInfoFromNameServer方法获取topicRoute

信息然后用topicRouteData2TopicPublishInfo方法,放到publishInfo中的时候,也确实按照brokerName排序了,所以其messageQueueList是有序的,如果按照官方例子里面订单id取余,

是可以将多条消息有序的发送到同一个队列,consumer用默认的集群模式分好队列,启用MessageListenerOrderly或者每次只取一条,消费完再取,是可以做到顺序消费的。

但是如果在极端情况下比如当前topic下某个broker的队列由4个变为了8个,或者某个broker取消了注册,就有可能导致不能发送到特定的队列上,从而引起顺序消费失败。

ps,brokerName是broker(集群)的标识,集群之间不要重复,应该人为设定

原文地址:https://www.cnblogs.com/chuliang/p/15390959.html