RocketMQ顺序消息


RocketMQ顺序消息

1、什么是顺序消息

顺序消息指的是,严格按照消息的发送顺序进行消费的消息(FIFO)。
默认情况下,生产者会把消息以Round Robin轮询方式发送到不同的Queue分区队列;而消费消息时会从多个Queue上拉取消息,这种情况下的发送和消费是不能保证顺序的。如果将消息仅发送到同一个Queue中,消费时也只从这个Queue上拉取消息,就严格保证了消息的顺序性。

2、为什么需要顺序消息

例如,现在又TOPIC ORDER_STATUS(订单状态),其下有4个Queue队列,该Topic中的不同消息用于描述当前订单的不同状态。假设订单有状态:未支付、已支付、发货中、发货成功、发货失败。

根据以上订单状态,生产者从时序上可以生成如下几个消息:

订单T000001:未支付–>订单T000001:已支付—>订单T000001:发货中—>订单T0000001:发货失败

消息发送到MQ中之后,Queue的选择如果采用轮询策略,消息在MQ的存储可能如下:

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

基于上述情况,可以设计如下方案:对于相同订单号的消息,通过一定的策略,将其放置在一个Queue中。

3、有序性分类

全局有序

当发送和消费参与的Queue只有一个时所保证的有序是整个Topic中消息的顺序,称为全局有序

分区有序

如果有多个Queue参与,其仅可保证在该Queue分区队列上的消息顺序,则成为分区有序

如何实现Queue的选择?在定义Producer时我们可以指定消息队列选择器,而这个选择器是我们自己实现了MessageQueueSelector接口定义的


在定义选择器的选择算法时,一般需要使用选择key。这个选择key可以是消息key也可以是其他数据。但无论谁做选择key,都不能重复,都是唯一的。


一般性的选择算法是,让选择key与该Topic所包含的Queue的数量取模,其结果即为选择出的Queue的QueueId


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值