场景
当有一个业务需要监听订单创建和订单修改的消息 正常消费顺序肯定是需要先消费订单创建的消息 再消费订单修改的消息 不过也可能因为网络和mq投递速度的关系 导致订单修改的消息先发送到消费方 这就导致顺序乱了
异步命令组件如何做到顺序消费
https://github.com/bojiw/asyncmd
- 收到订单创建的消息
- 把消息内容放到异步命令对象中先保存到表中 然后返回给mq已经成功处理消息
- 然后组件会执行对应的异步命令执行器 可以把具体的业务写入到这个执行器中
上面的是正常使用 而要做到顺序消费 再异步命令对象中有关联业务id(rely_biz_id)字段
- 收到订单修改的消息
- 把消息内容放到异步命令对象中并且设置rely_biz_id为订单创建消息的业务id
- 保存到表中
- 执行的时候组件会先通过rely_biz_id查询是否有订单创建的消息已经成功消费并且也已经处理了对应的业务
- 如果订单创建的对应业务没有处理 则不执行
- 等订单创建的对应业务处理成功 则会执行订单修改的异步命令执行器处理业务
具体代码案例
https://github.com/bojiw/asyn-springboot-demo
OrderCreateListener和OrderModifyListener实现mq的顺序消费 保证同一笔订单肯定先处理订单创建消息 再处理订单修改消息