如何保证RocketMQ顺序消息以及可能出现的问题
文章目录
- 生产端提供了一个接口 MessageQueueSelector
- 如果扩容了怎么保证顺序消费?
- 顺序消息,如果某条失败了怎么办?会不会一直阻塞?
一个用户在电商网站上下订单到交易完成,中间会经历一系列动作,订单的状态也会随之变化,一个订单会产生多条MQ消息,下单、付款、发货、买家确认收货,消费端需要严格按照业务状态机的顺序处理,否则,就会出现业务问题。
我们发现,消息带上了状态,不再是一个个独立的个体,有了上下文依赖关系!
对于这个问题,突然想到HTTP协议,其本身也是无状态的,也就是说前后两次请求没有关联,但有些业务功能有登录要求,那怎么解决?
引入Cookie机制,每次请求客户端额外传输一些数据,来达到上下文关联。
回到MQ的消息顺序问题,我们要如何解决?
答案:各退一步,保证局部有序。
比如上面的电商例子,只要保证一个订单的多条状态消息在同一个分区,便可以满足业务需求,这个方案可以覆盖大部分的业务场景
这里面只需要有一个路由策略组件,由它决定消息该放到哪个分区中!
以 RocketMQ 为例