编程语言
首页 > 编程语言> > c#-API速率限制器

c#-API速率限制器

作者:互联网

我写了一个API速率限制器以与Last.fm的API一起使用.

Last.fm的Tos指出,平均每个5分钟内,我每秒对每个原始IP地址发出的请求数量不能超过5个.

这是我写的课:

public class RateLimiter
{
    private static readonly List<DateTime> _requests = new List<DateTime>();

    private const double _perMillisecond = 1000.1;
    private const int _rateLimit = 5;
    private const int _rateLimitCooldownMs = 500;

    public static void CheckLimiter()
    {
        _requests.Add(DateTime.Now);

        var requestsDuringRateLimit = _requests.Where(w => (DateTime.Now - w).TotalMilliseconds < _perMillisecond).ToArray();

        if (requestsDuringRateLimit.Count() >= _rateLimit)
        {
            Thread.Sleep(_rateLimitCooldownMs);
            _requests.Clear();
            Console.Clear();
        }
    }
}

在启动HttpWebRequest之前调用CheckLimiter方法,这是限制API请求的好方法吗?

解决方法:

我认为这很好.除此之外,此代码中还有一个错误.这是因为,如果每个请求的执行间隔都超过一秒钟,该怎么办?如果阻塞,它将永远不会进入内部.因此,某种类型的memory leak是因为_requests将随着时间的推移而变大,并且如果我的上述情况总是发生,则可能永远无法清除.

例:

for (int i = 0; i < 100; i++)
{
   RateLimiter.CheckLimiter();
   Thread.Sleep(2000);
}

您可以做的是删除_request中超过1秒规则的条目,例如在方法末尾添加此行.

if (_requests.Count != 0)
{
    //remove irrelevant/expired entries
    _requests.RemoveAll(date => (DateTime.Now - date).TotalMilliseconds >= _perMillisecond);
}

标签:web,last-fm,system-net-httpwebrequest,c
来源: https://codeday.me/bug/20191123/2065812.html