概述
RabbitMQ延时队列(实现定时任务)
场景:比如未付款订单,超过一定时间后,系统自动取消订单并释放占有物品
常用解决方案:spring的schedule定时任务轮询数据库
缺点:消耗系统内存,增加数据库压力,存在较大的时间误差
解决:RabbitMQ的消息TTL的死信Exchange结合
消息的TTL就是消息的存活时间
RabbitMQ可以对队列和消息分别设置TTL:推荐给队列设置过期时间
- 对队列设置就是队列没有消费者连着的保留时间,也可以对每个单独的消息做单独的设置,超过了这个时间,我们认为这个消息就死了,称之为死信;
- 如果队列设置了,消息也设置了,那么会取小的。所以一个消息如果被路由到不同的队列,这个消息死亡的时间有可能不一样(不同队列设置的)
关闭订单的流程(就是给修改订单表的state状态值)
总体RabbitMQ收发消息流程
主要流程:
1、库存锁定,将信息压入延时队列中,延时队列是50min,也可以是40min,自定义即可,如果时间到了,就成了死信队列,通过路由key为stock.releace就发送给交换机,再由交换机发送给解锁库存的队列stock.release.stock.queue,然后由库存服务监听这个队列,进行库存解锁;
2、订单创建成功后携带路由key=order.create.order发送给交换机,再由交换机发送给延时队列,延时时间为30min,如果时间到了,延时队列就变成了死信队列,进而带路由key=order.release.order发送给交换机,由交换机发送给关闭订单的队列order.release.order.queue,订单服务监听此队列进行关单;这样就完成了30min没有支付就关单的功能
关闭订单与解锁库存的一致性
一般来说,设置30min未支付就关闭订单,40min后,检查订单不存在或者被取消,就进行解锁库存,但是如果订单服务卡顿,导致订单状态消息一直改不了,库存消息优先到期。查订单状态新建状态,什么不做就走了导致卡顿的订单,永远不能解锁库存;
解决:可以在关闭订单之后,通过交换机往stock.release.stock.queue解锁库存的队列里面发消息,就可以保证在订单取消后,库存可以解锁;
最后
以上就是美好冥王星为你收集整理的谷粒商城:订单锁库存保证事务最终一致性的全部内容,希望文章能够帮你解决谷粒商城:订单锁库存保证事务最终一致性所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复