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