广告超投动态控制系统设计

背景

在广告系统中,高并发环境下的广告投放管理是一个复杂而关键的问题。广告主通常会设定特定的预算,用于控制其广告的投放量和投放时长。在高并发环境下,如果系统无法在广告主的预算耗尽时及时停止广告投放,便会导致“超投”现象。即使广告主的预算已经用完,系统仍然继续为其投放广告,这样就可能会对广告平台的收入造成损失。

超投控制算法(目前)

降速触发机制

以下条件达成其一,触发降速检查机制(优先判定今日预算):

  • 今日预算设置了,今日费用消耗达到今日预算的90%
  • 今日预算没设置,总预算设置了,总费用消耗达到总预算的90%

降速检查机制

查询当前广告分钟级消耗,即查询广告当前时间的上一分钟的费用消耗。

计算剩余投放时间 = 广告剩余费用 / 广告当前时间消耗

若是消耗费用达到上述触发机制条件,并判断剩余投放时间是否小于30分钟,当 广告剩余投放时间 <= 30分钟时,通过广告剩余投放时间占比变化调整广告命中概率,从而达到降速的目的。

降速算法

降速系数 = (剩余分钟数+3)/33,也可称之为Miss概率,保留下限约0.1,防止未真正投放达到预算却迟迟没有量。

由于当前的广告命中概率,通过权重 1 ~ 10000来设置,并且 命中概率 =[10000-某条广告权重]/sum[(10000-ad1)+(10000-ad2)+(10000-ad3)+(10000-ad..)]。

结合降速系数(Miss概率),假如 A、B、C三条广告,有不同的权重,随机选中了A,但是由于A触发了降速,因此需要再次根据Miss概率随机一次,如果是Miss的话,从B和C中再随机选中,依次类推。

t 表示预估剩余分钟数,降速系数(也称为Miss概率)可以定义为函数 D(t)。函数的形式如下:

  1. t > 30 分钟时,降速系数 D(t)=1。
  2. t ≤ 30 分钟时,降速系数 D(t)= (t+3) / 33,但要保留一个下限约为 0.1。

可以将降速系数定义为以下分段函数: $$ D(t) = \begin{cases} 1 & \text{如果 } t > 30 \ \max\left(0.1, \frac{t + 3}{33}\right) & \text{如果 } t \leq 30 \end{cases} $$ 这里使用了 max 函数来确保当 t ≤30 分钟时,降速系数不会低于0.1。

其中,t 是预估剩余分钟数, (t+3) / 33 是在 t ≤ 30 时的降速系数计算方式,并且确保其不会低于0.1。

当t <= 30时,函数曲线: $$ D(t)=\frac{t+3}{33} $$ image-20240531181124760

目前弊端

延迟反应

降速触发机制基于费用消耗达到预算的90%时才启动

这意味着在达到90%之前,广告投放速度是全速的。如果广告的消耗速度非常快,在高峰期可能会在短时间内从90%消耗到100%甚至超过预算,导致短时间内出现超投现象。

降速系数下限

设定降速系数下限为0.1,虽然防止了广告完全停止投放的情况,但在预算即将耗尽的情况下,仍然会有一定量的广告投放。

这种情况在预算非常紧张时,可能会导致轻微的超投。

基于分钟级消耗

当前算法仅查询广告的分钟级消耗来判断剩余时间,但实际消耗速度可能会在分钟内波动

在秒级消耗较高的情况下,单分钟消耗数据可能不足以精确反映实际情况,可能导致降速反应不及时或不准确。

超投动态控制算法

总体思路:

  1. 获取目前广告当前时段的投放速度,使用秒级消耗计算,为保证数据相对准确使用最近10秒加权平均数计算;
  2. 获得所属目标广告的剩余投放时间,即 广告预算余额 / 广告当前消耗速度,剩余投放时间秒;
  3. 根据广告投放速度限制系数函数,根据广告剩余投放时间,来计算广告投放速度限制系数;
  4. 计算当前时间段的投放速度限制系数,通过广告限制系数,从而来调节广告速度;(其限制系数其值在0~1之间)

