关于库存扣减方案的思考总结

2024-01-11 10:18

本文主要是介绍关于库存扣减方案的思考总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文:修超

电商业务场景下,核心点主要围绕着用户(买家、卖家)、买家通过个性化的选择卖家商品,最终产生交易行为。整个电商业务流程是相当复杂的。不仅仅体现在业务上也体现在系统上,电商业务主要通过多个模块组成:比如会员、店铺、商品、交易、营销、支付、库存、物流、仓库、调度、风控等。通过各子模块领域的能力交互组合,串联出核心的交易流程。

在整个交易流程中,库存的处理是比较重要的,它包括商品的库存处理、营销权益的库存处理。从生命周期上来看有正向交易的库存扣减、逆向流程的库存回加。

在比如电商的营销场景,经常会遇到一些节日性的大促,比如双十一的红包雨的场景,该场景类似与秒杀,在整点即使上百万的用户同一时间涌入系统争抢红包。但红包本身是有限的,这就要求需要在极端的时间内对红包的数量做正确的扣减,比如每秒扣减200w次。但任何系统、机器都有其物理瓶颈存在。如何既能保证用户顺利领取到红包又不超发就成为一项非常困难的事情。

本文梳理介绍下常见库存的扣减方法

扣减的常用方案

常见的库存方案主要分为如下3种,可根据目前业务的发展情况,系统的能力诉求选择

  • 单库单记录

最常见的做法,主要存在是热点问题(大预算)、性能问题(数据库瓶颈),这种模式是得物之前的做法

  • 分库单记录

通过单库增加到多库,按照库存ID取hash均匀share的方式,提高性能,主要存在热点问题(大预算),目前得物的做法

  • 分布式多记录

库存提前分配到多个桶中,不同用户路由到不同的桶中,主要存在碎片问题、流量不均问题、动态扩容问题

不管哪种方案都是服务于业务的,选择合适的才是最好的。甚至于在个别业务场景下,库存的扣减是可以完全降级的

前面两种方案是相对比较简单的,下文主要介绍下分布式多记录情况下的扣减方案怎么做

分布式扣减方案

如果要支持上百万的TPS指标,整体的方案措施总结可以抽象做到如下三个点:

  1. 采用分片的方式(水平扩展方式解决单点),合理利用集群服务器及db的资源。在整体系统架构上解决单点性能瓶颈问题
  2. 分片后,针对单热点扣减采用一定的手段进行极致的优化(全缓存)
  1. 分片后,流量不均(预算动态分配),碎片(预算动态回收与重新分配)以及分片伸缩问题,通过master分配和slave分配的方式(主、子预算)进行解决

简单的分桶扣减

总结:存在流量不均、碎片、分片伸缩问题

桶集中管理扣减

通过增加扣减策略模块、库存调配模块(集中式管理)、请求调度策略(用户请求动态调度),三个模块的职责如下:

  • 库存策略模块:决定了库存应当如何被发放,将扣减链路中可敢于因素予以抽取,使得库存在扣减过程中能够被系统以及业务影响,从而扣减链路具备足够的扩展性,能够做到跟随业务动态变化
  • 库存调配模块:从新定义了库存分配策略,用于做个性化的按需分配,库存不在是一刀切分配在各个桶中,而是随着发放速率的变大而变大,桶流量越大给分配的库存也就越多。同时该模块实施监控整个发放链路,对库存不足以支撑发放的桶依据规则动态扩容、或者停止该桶的发放
  • 请求调度模块:能够动态调配扣减请求,以保证请求永远能够被路由到有库存的桶执行扣减

库存汇总:

目前得物这边采用的方式是分库和总库双向同步的模式汇总的。其实还有一种做法,可以通过增加“预算调度模块”,用户汇总各分库存的预算实时情况,然后借助缓存体系存入,用于使用场景的准实时读取。

总结

分布式基本是解决高并发库存扣减场景下唯一方案,不论是分桶还是将库存拉到本地执行扣减,都是这一思路。库存数据由集中式切换为分布式一定会带来更高复杂度的问题,而该问题是无法完全解决的,但我们可以采取各种方案尽力去降低该问题出现的概率,或者最大可能缓解该问题的影响面。

库存扣减涉及的技术点较多,包括远程的redis缓存、甚至本地缓存、锁机制、XTS事务,动态路由算法、最终一致性的消息通知等,还是很有技术挑战的。另外在库存扣减的策略上也很多技术的挑战点。比如基于db的扣减,调整为基于缓存的扣减,毕竟db的扣减受分表分库的最大数量限制,调整为通过缓存可以实现质的突破;另外在库存扣减提交上也可是做组提交的缓冲模式,缓冲模式一般在账务系统中是被广泛采用的方案,主要通过合并多次扣减请求,然后统一输入db的方式,这样可以有效降低热点减少锁并法。

