拉菲
拉菲2分桶库存介绍及配置方法
分桶库存介绍
分桶库存用于解决db单行扣减无法支撑较大qps扣减的问题,目前集团db,在顶配情况下,实验理论单行可扣减峰值为10w/s。分桶库存理论上可支撑更高不封顶的发放峰值
分桶具体实现
可参考文档:https://yuque.antfin-inc.com/docs/share/b066f7ff-93d0-4128-a541-3a80bebfaf98
分桶配置方式
分桶配置的调整,首先需要权益正常保存,然后编辑权益才可以看到配置页面,具体页面如下
image.png
里面有4个参数需要填写,分桶个数、桶回源比例、回源补偿、桶下线阈值4个。
首先介绍一下概念,4个参数的具体含义如下:
分桶个数:是指需要多少个桶,即用户会被均匀分布到多少个桶里,目前单桶可支撑最大2w/s的扣减发放
桶回源比例:即每个桶发放到一定比例x%的时候,回源中心再拉取一部分库存回来
回源步长:指每次回源中心要拉取多少库存出来,这里的单位要区分下库存类型,像红包这样的,需要填分为单位,比如99元则需要填写9900,像优惠券这样的,那就是张数,比如5000张
桶下线阈值:这个是指当桶内还剩多少库存的时候,需要下线这个桶,此用于解决库存碎片问题,库存碎片问题下文会解释
分桶个数
分桶个数与业务的qps以及库存深度强相关,此处有2个关键信息需要同时照顾到,一个是qps,一个是库存深度。
先讲qps维度,比如业务需求发放20w/s,上文讲我们单桶可支撑2w/s的扣减发放,那么至少需要20/2=10个桶,一般建议再上浮一点保险,此处建议桶个数为2的整数次方,10个向上浮动最近的2的整数次是16次,即16个桶
再讲库存深度维度,比如用户需要发红包20亿,那么库存扣减总深度就是20亿*100=2000亿(底层库存扣减是单位下的最细力度,金额的最细力度是分,所以元要转换为分,而如果权益是优惠券这种张数的,则不需要x100,因为它的最小力度就是个,比如1000w张库存深度,那库存扣减总深度就是1000w),而权益平台本身实现上有一个限制,单桶最大可支撑库存扣减深度为20亿,那么就需要2000亿/20亿=100个桶,此处仍然建议桶个数为2的整数次方,则需要128个桶
重要:两种方式计算完毕后,取最大值
举例:业务方库存深度为100w,qps为5w,则qps维度计算需要5w/2w=2.5个桶,库存深度维度计算100w/20亿=1个桶,2.5以及1之间两者取最大值为2.5,然后上浮为2的整数次,为4个桶
回源比例
回源比例这个与业务场景强相关,一般建议40%-50%,即库存发到一半的时候就回源去补充桶库存。
这里配置低的坏处是回源比例低,就代表桶内预占数量变多,而桶内预占数量变多,会导致可释放库存变少,因为分桶库存模式下,可释放的库存是db里还未配置进分桶的库存
回源步长
回源步长是指,一旦桶库存发放的数量超过了桶的回源比例(如40%),则回源到中心再拉取x个库存放入分桶用于扣减。步长的计算与回源比例、qps、桶个数强相关,此步计算较为关键,也较为复杂
计算公式一般建议如下,里面5个参数,qps、sec、回源比例、桶个数:
qps扣减平均大小sec秒 /(1-回源比例)/桶个数
qps是指发放的qps大小,比如10000/s
sec是指秒,是指库存回源一次需要够发多久的,一般建议5s及以上,即 sec>=5
扣减平均大小,是指秒级扣减的值大小,这个值针对优惠券这些都是1,而对于红包这样的面额,则是红包的平均发放值,比如3元,则为300
回源比例,即上文讲的回源比例
桶个数即上文计算得的桶个数
举例:
某业务发红包,预计发放峰值qps为3w,红包平均面额为10元,桶回源比例设置为40%,前面计算桶个数为4个桶,则回源步长大小为
30000 * 1000(10元) * 5(5s) / (1-0.4(40%回源比例)) / 4 = 62500000(分)
某业务发品类券,预计发放峰值qps为3w,桶回源比例设置为40%,前面计算桶个数为4个桶,则回源步长大小为
30000 * 1(1个) * 5(5s) / (1-0.4(40%回源比例)) / 4 = 62500(个)
桶下线阈值
桶下线阈值是指桶内还剩多少库存的时候就需要下线这个桶,用于解决库存碎片问题。如果是优惠券等个数库存的,直接填0即可,因为优惠券这些不存在碎片的问题。如果是红包这些权益,则需要填红包的最大面额*100,以防止出现碎片。
计算可参考公式
https://lafite2.alibaba-inc.com/lafite2_v2/benefit/inventory/bucket?entry=index
附录
碎片库存
碎片库存是指不够一次发放,但是又发不到0的库存。
比如红包最小要发3元,而桶内只有2.5元,不够发但是又不为0的库存
这类库存是无法使用的死库存。