使用缓存机制进行限制是否有问题?

时间:2017-11-13 16:12:44

标签: c# azure caching azure-webjobs memorycache

我在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个请求吗?

1 个答案:

答案 0 :(得分:2)

如果您不打算使用多个WebJob实例,为什么不使用TimerTrigger并将呼叫均匀分配?

Here's the link到文档。