互联网电商大厂库存系统设计案例讲解

简介: 多人同时买一件商品时(假设库存充足),每个人几乎同时下单成功,给人一种并行感觉。但真实情况, 库存只是一个数值,无论是存在mysql数据库还是redis缓存,减值时都要控制顺序,只能串行来扣减,当然为保证安全性,会设计一些锁控制。

1 库存扣减


14.png

多人同时买一件商品时(假设库存充足),每个人几乎同时下单成功,给人一种并行感觉。但真实情况, 库存只是一个数值,无论是存在mysql数据库还是redis缓存,减值时都要控制顺序,只能串行来扣减,当然为保证安全性,会设计一些锁控制。


1.1 关键技术点

同一个SKU,库存数量是共享


剩余库存要大于等于本次扣减的数量,否则超卖


对同一个数量多用户并发扣减时,要注意并发安全,保证数据的一致性


类似于秒杀这样高QPS的扣减场景,要保证性能与高可用


对于购物车下单场景,多个商品库存批量扣减,要保证事务


如果有 交易退款 ,保证库存扣减可返还


返还的数据总量不能大于扣减的总量

返还要保证幂等

可以分多次返还

1.2 数据库扣减

主要依赖数据库特性,保证扣减的一致性,逻辑简单,开发部署成本低。


1.2.1 依赖的数据库特性

依赖数据库的乐观锁(如版本号或者库存数量)保证数据并发扣减的强一致性

事务,针对购物车下单批量扣减时,部分扣减失败,数据回滚

13.png


最上面会查询当前的剩余库存(可能不准确,但没关系,这里只是第一步粗略校验),前置校验,如果已经没有库存,前置拦截生效,减少数据库写。毕竟读操作不涉及加锁,并发性能高。


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。


所以,数据库扣减方案第一次升级主要针对 库存前置校验 模块的优化,作为前置拦截器,承载流量很大,若将流量全部压到主库,很容易把数据压垮。


考虑数据库架构升级:


12.png


采用了 读写分离 方式,新增加了一套从库,借助mysql自带的数据同步能力。 库存校验时读取从数据库。

目录
相关文章
|
11月前
|
存储 消息中间件 NoSQL
跟着大厂学架构01:如何利用开源方案,复刻B站那套“永不崩溃”的评论系统?
本文基于B站技术团队分享的《B站评论系统的多级存储架构》,解析其在高并发场景下的设计精髓,并通过开源技术栈(MySQL、Redis、Java)复刻其实现。文章深入讲解了多级存储、数据同步、容灾降级等关键设计,并附有完整代码实现,助你掌握大厂架构设计之道。
560 0
|
数据安全/隐私保护
基于PID控制器和四象限DC-DC功率转换器的永磁直流电机速度控制系统simulink建模与仿真
本课题基于PID控制器和四象限DC-DC功率转换器,构建永磁直流电机速度控制系统的Simulink模型并进行仿真。系统包含电流PI控制器、速度PI控制器、四象限DC-DC功率转换器、PWM模块及永磁直流电机五个部分。通过测试工况验证系统性能,核心程序基于MATLAB2022a开发。四象限DC-DC功率转换器支持双向能量流动,可实现电压升压、降压及极性转换,配合PID控制器精确调节电机转速,同时具备制动与能量回收功能,提升系统效率。
基于PID控制器和四象限DC-DC功率转换器的永磁直流电机速度控制系统simulink建模与仿真
|
消息中间件 缓存 运维
|
供应链 NoSQL Redis
库存预占架构升级方案设计 - 交易库存中心
伴随物流行业的迅猛发展,一体化供应链模式的落地,对系统吞吐、系统稳定发出巨大挑战,库存作为供应链的重中之重表现更为明显。近三年数据可以看出:
585 0
|
存储 消息中间件 JSON
DDD基础教程:一文带你读懂DDD分层架构
DDD基础教程:一文带你读懂DDD分层架构
|
存储 人工智能 JSON
云上用ComfyUI,在线三步生成运动海报!
云上用ComfyUI,在线三步生成运动海报!
673 6
|
新零售 存储 供应链
严选库存中心设计实践
严选库存中心设计实践
911 0
|
SQL 关系型数据库 MySQL
(十六)MySQL调优篇:单机数据库如何在高并发场景下健步如飞?
在当前的IT开发行业中,系统访问量日涨、并发暴增、线上瓶颈等各种性能问题纷涌而至,性能优化成为了现时代中一个炙手可热的名词,无论是在开发、面试过程中,性能优化都是一个常谈常新的话题。而MySQL作为整个系统的后方大本营,由于是基于磁盘的原因,性能瓶颈往往也会随着流量增大而凸显出来。
2071 0
|
机器学习/深度学习 数据可视化 PyTorch
利用PyTorch实现基于MNIST数据集的手写数字识别
利用PyTorch实现基于MNIST数据集的手写数字识别
590 2