分布式消息队列RocketMQ
四、 RocketMQ应用
4.2)顺序消息
4.2.1)什么是顺序消息
顺序消息指的是,严格按照消息的发送顺序进行消费的消息(FIFO)。
默认情况下生产者会把消息以Round Robin轮询方式发送到不同的Queue分区队列;而消费消息时会从多个Queue上拉取消息,这种情况下的发送和消费是不能保证顺序的。
如果将消息仅发送到同一个 Queue中,消费时也只从这个Queue上拉取消息,就严格保证了消息的顺序性。
4.2.2)为什么需要顺序消息
例如,现在有TOPIC ORDER_STATUS(订单状态),其下有4个Queue队列,该Topic中的不同消息用于描述当前订单的不同状态。假设订单有状态:未支付、已支付、发货中、发货成功、发货失败。
根据以上订单状态,生产者从时序上可以生成如下几个消息:
订单T0000001:未支付 --> 订单T0000001:已支付 --> 订单T0000001:发货中 --> 订单 T0000001:发货失败
消息发送到MQ中之后,Queue的选择如果采用轮询策略,消息在MQ的存储可能如下:

这种情况下,我们希望Consumer消费消息的顺序和我们发送是一致的,然而上述MQ的投递和消费方式,我们无法保证顺序是正确的;对于顺序异常的消息,Consumer即使设置有一定的状态容错,也不能完全处理好这么多种随机出现组合情况。

RocketMQ的顺序消息保证了FIFO的消费顺序。通过将消息发送到同一Queue并从该Queue消费,确保消息顺序性。全局有序要求只有一个Queue,而分区有序允许多个Queue但仅保证每个Queue内的顺序。实现选择Queue的策略通常基于MessageQueueSelector接口,利用选择key和Queue数量取模。消费者组内的不同消费者不会同时消费同一个Queue中的消息,确保消费隔离。
最低0.47元/天 解锁文章
851

被折叠的 条评论
为什么被折叠?



