.NET Throttle算法

时间:2012-01-03 07:30:03

标签: c# .net vb.net throttling

我想在.net(C#或VB)中实现一个好的节流算法,但我无法弄清楚我怎么能这样做。

案例是我的asp.net网站应该将请求发布到另一个网站以获取结果。 最多应发送每分钟300个请求。

如果请求超过300限制,则另一方Api不返回任何内容(这是我不想用作检查代码的内容)。

P.S。我见过其他语言的解决方案而不是.net但是我是新手,请善待并保持你的答案就像123一样简单。

谢谢

2 个答案:

答案 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毫秒。