【问题标题】:Queue triggered based function app not getting completed基于队列触发的功能应用程序未完成
【发布时间】: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


    【解决方案1】:

    您是否可以重新排队而不是使用Thread.Sleep?您可以在重新排队时使用初始可见性延迟:

    public class Function1
    {
        [FunctionName(nameof(TryDoWork))]
        public static async Task TryDoWork(
            [QueueTrigger("some-queue")] SomeItem item,
            [Queue("some-queue")] CloudQueue queue)
        {
            var result = _SomeService.SomeWork(item);
                
            if (result == 429)
            {
                item.Retries++;
                var json = JsonConvert.SerializeObject(item);
                var message = new CloudQueueMessage(json);
                var delay = TimeSpan.FromSeconds(item.Retries);
                await queue.AddMessageAsync(message, null, delay, null, null);
            }
        }
    }
    

    可能是睡眠导致一些不稳定的功能应用行为。我想我记得读过一些关于Thread.Sleep 用法的问题,但我现在找不到。

    此外,您可能希望添加某种消息处理方式,这些消息最终重试超过 3 次(或者您认为合理的次数)。

    【讨论】:

      猜你喜欢
      • 2013-05-20
      • 2019-03-26
      • 1970-01-01
      • 2014-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多