计算广告实时结算超投问题解决方案的分析

计算广告实时结算超投问题解决方案的分析

####1、超投问题应对方案
大流量高并发的实时结算系统会有一个令人十分头疼的问题,就是超投。在广告系统中,结算环节会实时计算各个广告主账户内的余额,如余额为0,既要立刻停止投放。所谓超投,就是指在结算系统发出停止投放的指令到系统实际将广告下线的这段时间内,投放系统错误的将下线广告投放出去。这部分被错误投放的广告是不能向广告主收钱的,也就造成了平台的损失。由于广告系统流量大,系统链路比较长,在广告检索环节又采用了分布式索引,因此一个小的系统RT抖动就可能造成大量损失。
解决超投有两点:一是缩短结算发出下线指令到引擎下线广告之间的RT;二是当账户余额较低时放慢该账户下广告的投放速度,虽然无法避免超投,但是可以大幅度的降低超投造成的损失。本文主要对第二点进行一些分析。
一个比较容易想到的方案是,在广告的检索环节,对在doc对应的表上定义一个多值类型的字段(设字段名称为minratio,可以存放10个数值)。在线投放时,会有一个过滤条件,具体逻辑是每次检索会随机生成一个取值范围为[1,10]的整数,如果一个doc对应的minratio字段的取值包含了这个数字,那么就保留进入后续流程,否则,这个doc会被过滤掉。比如,有一个doc的minratio取值为(1,2,3,4,5,6),随机生成的数字如果是6,那么这个doc就会被保留,如果随机生成的数字是9,那么这个doc就会被过滤掉。一般情况下,这个字段中存放了1~10十个数字,结算系统会根据账户余额不断的调整数字的个数。minratio字段中存放的数字个数决定了这个doc被投放的概率。
但是这里面有一个细节。假设一个doc的投放概率是40%,那么应该在minratio中存放哪四个数字呢?有两个选项:一是按顺序存放,40%即存放(10,9,8,7),如果概率是30%,就存放(10,9,8);二是每次更新的时候随机存放四个数字,比如(2,5,7,9),每次更新数字个数时都会随机生成N个数字。
先看看两种方案会分别带来什么结果。采用第一种方案,如果检索时生成的随机数是10,那么所有的doc都会被检索出来,随机数是9,会有90%的doc会被检索出来,依次类推;采用第二种方案,不管检索时生成的随机数是多少,检索出来的doc的数量是近似相等的,只不过随机数不同,检索出的doc会不同。
####2、方案对比
这两种方案哪个更好呢?下面就来分析一下。设a/10概率投放的doc的数量为D_a,设当检索随机数为x时,检索出来的doc数量为r(x)。
第一种方案: r 1 ( x ) = ∑ i = x 10 D i r_1(x)=\sum_{i=x}^{10}{D_i} r1(x)=i=x10Di
第二种方案: r 2 ( x ) = ∑ i = 1 10 i ⋅ D i 10 r_2(x)=\sum_{i=1}^{10}\frac{i\cdot D_i}{10} r2(

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值