一、背景
库存模块是一个更新数据库密集型的模块,无时无刻不在有库存更新操作,虽然目前线上库存使用了独立Oracle数据库,已经满足短期内的业务使用,但是随着考拉业务的持续增长,数据库性能瓶颈不容忽视,其中数据库对同一行记录的热点更新更是迫在眉睫。
因此库存实现了一套针对热点商品扣库存的分片方案,虽然目前还未使用到,但是作为一项技术储备,对于未来可能的考拉业务爆发增长提供了一项保障。
二、热点商品定义与发现
普通商品:下单扣库存并发不高的商品;
秒杀商品:库存比较少,下单扣库存并发高的商品;
热点商品:库存比较多,下单扣库存并发高的商品。
区分秒杀商品与热点商品的意义在于,秒杀商品很快就会将库存扣减为0,且之后就不会再有扣库存请求了,没有必要进行热点分片,因此下文讨论的热点商品分片不包括秒杀商品。
怎么发现热点商品呢,可以通过下面四种方式来确定,当然并没有全部实现:
1、(已实现)运营提供,大促前找运营过促销方案时,发现热点商品,提前配置热点商品白名单;
2、(已实现)统计下单流水,统计最近一段时间下单流水,找出其中频繁扣减库存的热点商品记录;
3、(暂未实现)统计最近一段时间购物车TOP商品,交易链路提供;
4、(暂未实现)统计最近一段时间商品详情页访问TOP商品。
三、热点商品分片技术方案
1、库存分片记录表,同时开启热点会在库存表有个是否热点字段来标识
image2、分片库存与分片数量调整流程
热点分片的原理是将原来的一条记录拆分成多条记录,下单扣库存随机扣减不同的记录,以提升单商品扣库存性能上限。那么存放在原有库存表中的记录称之为主分片记录,在分片表生成多条记录称之为次分片记录,也叫分片记录;将主分片的可售库存分配到分片表,这时会扣减掉主分片的前台库存字段,以防止产生超卖。
目前系统配置分片数量至少为2个,因为如果只有1个分片的话对性能提升无帮助,最大分片数量为10个,每个分片库存(包括主分片)至少为100个库存,如果不能达到这些要求,则不会进行库存分片。
分片库存与分片数量的确定:
3、数据一致性保证
从主分片分配库存到分片表以及从分片表回收库存到主分片都会通过数据库事务保证数据一致性;
service层以及外部通过dubbo接口查询库存时,会在Dao层直接将分片库存加到前台库存上,这样上层代码感知不到分片库存的存在;
进销存增加库存或者取消订单加库存,直接将库存加到主分片记录上,也不感知分片;
盘亏库存或者虚拟组合库存拆组,如果检测到热点分片库存,则会从Dao层向上抛出异常降级本次操作。
四、热点商品开启与关闭
1、开启热点定时任务通过执行【热点商品发现】确定热点商品范围,并排除热点黑名单记录,对于未开启热点且可售库存满足分片数量要求的进行库存分片的初始化与分配。
2、关闭热点定时任务检查热点黑名单配置,然后回收分片库存,并关闭库存表热点记录标。
3、调整分片库存定时任务遍历所有热点商品,检查分片库存与主库存,如果分片库存已经减少到了30%则会自动触发库存分配,同时会考虑分片数量,如果分片数量过多则会回收库存比较少的分片库存。
五、下单扣分片库存与分片库存准实时调整
下单扣库存流程:
1、下单前查库存,因前台库存字段是主分片和此分片的库存之和,因此原有逻辑不需要改变,库存不足时直接提示库存不足
2、扣库存时检查主分片热点标有没有开启,如果没有开启,则走原扣减逻辑,直接扣减主分片库存
3、对于开启热点标的记录,会同时将分片库存明细查询出来,随机挑选一个库存足够的此分片进行库存扣减
4、如果没有没有次分片库存足够,则检查主分片是否足够,如果主分片库存足够则扣减主分片库存
5、如果所有分片均不够,则同时扣减多个分片库存
6、扣减分片库存按分片ID固定顺序扣减,保证不发生死锁问题,如果扣减某一个分片库存时数据库返回不足时,会将该次扣减放在主分片上尝试扣减一次,减少因分片库存并发不足但是主分片库存足够的情况下的下单失败
下单扣库存后准实时调整分片库存:
1、热点分片扣库存后异步启动线程触发一次分片库存调整
2、如果分片有库存,且至少一个分片库存大于30个库存,则不进行分片库存调整
3、如果所有的分片库存均小于30个库存,则尝试触发一次分片调整,不过这时候会使用分布式锁保证一个商品只有一台机器进行调整,且3秒内一个商品只会触发1次分片库存调整,防止雪崩
4、如果库存还有,则尝试进行分片库存分配,如果库存不多,则此时会尝试关热点
六、性能压测结果(引用压测组压测数据)
测试环境:
- inventory部署云主机,机器配置:6核8G,数据库使用性能环境数据库
数据模型:
- 选取热点商品、非热点商品数据进行压测
性能数据:
image结论:
- 因进行热点分片开发时同时进行了下单扣库存的优化,优化后扣减同一非热点商品库存性能为1800TPS,比优化前的700收益了1100TPS;
- 扣减同一热点商品库存性能为5700TPS,热点方案性能收益大于3倍;
- 因目前非热点商品TPS较之前明显提升,顾库存数量小于2000或扣减同一商品并发不大时,不建议开启热点分片;因目前同一分片性能为5700,单个分片支持1600,所以分片数建议不要设置过大;
七、仍然存在问题
商品开启热点后会自动降级掉自动拆组库存和进销存盘亏业务,因此不可长时间开启热点分片功能
网友评论