我想在.net(C#或VB)中实现一个好的节流算法,但我无法弄清楚我怎么能这样做。
案例是我的asp.net网站应该将请求发布到另一个网站以获取结果。 最多应发送每分钟300个请求。
如果请求超过300限制,则另一方Api不返回任何内容(这是我不想用作检查代码的内容)。
P.S。我见过其他语言的解决方案而不是.net但是我是新手,请善待并保持你的答案就像123一样简单。
谢谢
答案 0 :(得分:6)
您可以拥有一个简单的应用程序(或会话)类,并检查是否有命中。为了给你这个想法,这是非常粗糙的事情:
public class APIHits {
public int hits { get; private set; }
private DateTime minute = DateTime.Now();
public bool AddHit()
{
if (hits < 300) {
hits++;
return true;
}
else
{
if (DateTime.Now() > minute.AddSeconds(60))
{
//60 seconds later
minute = DateTime.Now();
hits = 1;
return true;
}
else
{
return false;
}
}
}
}
答案 1 :(得分:2)
最简单的方法是计算数据包之间的时间长度,并且不允许它们以每0.2秒一次的速率发送。也就是说,记录你被叫的时间以及你下次被叫的时间,检查至少200毫秒已经消失,或者什么都不返回。
这种方法可行,但它只适用于平滑的数据包流 - 如果您预计会有突发的活动,那么您可能希望在任何200ms周期内允许5条消息,只要平均超过1分钟不超过300个呼叫。在这种情况下,您可以使用值数组来存储最后300个数据包的“时间戳”,然后每次yoiu接收到一个呼叫,您可以回顾“300个呼叫前”以检查至少1分钟已经过去
对于这两种方案,Environment.TickCount
返回的时间值足以满足您的需求(跨度不小于200毫秒),因为它精确到大约15毫秒。