关于电商项目实现高并发扣减库存优化的实战

124 阅读2分钟

 关于电商项目实现高并发扣减库存优化的实战

背景:

笔者我在中国一家大型手机厂商,做手机电商中台项目。其中涉及,去调用扣减库存接口时,存在热门sku商品扣减时,对数据库更新数据操作压力过大。希望通过扣减请求累积的情况去批量扣减处理。

可以将扣减库存,优化为批量扣减库存,维护SKU维度队列一个线程来管理,每次扣减10~100来优化性能,减少数据库的io操作。

系统中实现:

基于juc包阻塞队列,实现生产者消费者模式,当队列大小等于10,从队列中取10条数据批量扣减数据库。

可以设置过期时间1s,当超时发生是去扣减,就算队列不满足10条数据。

3:一个队列,一个消费线程,多个生产者

建立:sku=iPhone15-128G-黑色

同sku订单:blockQueue =[a1,a2,a3]

多个生产者线程:

可以put订单到queue中。同sku落在同一个queue中。在队列中累积

一个消费线程处理

从队列中获取数据,poll(10,1s)每次扣减10条,过期时间1秒。

本地事务,去批量扣减库存,写入扣减日志,更新缓存库存数(java&redis)

使用实现,thread+completetableFutrue

+LinkedBlockingQueue(1000)

注意

小心库存不足以,扣减时的操作。如库存只有9,但要扣减10条。可以服务退化为一个一个扣减库存。

当扣减异常时,可以回滚设置所以订单请求扣减失败,我们系统中会通过消息队列发给,中台系统做重试。