【发布时间】:2020-09-25 06:24:47
【问题描述】:
我们在高级计划中使用基于队列触发器的函数应用程序,其中消息包含一些详细信息,例如天蓝色订阅名称。基于此,对于每个订阅,我们专门针对 azure 存储帐户(大约 400 到 500 个)进行许多 api 调用。由于对存储帐户的“列表”api 调用限制为 100 次调用/5 分钟,我们在第 101 次调用时收到 429 响应错误。为了缓解这种情况,我们应用了指数重试逻辑(尝试了我们自己的库或 polly 库),它在一定的时间延迟后调用。这适用于某些订阅,但对于重试逻辑在第一次尝试后未尝试的许多订阅失败(我们保持 3 次重试,延迟为 60 秒)。即使在通过实时指标监控函数应用程序时,我们观察到有时某些函数实例的 cpu 使用率会变为零(尽管我们在延迟操作中执行了一些操作,例如日志记录或使用 for 循环,以便函数可以处于活动状态),这会导致杀死该特定函数实例并将消息推回队列并使用新实例再次启动该过程。
请注意,由于许多订阅是并行处理的,因此函数应用会根据需要自动扩展。此外,由于我们使用的是高级计划,因此一台虚拟机始终处于状态。因此,杀死任何实例(为任何特定订阅调用大约 400 到 500 个存储 api 调用)是很奇怪的,因为在我们的延迟中,线程休眠时间对于大约 6、12、18(Time_delay)迭代只有 10 秒。我们的重试逻辑代码中使用了下面的延迟函数。
private void Delay(int Time_delay, string requestUri, int retryCount)
{
for (int i = 0; i < Time_delay; i++)
{
_logger.LogWarning($"Sleep initiated for id: {requestUri.ToString()}, RetryCount: {retryCount} CurrentTimeDelay: {Time_delay}");
Thread.Sleep(10000);
_logger.LogWarning($"Sleep completed for id: {requestUri.ToString()}, RetryCount: {retryCount} CurrentTimeDelay: {Time_delay}");
}
}
注意** 除了依赖 429 错误响应之外,函数应用不会抛出任何其他异常。
【问题讨论】:
标签: azure azure-functions azure-function-app azure-functions-runtime