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

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

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

高效+灵活,万博智云全球发布AWS无代理跨云容灾方案!

摘要 近日,万博智云推出了基于AWS的无代理跨云容灾解决方案,并与拉丁美洲,中东,亚洲的合作伙伴面向全球开展了联合发布。这一方案以AWS应用环境为基础,将HyperBDR平台的高效、灵活和成本效益优势与无代理功能相结合,为全球企业带来实现了更便捷、经济的数据保护。 一、全球联合发布 9月2日,万博智云CEO Michael Wong在线上平台发布AWS无代理跨云容灾解决方案的阐述视频,介绍了

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

git使用的说明总结

Git使用说明 下载安装(下载地址) macOS: Git - Downloading macOS Windows: Git - Downloading Windows Linux/Unix: Git (git-scm.com) 创建新仓库 本地创建新仓库:创建新文件夹,进入文件夹目录,执行指令 git init ,用以创建新的git 克隆仓库 执行指令用以创建一个本地仓库的

二分最大匹配总结

HDU 2444  黑白染色 ,二分图判定 const int maxn = 208 ;vector<int> g[maxn] ;int n ;bool vis[maxn] ;int match[maxn] ;;int color[maxn] ;int setcolor(int u , int c){color[u] = c ;for(vector<int>::iter

整数Hash散列总结

方法:    step1  :线性探测  step2 散列   当 h(k)位置已经存储有元素的时候,依次探查(h(k)+i) mod S, i=1,2,3…,直到找到空的存储单元为止。其中,S为 数组长度。 HDU 1496   a*x1^2+b*x2^2+c*x3^2+d*x4^2=0 。 x在 [-100,100] 解的个数  const int MaxN = 3000

状态dp总结

zoj 3631  N 个数中选若干数和(只能选一次)<=M 的最大值 const int Max_N = 38 ;int a[1<<16] , b[1<<16] , x[Max_N] , e[Max_N] ;void GetNum(int g[] , int n , int s[] , int &m){ int i , j , t ;m = 0 ;for(i = 0 ;

JavaFX应用更新检测功能(在线自动更新方案)

JavaFX开发的桌面应用属于C端,一般来说需要版本检测和自动更新功能,这里记录一下一种版本检测和自动更新的方法。 1. 整体方案 JavaFX.应用版本检测、自动更新主要涉及一下步骤: 读取本地应用版本拉取远程版本并比较两个版本如果需要升级,那么拉取更新历史弹出升级控制窗口用户选择升级时,拉取升级包解压,重启应用用户选择忽略时,本地版本标志为忽略版本用户选择取消时,隐藏升级控制窗口 2.