Azure函数visibilityTimeout

问题描述 投票:2回答:1

当我阅读有关visibilityTimeout的文档:https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-storage-queue#host-json时,它说“处理消息失败时重试之间的时间间隔。”。我如何理解这一点,如果超时设置为30秒并且我的函数运行1分钟但在1分钟内没有失败,则队列中的其他人不会看到该消息。但是当我通过其他来源(stackoverflow fx)读取它时,它告诉我相反的情况,当函数的执行时间超过超时时,消息变为可见,即使该函数仍在处理消息。

真相是什么?当函数没有运行更多(并且可能已经失败)时,超时是否仅相关,或者即使函数仍在运行,消息是否会再次可见?

如果我们假设在达到超时时消息可见,则默认超时为00:00:00,这意味着消息在出列的同一时刻是可见的,这也是没有意义的。这与党的消息来源所说的相矛盾。

我有点困惑。

azure azure-functions azure-storage-queues
1个回答
0
投票

我测试了这个

using System;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host;
using Microsoft.Extensions.Logging;
using Microsoft.WindowsAzure.Storage.Queue;

namespace WorkerFunctions
{
    public static class WorkerFunctions
    {
        [FunctionName("WorkerFunction1")]
        public static async Task Function1(
            [QueueTrigger("outputQueue")]
            CloudQueueMessage item,
            [Queue("outputQueue")]
            CloudQueue outputQueue,
            DateTimeOffset nextVisibleTime,
            DateTimeOffset expirationTime,
            DateTimeOffset insertionTime,
            ILogger log)
        {
            log.LogInformation("########## Function 1 ###############");
            log.LogInformation($"NextVisibleTime: {nextVisibleTime}");
            log.LogInformation($"NextVisibleTime: {(nextVisibleTime-insertionTime).TotalSeconds}");
            log.LogInformation($"C# Queue trigger function processed: {item.AsString}");

            Thread.Sleep(TimeSpan.FromMinutes(20));
        }

        [FunctionName("WorkerFunction2")]
        public static async Task Function2(
            [QueueTrigger("outputQueue")]
            CloudQueueMessage item,
            [Queue("outputQueue")]
            CloudQueue outputQueue,
            DateTimeOffset nextVisibleTime,
            DateTimeOffset expirationTime,
            DateTimeOffset insertionTime,
            ILogger log)
        {
            log.LogInformation("########## Function 2 ###############");
            log.LogInformation($"NextVisibleTime: {nextVisibleTime}");
            log.LogInformation($"NextVisibleTime: {(nextVisibleTime - insertionTime).TotalSeconds}");
            log.LogInformation($"C# Queue trigger function processed: {item.AsString}");

            Thread.Sleep(TimeSpan.FromMinutes(20));
        }
    }
}

有了这个主机文件

{
  "version": "2.0",
  "extensions": {
    "queues": {
      "maxPollingInterval": "00:00:02",
      "visibilityTimeout": "00:00:10",
      "batchSize": 16,
      "maxDequeueCount": 5,
      "newBatchThreshold": 8
    }
  }
}

当我在队列上放一条简单的消息让它运行时,我看到以下内容:

  1. 抓住它的功能,在睡眠结束前不释放它
  2. 我不能在日志中看到更新租约,但似乎它发生在引擎盖下

这告诉我的是什么:

  1. 如果函数没有失败,或者主机没有失败,那么根据以下内容自动更新租约:https://stackoverflow.com/a/31883806/21199
  2. 当达到可见性超时,并且该函数正在运行时,该消息不会被“读取”到队列中
  3. 关于visibilityTimeout的文档是真的:“处理消息失败时重试之间的时间间隔。” (来自https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-storage-queue#hostjson-settings

我没有保存任何链接到3.与此相矛盾的一方(抱歉我没有保存这些),但它们存在。我希望有人能回答这个问题,所以我可以澄清一下。

© www.soinside.com 2019 - 2024. All rights reserved.