我在Azure网络作业上实施了限制机制。我们的网络工作的“工作”是全天不断地从第三方API下载单独的.wav文件。它每天大约做5000次(现在)。但是,第三方api有使用限制,只允许我们每60秒下载最多10个wav文件。如果我们重复一遍,我们会在接下来的60秒内为每个请求收到429错误。
所以我实现了一些代码来限制我们对这个api的请求。这是现在在每个请求之前执行的代码块:
var maxPerPeriod = 10;
var keyPrefix = RingCentralId;
var intervalPeriod = 60000;
var sleepInterval = 5000;
var recentTransactions = MemoryCache.Default.Count(x => x.Key.StartsWith(keyPrefix));
while (recentTransactions >= maxPerPeriod)
{
System.Threading.Thread.Sleep(sleepInterval);
recentTransactions = MemoryCache.Default.Count(x => x.Key.StartsWith(keyPrefix));
}
var key = keyPrefix + "_" + DateTime.Now.ToUniversalTime().ToString("yyyyMMddHHmmss");
var existing = MemoryCache.Default.Where(x => x.Key.StartsWith(key));
if (existing != null && existing.Any())
{
var counter = 2;
var last = existing.OrderBy(x => x.Key).Last();
var pieces = last.Key.Split('_');
if (pieces.Count() > 2)
{
var lastCount = 0;
if (int.TryParse(pieces[2], out lastCount))
{
counter = lastCount + 1;
}
}
key = key + "_" + counter;
}
var policy = new CacheItemPolicy
{
AbsoluteExpiration = DateTimeOffset.UtcNow.AddMilliseconds(intervalPeriod)
};
MemoryCache.Default.Set(key, 1, policy);
这实际上很有效(至少目前为止)。正如您所看到的,我使用具有唯一密钥的缓存,每个密钥持续60秒。此机制搜索缓存,如果缓存中当前有10个或更多,那么这意味着我们需要等到它们到期。我通过实现while
循环来实现这一点。这是我最关心的部分。我没有很多使用MemoryCache
的经验。我可能在某个时间点引入无限循环吗?还有什么我可以忽略的可能导致问题,特别是如果我们扩大到每天1,000,000个请求吗?