秒级广告消耗速度

当前广告的投放速度

目前广告当前时段的投放消耗速度:

使用秒级消耗来计算,时间范围使用最近10秒滑动窗口的加权平均来计算,可以更平滑和稳定地估计当前的广告投放速度。

步骤

  • 维护一个包含最近10秒广告消耗数据的滑动窗口。
  • 对这些数据应用加权平均计算,其中较新的数据权重更大,反映出最新的消耗趋势。

广告秒级消耗公式(最近10秒加权平均)

$$ \bar{C} = \sum_{i=1}^{10} w_i’ \cdot c_i $$

权重公式

使用指数衰减系数 α 来计算权重: $$ w_i = (1 - \alpha)^{10 - i} $$

标准化权重

权重标准化,使其和为1: $$ w_i’ = \frac{w_i}{\sum_{i=1}^{10} w_i} $$

计算案例

假设最近10秒的广告消耗数据分别为 c1,c2,…,c10 对应的权重为 w1,w2,…,w10。

最近10秒的广告消耗数据为: $$ c_1 = 0, \quad c_2 = 0, \quad c_3 = 0, \quad c_4 = 0, \quad c_5 = 0, \quad c_6 = 17, \quad c_7 = 18, \quad c_8 = 19, \quad c_9 = 16, \quad c_{10} = 20 $$ 指数衰减系数: a = 0.1

初始权重: $$ w_1 = 0.9^9 \approx 0.38742, w_2 = 0.9^8 \approx 0.43047, w_3 = 0.9^7 \approx 0.4783, w_4 = 0.9^6 \approx 0.53144,
w_5 = 0.9^5 \approx 0.59049, w_6 = 0.9^4 \approx 0.6561, w_7 = 0.9^3 \approx 0.729, w_8 = 0.9^2 \approx 0.81, w_9 = 0.9^1 \approx 0.9, w_{10} = 0.9^0 = 1 $$ 标准化权重: $$ w_i’ = \frac{w_i}{6.51322} $$

$$ w_1’ \approx \frac{0.38742}{6.51322} \approx 0.0595 , w_2’ \approx \frac{0.43047}{6.51322} \approx 0.0661 , w_3’ \approx \frac{0.4783}{6.51322} \approx 0.0734 , w_4’ \approx \frac{0.53144}{6.51322} \approx 0.0816 , w_5’ \approx \frac{0.59049}{6.51322} \approx 0.0906 , w_6’ \approx \frac{0.6561}{6.51322} \approx 0.1007 , w_7’ \approx \frac{0.729}{6.51322} \approx 0.1119 , w_8’ \approx \frac{0.81}{6.51322} \approx 0.1244 , w_9’ \approx \frac{0.9}{6.51322} \approx 0.1382 , w_{10}’ \approx \frac{1}{6.51322} \approx 0.1535 $$ 计算加权平均广告消耗: $$ \bar{C} \approx 0.0595 \cdot 0 + 0.0661 \cdot 0 + 0.0734 \cdot 0 + 0.0816 \cdot 0 + 0.0906 \cdot 0 + 0.1007 \cdot 17 + 0.1119 \cdot 18 + 0.1244 \cdot 19 + 0.1382 \cdot 16 + 0.1535 \cdot 20 $$

$$ \bar{C} \approx 11.3709 $$

得到最近10秒的加权平均广告消耗大约为:11.37

剩余投放时间

根据当前投放速度获得所属目标广告的剩余投放时间,即 t = 广告预算余额 / 广告投放速度, 单位为秒;

当前投放速度限制系数

计算当前时间段的投放速度限制系数,获取当前限制系数公式:

D(t)标识下一时段对所述广告的投放速度限制系数,其值在0~1之间,t表示所述广告的剩余投放时间。 $$ D(t)=\frac{1-e^{-0.0083t}}{1+16e^{-0.0083t}} $$

函数曲线

image-20240606160620281

调节广告命中率

通过该广告速度限制系数调节广告命中率

超投控制模块设计

广告超投控制模块设计

0%