关于电商项目实现高并发扣减库存优化的实战
背景:
笔者我在中国一家大型手机厂商,做手机电商中台项目。其中涉及,去调用扣减库存接口时,存在热门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条。可以服务退化为一个一个扣减库存。
当扣减异常时,可以回滚设置所以订单请求扣减失败,我们系统中会通过消息队列发给,中台系统做重试。