这是最简单的算法,如果您只想在消息到达太快时就丢弃它们(而不是对其进行排队,这很有意义,因为队列可能会任意大):
rate = 5.0; // unit: messagesper = 8.0; // unit: secondsallowance = rate; // unit: messageslast_check = now(); // floating-point, e.g. usec accuracy. Unit: secondswhen (message_received): current = now(); time_passed = current - last_check; last_check = current; allowance += time_passed * (rate / per); if (allowance > rate): allowance = rate; // throttle if (allowance < 1.0): discard_message(); else: forward_message(); allowance -= 1.0;
此解决方案中没有数据结构,计时器等,它可以正常工作:)看到这一点,“津贴”最多以每秒5/8个单位的速度增长,即每八秒最多五个单位。转发的每封邮件都会扣除一个单位,因此每八秒钟发送的邮件不能超过五个。
请注意,该值
rate应为整数,即不包含非零的小数部分,否则该算法将无法正常工作(实际费率将不是
rate/per)。例如,
rate=0.5;per=1.0;它无法正常工作,因为
allowance它将永远不会增长到1.0。但是
rate=1.0; per=2.0;效果很好。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)