谷粒商城:订单锁库存保证事务最终一致性

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解锁库存的队列里面发消息,就可以保证在订单取消后,库存可以解锁;

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值