互联网电商大厂库存系统设计案例讲解
2023-09-27 14:19:47 时间
1 库存扣减
多人同时买一件商品时(假设库存充足),每个人几乎同时下单成功,给人一种并行感觉。但真实情况, 库存只是一个数值,无论是存在mysql数据库还是redis缓存,减值时都要控制顺序,只能串行来扣减,当然为保证安全性,会设计一些锁控制。
1.1 关键技术点
-
同一个SKU,库存数量是共享
-
剩余库存要大于等于本次扣减的数量,否则超卖
-
对同一个数量多用户并发扣减时,要注意并发安全,保证数据的一致性
-
类似于秒杀这样高QPS的扣减场景,要保证性能与高可用
-
对于购物车下单场景,多个商品库存批量扣减,要保证事务
-
如果有 交易退款 ,保证库存扣减可返还
-
- 返还的数据总量不能大于扣减的总量
- 返还要保证幂等
- 可以分多次返还
1.2 数据库扣减
主要依赖数据库特性,保证扣减的一致性,逻辑简单,开发部署成本低。
1.2.1 依赖的数据库特性
- 依赖数据库的乐观锁(如版本号或者库存数量)保证数据并发扣减的强一致性
- 事务,针对购物车下单批量扣减时,部分扣减失败,数据回滚
最上面会查询当前的剩余库存(可能不准确,但没关系,这里只是第一步粗略校验),前置校验,如果已经没有库存,前置拦截生效,减少数据库写。毕竟读操作不涉及加锁,并发性能高。
2 数据库表
2.1 库存表
create table t_inventory
(
sku_id bigint null comment '商品规格 id',
leaved_amount int null comment '剩余可购买数量'
);
- 当用户取消订单,申请退货、退款,需将数量加回来
- 若商家补库存,需在此基础额外加上增量库存
2.2 流水表
create table t_inventory_flow
(
id bigint auto_increment comment '主键 id'
primary key,
sku_id int null comment '商品规格 id',
order_detail_id mediumtext null comment '订单明细 id',
quantity_trade int null comment '本次购买扣减的数量'
);
- 用于查看明细、对账、盘货、排查问题
- 扣减后,某些场景下做返还,也还依赖流水
2.3 单条商品的扣减SQL
update inventory
set leaved_amount = leaved_amount - #{count}
where sku_id='123' and leaved_amount >= #{count}
乐观锁实现原子性,在 where 条件里判断此次购买的数量≤剩余的数量。在扣减服务的代码,判断此 SQL 的返回值,若:
- 值为 1 ,表示扣减成功
- 否则,返回 0 ,表示库存不足,需回滚
2.4 扣减成功后,记录扣减的流水,并与订单明细记录关联
-
当用户归还数量时,需带回此编号,标识此次返还属于历史上的具体哪次扣减。
-
进行幂等控制。当用户调用扣减接口出现超时,因为用户不知道是否成功,用此编号进行重试或反查。在重试时,使用此编号进行标识防重
3 数据库扣减方案:第一次升级
极端例子:秒杀库存只有5件,活动期间峰值QPS 10W,活动结束后,上面的流水表最终只会插入5条记录,但查询QPS 10W。
所以,数据库扣减方案第一次升级主要针对 库存前置校验 模块的优化,作为前置拦截器,承载流量很大,若将流量全部压到主库,很容易把数据压垮。
考虑数据库架构升级:
采用了 读写分离 方式,新增加了一套从库,借助mysql自带的数据同步能力。 库存校验时读取从数据库。
相关文章
- 入门案例中使用的组件介绍
- NLP-生成模型-2014:Seq2Seq+Attention(首次:利用QKV从大量信息中抽取对任务重要的信息;抽取文档中重要的句子;抽取句子中重要的单词)【案例:AttentionNMT用于翻译】
- SQL Server 截取两个固定字符之间的字符串(案例)
- nginx反向代理以及案例
- 《深入理解Java虚拟机》-----第5章 jvm调优案例分析与实战
- 关于Ruby常用语法案例累积
- 基于Python的课程案例研究系统的设计和实现
- HTML:网页设计案例7
- Solr第二讲——SolrJ客户端的使用与案例
- Linux系统案例精解——存储、Oracle数据库、集群、性能优化、系统管理、网络配置
- MATLABR通信系统建模28个案例
- css案例学习之float浮动
- 基于遗传算法改进的BP神经网络汽车拖拉机外观设计优化,基于GUI的汽车优化系统,BP神经网络详细原理,神经网络1000案例之12
- 案例 01、OpenGL入门--绘制三角形
- 数据挖掘综合应用:房屋售价预测案例
- 第114课:SparkStreaming+Kafka+Spark SQL+TopN+Mysql+KafkaOffsetMonitor电商广告点击综合案例实战(详细内幕版本)
- 《Spark商业案例与性能调优实战100课》第15课:商业案例之纯粹通过DataSet进行电商交互式分析系统中各种类型TopN分析实战详解
- 《Spark商业案例与性能调优实战100课》第13课:商业案例之纯粹通过DataSet进行电商交互式分析系统中特定时段段访问次数TopN
- 《Spark商业案例与性能调优实战100课》第14课:商业案例之纯粹通过DataSet进行电商交互式分析系统中特定时段购买金额Top10 和访问次数增长Top10
- 大数据Spark “蘑菇云”行动补充内容第69课: Spark SQL案例之分析电影评分系统.
- 第一天:Java源码级实战速成(通过动手实战类、对象等,通过Spark和Hadoop案例代码和源码解析具体指知识的应用、深度详解匿名接口在Spark开发中的运用)
- javascript 内置对象字符串总结及案例
- 交通银行系统运维服务云计算案例分享
- 2017系统分析师案例分析真题背记内容
- PgSQL · 应用案例 · 经营、销售分析系统DB设计之共享充电宝
- SQL注入基础原理与案例(详细总结)
- 【原创 Hadoop&Spark 动手实践 13】Spark综合案例:简易电影推荐系统
- p2p视频点播系统开发案例――Myseelite
- 初学 go 入门-案例-教程-记录(16)gin + gorm 两个框架结合做一个简单的小案例(三)依赖注入+增删查改
- 《Drools7.0.0.Final规则引擎教程》番外实例篇——Map使用案例