此外库存扣减这块,限流、降级、容灾应急(借助分布式配置管理,比如nacos达到动态干预),监控、核对等稳定性运维相关的模块也是必不可少的。

这篇关于关于库存扣减方案的思考总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/594042

相关文章

防止Linux rm命令误操作的多场景防护方案与实践

《防止Linuxrm命令误操作的多场景防护方案与实践》在Linux系统中,rm命令是删除文件和目录的高效工具,但一旦误操作,如执行rm-rf/或rm-rf/*,极易导致系统数据灾难,本文针对不同场景... 目录引言理解 rm 命令及误操作风险rm 命令基础常见误操作案例防护方案使用 rm编程 别名及安全删除

Python实现批量CSV转Excel的高性能处理方案

《Python实现批量CSV转Excel的高性能处理方案》在日常办公中,我们经常需要将CSV格式的数据转换为Excel文件,本文将介绍一个基于Python的高性能解决方案,感兴趣的小伙伴可以跟随小编一... 目录一、场景需求二、技术方案三、核心代码四、批量处理方案五、性能优化六、使用示例完整代码七、小结一、

C#使用Spire.Doc for .NET实现HTML转Word的高效方案

《C#使用Spire.Docfor.NET实现HTML转Word的高效方案》在Web开发中,HTML内容的生成与处理是高频需求,然而,当用户需要将HTML页面或动态生成的HTML字符串转换为Wor... 目录引言一、html转Word的典型场景与挑战二、用 Spire.Doc 实现 HTML 转 Word1

Python中logging模块用法示例总结

《Python中logging模块用法示例总结》在Python中logging模块是一个强大的日志记录工具,它允许用户将程序运行期间产生的日志信息输出到控制台或者写入到文件中,:本文主要介绍Pyt... 目录前言一. 基本使用1. 五种日志等级2.  设置报告等级3. 自定义格式4. C语言风格的格式化方法

使用Python实现Word文档的自动化对比方案

《使用Python实现Word文档的自动化对比方案》我们经常需要比较两个Word文档的版本差异,无论是合同修订、论文修改还是代码文档更新,人工比对不仅效率低下,还容易遗漏关键改动,下面通过一个实际案例... 目录引言一、使用python-docx库解析文档结构二、使用difflib进行差异比对三、高级对比方

Spring 依赖注入与循环依赖总结

《Spring依赖注入与循环依赖总结》这篇文章给大家介绍Spring依赖注入与循环依赖总结篇,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. Spring 三级缓存解决循环依赖1. 创建UserService原始对象2. 将原始对象包装成工

MySQL中查询和展示LONGBLOB类型数据的技巧总结

《MySQL中查询和展示LONGBLOB类型数据的技巧总结》在MySQL中LONGBLOB是一种二进制大对象(BLOB)数据类型,用于存储大量的二进制数据,:本文主要介绍MySQL中查询和展示LO... 目录前言1. 查询 LONGBLOB 数据的大小2. 查询并展示 LONGBLOB 数据2.1 转换为十

Python多线程应用中的卡死问题优化方案指南

《Python多线程应用中的卡死问题优化方案指南》在利用Python语言开发某查询软件时,遇到了点击搜索按钮后软件卡死的问题,本文将简单分析一下出现的原因以及对应的优化方案,希望对大家有所帮助... 目录问题描述优化方案1. 网络请求优化2. 多线程架构优化3. 全局异常处理4. 配置管理优化优化效果1.

MySQL容灾备份的实现方案

《MySQL容灾备份的实现方案》进行MySQL的容灾备份是确保数据安全和业务连续性的关键步骤,容灾备份可以分为本地备份和远程备份,主要包括逻辑备份和物理备份两种方式,下面就来具体介绍一下... 目录一、逻辑备份1. 使用mysqldump进行逻辑备份1.1 全库备份1.2 单库备份1.3 单表备份2. 恢复

redis中session会话共享的三种方案

《redis中session会话共享的三种方案》本文探讨了分布式系统中Session共享的三种解决方案,包括粘性会话、Session复制以及基于Redis的集中存储,具有一定的参考价值,感兴趣的可以了... 目录三种解决方案粘性会话(Sticky Sessions)Session复制Redis统一存储Spr