我正在寻找一种限制特定事件发生率的方法。我对每秒事件的数量有严格的限制,但是可以容忍一定数量的错误。该实现需要使用尽可能少的内存。当前,我们保留了一个时间戳队列,该时间戳总是准确的,但是这可以消除内存占用。
令牌桶算法看起来很合适,但似乎只能保证平均速率。根据事件发生的时间相对于令牌充值点,它可能违反限制。
如何计算令牌桶的错误?可以校准吗?
答案 0 :(得分:0)
在我的第一个建议中,您将必须存储算法的开始时间和一个计数器,因此只需存储两个值。
制定固定时间表。将为每个事件分配一个特定的时间,该时间直接由算法的开始时间,此后的事件数以及所需的速率得出:
event_time = start_time + event_counter / rate
在每个事件之后增加event_counter
并入睡,直到下一个事件的event_time
到期(sleep(event_time - current_time)
或类似事件)为止。
在我的第二个建议中,您还必须存储一个延迟时间,因此您将需要存储三个值。
在每个事件之后,只要延迟状态进入睡眠状态,然后继续下一个事件。另外,在每个事件之后(或者仅counter % n == 0
仅在 n 个事件之后才执行),您将更新延迟:使用当前时间,开始时间和计数器来计算当前平均值率;如果太高,则会增加延迟;如果太低,则减少延迟;否则您将延迟保持不变。
这将自动计算出您所需的事件和费率的平均延迟。但是,如果您的活动持续时间变化很大,那么将很难保持平稳。在最坏的情况下(具有特定的持续时间变化),您甚至可能会得到周期性上升和减少延迟的共振效应。