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

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

相关文章

JavaSE正则表达式用法总结大全

《JavaSE正则表达式用法总结大全》正则表达式就是由一些特定的字符组成,代表的是一个规则,:本文主要介绍JavaSE正则表达式用法的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录常用的正则表达式匹配符正则表China编程达式常用的类Pattern类Matcher类PatternSynta

SQLite3 在嵌入式C环境中存储音频/视频文件的最优方案

《SQLite3在嵌入式C环境中存储音频/视频文件的最优方案》本文探讨了SQLite3在嵌入式C环境中存储音视频文件的优化方案,推荐采用文件路径存储结合元数据管理,兼顾效率与资源限制,小文件可使用B... 目录SQLite3 在嵌入式C环境中存储音频/视频文件的专业方案一、存储策略选择1. 直接存储 vs

SQL中JOIN操作的条件使用总结与实践

《SQL中JOIN操作的条件使用总结与实践》在SQL查询中,JOIN操作是多表关联的核心工具,本文将从原理,场景和最佳实践三个方面总结JOIN条件的使用规则,希望可以帮助开发者精准控制查询逻辑... 目录一、ON与WHERE的本质区别二、场景化条件使用规则三、最佳实践建议1.优先使用ON条件2.WHERE用

SpringBoot服务获取Pod当前IP的两种方案

《SpringBoot服务获取Pod当前IP的两种方案》在Kubernetes集群中,SpringBoot服务获取Pod当前IP的方案主要有两种,通过环境变量注入或通过Java代码动态获取网络接口IP... 目录方案一:通过 Kubernetes Downward API 注入环境变量原理步骤方案二:通过

Springboot3+将ID转为JSON字符串的详细配置方案

《Springboot3+将ID转为JSON字符串的详细配置方案》:本文主要介绍纯后端实现Long/BigIntegerID转为JSON字符串的详细配置方案,s基于SpringBoot3+和Spr... 目录1. 添加依赖2. 全局 Jackson 配置3. 精准控制(可选)4. OpenAPI (Spri

关于跨域无效的问题及解决(java后端方案)

《关于跨域无效的问题及解决(java后端方案)》:本文主要介绍关于跨域无效的问题及解决(java后端方案),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录通用后端跨域方法1、@CrossOrigin 注解2、springboot2.0 实现WebMvcConfig

在Java中将XLS转换为XLSX的实现方案

《在Java中将XLS转换为XLSX的实现方案》在本文中,我们将探讨传统ExcelXLS格式与现代XLSX格式的结构差异,并为Java开发者提供转换方案,通过了解底层原理、性能优势及实用工具,您将掌握... 目录为什么升级XLS到XLSX值得投入?实际转换过程解析推荐技术方案对比Apache POI实现编程

Nginx Location映射规则总结归纳与最佳实践

《NginxLocation映射规则总结归纳与最佳实践》Nginx的location指令是配置请求路由的核心机制,其匹配规则直接影响请求的处理流程,下面给大家介绍NginxLocation映射规则... 目录一、Location匹配规则与优先级1. 匹配模式2. 优先级顺序3. 匹配示例二、Proxy_pa

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

Java实现本地缓存的常用方案介绍

《Java实现本地缓存的常用方案介绍》本地缓存的代表技术主要有HashMap,GuavaCache,Caffeine和Encahche,这篇文章主要来和大家聊聊java利用这些技术分别实现本地缓存的方... 目录本地缓存实现方式HashMapConcurrentHashMapGuava CacheCaffe