Функция Azure visibilityTimeout - PullRequest
       25

Функция Azure visibilityTimeout

2 голосов
/ 19 апреля 2019

Когда я читаю документацию о visibilityTimeout: https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-storage-queue#host-json, он говорит: «Интервал времени между повторными попытками при сбое обработки сообщения». Насколько я понимаю, это то, что если тайм-аут установлен на 30 секунд, и моя функция работает в течение 1 минуты, но не выходит из строя в течение этого 1-минутного периода, сообщение не становится видимым для других в очереди. Но когда я прочитал об этом из других источников (stackoverflow fx), это говорит мне об обратном: когда время выполнения функции превышает время ожидания, сообщение становится видимым ДАЖЕ, хотя функция все еще обрабатывает сообщение.

Что такое правда? Является ли тайм-аут релевантным только в том случае, если функция больше не работает (и, возможно, произошла ошибка) или может случиться, что сообщение снова станет видимым, даже если функция все еще работает?

Что также не имеет смысла, если мы предположим, что сообщение становится видимым при достижении тайм-аута, так это то, что тайм-аут по умолчанию равен 00:00:00, что означает, что сообщение является видимым в тот же момент, когда оно удалено. Это противоречит тому, что говорят 3. партийные источники.

Я немного смущен этим.

1 Ответ

0 голосов
/ 21 апреля 2019

Я проверил это с

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. если функция не выходит из строя, ИЛИ хост не выходит из строя, ну тогда аренда автоматически возобновляется в соответствии сto: 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. сторону, которая противоречила этому (извините, я не сохранил эти), но они существуют. Я хотел бы, чтобы кто-то ответил на это, поэтомуЯ могу получить разъяснения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...