最近在重构以前系统中的库存处理逻辑。 老的系统中库存处理逻辑只是一个类里面的几个方法,同时是直连DB操做,有缓存处理,可是在数据一致性保障上并无特别的可靠。 随着运营投入的愈来愈多,新的运营策略在产品表现上会出现大库存状况,好比引入package的方式,这样原有的库存处理逻辑的QPS就须要变为百倍了,在高峰期对于数据库系统的写QPS是很大的压力,同时系统不能简单的经过机器扩容或者横向扩展解决,因此须要将库存处理逻辑单独到独立的服务系统中进行解决。sql
阿里在数据一致性的处理上采用了数据库方案,固然为处理高并发写入,阿里有能力在数据库角度进行了优化,能够支持高并发写入和事务控制,通常公司不具有这样的技术能力,须要在业务层进行显示控制。数据库
考虑基于DB解决数据一致性问题,首先要解决单点瓶颈和数据过多形成的数据倾斜问题。缓存
同时系统须要考虑单元化场景下的库存扣减逻辑,核心逻辑在于库存扣减是否和用户产生直接关系。网络
因为不具有数据库层面的高并发事务控制,须要在系统层面进行实现。并发
采用乐观锁 整个加锁时间异步
start transaction lock budget record and get its value subtract budget record by insert business orders... commit
经过sql层面更新取代先读后更新逻辑。分布式
SQL优化批量处理 SQL组合在一块儿,和DB一次交互,更新语句保持条件更新,保证更新后余额大于等于0。 SQL添加commit_on_success(减小commit请求网络交互),target_affect_row 1标签。高并发
单个数据库没法支撑高并发写入,考虑“桶拆分”,根据userId进行分桶,子桶配额不足时,路由到主桶。 主桶和子桶按比例分配,子桶适合时机回收。性能
设置分桶阈值,自动分桶,同时基于日志流水(定时任务)进行分桶合并,异步将库存分桶合并到主桶。可下降更新频率,只在合并时发生更新一次,经过定时任务消除分桶碎片,定时任务进行补偿。优化
库存扣减设计到下游多个服务聚合,须要保证事务一致性,在一个下游服务失败后能够主动感知。
基于以上方案重构库存系统服务,单记录(子桶)维持在8kqps,摸高到1w+qps,32个子库压测达30wQPS性能。