本书未发布

秒杀系统解决超卖

未匹配的标注

前提

秒杀活动一定是高并发的,在那一秒,无数的用户抢购商品,如果我们每个请求过来,都要与数据库进行交互,那么 Mysqt 一定是扛不住的,所从我们的秒杀要基于 redis 来进行。 Redis 单机支撑每秒几万的写入。这样性能不是问题。在我们发布秒杀活动的时候,妥将我们的商品与库存写入 redis 。当用户进行抢购的同时,我们直接对 redis 的库存进行操作。扣减 redis 内库存数量后,发送扣减成功的消.息到消息队列,由后续的订单服务,支付服务之类的进行处理。最后再由 mysql 进行库存扣减。

解决超卖

将库存名领加载到了 Redis,必须要保证精确计数。如果 redis 的库存数量错误,就会导致超卖的问题产生。在秒杀的时候分为两步。
第一步:判断库存名额是否充足。
第二步:减少库存名额,扣减成功就是抢到。
我们必须要保征两种操作的原子性。所从我们要使用 lua 脚本, redis 的特性,专门支持原子。

解决少卖

还有一种情况,我们解决了超卖是防止超过我们的库存量,那么会不会有一种情况是我扣减了库存,但是消息没发出,订单生成失败,导致我没有卖成功呢。我们扣减库存后,发送消息队列,这里要有重试策咯,如果发送消息失败进行重试,超过重试次数后,则要持久化磁盘,由补偿服务来进行扫描,进行后续业务处理。类似于 mysqL 的日志持久化。

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
发起讨论 查看所有版本


暂无话题~