RocketMQ常见问题-消息有序性

        RocketMQ能做到顺序消费,但是单独依赖RocketMQ做不到消息有序性,保证消息有序性必须进行业务干预。

        通常来讲,顺序消费是指消息的消费顺序和消息的投递顺序保持一致,但是消息有序性是指消息参数的顺序与消息最终的使用顺序保持一致。我之前的观点是消息的生命周期包含消息产生源,消息发送,消息投递,消息消费,消息持久化(业务使用消息)。而实际上RocketMQ只负责了消息发送,消息投递,消息消费这三个阶段,在消息的整个生命周期中如果没有任何干预,当消息产生源产生无序的消息,消息队列(RocketMQ顺序传递),最终消息持久化也必然是无序。

        以上是个人观点,目前来看好像和传统观念不是很相符,如果觉得不能接受请略过。

        举一个经典购物流程下单-结算-支付-完成。当然这是一个正常的流程,
        正常的消费流程:消息产生源依次产生下单,结算,支付,完成四个消息;RocketMQ生产者依次接收四个消息,Broker依次传递四个消息,Consumer依次获取四个消息;消息持久化依次获取四个消息。

 

        正常情况下消息是有序的,但是如果消息产生源无序,或者RocketMQ生产者和Broker之间网络异常,或者Broker和Consumer之间网络异常,或者消息持久化不同阶段处理业务不一样导致四个消息最终不是有序消费呢。重复一下上次的结论,消息传递具有不可靠性,我们不能依赖消息通过传递还能保持预期的效果。那么如何保证消息的业务有序性呢,大家可以一起讨论一下下面的流程结构。在消息源和消息持久化部分,依据消息有序性要求进行流程校验,符合要求则进入下一环节。

       模型里面比较难实现的应该是消息持久化环节需要一个消息有序调整机制,保证无序的消息到达消费持久化环节,在被消费前先正序,当然这个是业务有序性,RocketMQ作为一个消息队列组件,并没有对这部分过多考虑(消费端失败重发机制勉强可以拿来实现消息正序的功能)。

参考资料:《rocketmq客户端消费流程》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值