库存优化专题
markdown
# 库存优化专题 - 开放平台技术部
## this is T2
```
空间
人员
创建 创建
快速搜索
帮助
各空间管理员信息
E编辑 F收藏 观看 S分享
页面/…/ 性能优化专题
跳到banner的尾部
回到标题开始
库存优化专题
转至元数据结尾
由 创建, 最后修改于十月 12, 2019
转至元数据起始
背景
名词解释
整体思路
表结构设计
冻结库存调整
开启热点商品
关闭热点商品
归还库存
参考
背景
目前交易下单流程中,主要有下订单、冻结优惠券、冻结库存操作,其中冻结库存由于受限于单行行锁的原因,只能支持极限 600 TPS。
在可预见的未来,冻结库存将会成为下单流程中的瓶颈,所以承需解决库存性能瓶颈,提高整体下单的 TPS,保障未来业务的稳定高速发展
名词解释
下单过程中库存主要以商品 sku 维度来进行冻结
普通商品:下单扣库存并发不高的商品
秒杀商品:库存比较少,下单扣库存并发高的商品
热点商品:库存比较多,下单扣库存并发高的商品(库存超过 1W 以上)
秒杀商品与热点商品区别在于秒杀商品很快就会将库存扣减为0,且之后就不会再有扣库存请求了,没有必要进行热点分片。所以,下文讨论主要讨论热点商品。
整体思路
冻结库存主要分为两步 :插入幂等日志和冻结 sku 库存。其中性能单点就是下面冻结 sku 库存 update 语句,由于同时更新一条记录,受限于 MySQL 行锁,只能支持 600 TPS 。
1. 开启事务
start transaction
2. 插入幂等操作日志
insert stock_log
3. 冻结 sku 库存
update sku_item set frozen_stock = frozen_stock + 1, available_stock = available_stock -1 where available_stock > 0
4. 关闭事务
end transaction
针对 update 瓶颈其实为 I/O瓶颈,解决方法主要两种:
增加 IO 设备 (分散读写记录)
减少 IO 次数(批量一次性提交)
在热点商品场景下,初步思路采用水平拆分分片的思路来分散热点数据。原先单条 sku 记录拆分成主 sku 记录(sku_item)和分片 sku 记录表(sku_sharding)
表结构设计
sku_item:sku 主表添加 is_hot 字段,当 is_hot 变为 1 时,表明该 sku 为热点商品,部分库存数量平均分摊到 sku_sharding 表中
sku_item(sku 主表)
自增id sku_id stock frozen_stock is_hot
1 10000 100 0 1
sku_sharding:sku 分片表,其中 sharding_id 为分片 id ,默认分片为 4 个分片,具体分片数量可以根据实际数据评估,为了减少一次查询消耗,暂不采用库存分片记录表,来路由到对应 分片数据。同时,后续热点商品较多,可以通过 sku_id 来讲分片表进行拆分。
sku_sharding(sku 分片表)
自增id sku_id stock frozen_stock sharding_id
1 10000 11 0 0
2 10000 10 0 1
3 10000 10 0 2
4 10000 10 0 3
冻结库存调整
zhi q
整体操作流程如下
通过 sku_id 查询 sku_item 是否是热点商品
如果不是,直接沿用现有冻结库存流程
如果是的,先开启事务,插入幂等操作记录,通过计算 hash( mid + timestamp )% 4 值获取对于 sku sharding id
根据 sku_id 和 sharding_id ,冻结扣减对于 sku_sharding 中记录
如果冻结失败,说明 sku_sharding 表中库存不足。再扣减 sku_item 主表里面库存,根据冻结结果,返回给前端结果
如果冻结成功,直接关闭事务,返回前端数据
开启热点商品
运营根据活动商品数量(sku 大于 1W) 和热度来判断是否开启热度商品。
库存数量分配规则如下:假设库存数量为 10001 个,通过算法平均分成 5 份 (默认 4 个分片 + 主分片),其中多余的库存,全部加入到主分片中,具体主表与分片表记录分配如下
sku_item(sku 主表)
自增id sku_id stock frozen_stock is_hot
1 10000 2001 0 1
sku_sharding(sku 分片表)
自增id sku_id stock frozen_stock sharding_id
1 10000 2000 0 0
2 10000 2000 0 1
3 10000 2000 0 2
4 10000 2000 0 3
关闭热点商品
冻结分片库存中,当出现下面两种情况,我们就需要进行调整分片库存
分片表中库存等于 0 :当出现某个分片库存等于 0 的时候,说明分片表中库存偏少,对于冻结少量库存的时候,会出现冻结不成功的情况
总分片库存小于 100 :现在单 sku 单次冻结个数上限为 99 ,当用户总库存小于 100 的时候,进行冻结 99 个分片库存肯定不足
调整库存主要流程包括:回收分片中碎片库存到主表和关闭热点标记。具体触发方式采用定时任务每 3 秒跑一次,具体流程如下
归还库存
当时出现超时未支付或者退款的订单时 ,默认归还到主表库存记录中
参考
考拉库存热点分片扣库存技术实现:https://zhuanlan.zhihu.com/p/45090981
大促场景下热点数据写(库存扣减)技术难题解决方案:https://www.iteye.com/blog/gao-xianglong-2400106
```
Comments
Post a Comment