共计 620 个字符,预计需要花费 2 分钟才能阅读完成。
用户下完订单到领取实现期间,须要锁定库存避免超卖,如何不依赖数据库,实现较高负载呢?
常见的计划是频繁的读取数据库中的订单,统计总库存占用,查看是否付款超时。如果零碎的负载量较高,这种计划很快将数据库的 CPU 占用达到极限,零碎响应速度迅速下隆。
我在一个我的项目中利用了音讯队列(RabbitMQ)的计划实现的这个需要,分享一下。
简化流程:
下单时,第一步要操作的,就是遍历订单里的商品列表,将商品数量累加到 Redis 库存占用上,避免超卖。
在商品详情页,展现的 商品可用库存 = 商品库存 – 库存占用
第二步操作,将订单写入 MQ 队列,因为订单是按工夫程序写入队列的,所以最先生效的订单肯定是队首的订单。因而,打算工作只须要循环查看队首的订单
如果订单付款工夫未超时,如果还有 50 秒,则休眠 50 秒后持续解决。
如果订单已达到超时工夫,则检醒订单原始状态
如果订单原始状态已非未付款(如已付款,已勾销),则将订单移出队列,解决下一单
如果订单原始状态仍为未付款,则开释库存占用
留神,勾销订单操作须要被动开释库存占用。
打算工作内流程:
在咱们的我的项目中,有一种非凡 VIP 的用户,他们的未付款超时工夫长达 12 小时(普通用户半小时),他们罕用这种形式收费锁定库存,咱们暂不关注这种需要的合理性,零碎如何实现呢?
在 MQ 中加一条队列即可,半小时超时的一个队列,12 小时超时的一个队列
本文原始网址:https://www.liu12.com/article…,转载请保留出处
正文完