Функция Azure и очередь - PullRequest
       35

Функция Azure и очередь

0 голосов
/ 26 марта 2019

У меня есть функция:

    public async static Task Run([QueueTrigger("efs-api-call-last-datetime", Connection = "StorageConnectionString")]DateTime queueItem,
        [Queue("efs-api-call-last-datetime", Connection = "StorageConnectionString")]CloudQueue inputQueue,
        TraceWriter log)
    {

Тогда у меня длинный процесс обработки сообщения из очереди.Проблема в том, что сообщение будет добавлено в очередь через 30 секунд, пока я обрабатываю это сообщение.Мне не нужно добавлять это сообщение и обрабатывать его дважды.Я хотел бы иметь такой код:

        try
        {
             // long operation
        }
        catch(Exception ex)
        {
            // something wrong. Readd this message in 1 minute
            await inputQueue.AddMessageAsync(new CloudQueueMessage(
                JsonConvert.SerializeObject(queueItem)),
                timeToLive: null,
                initialVisibilityDelay: TimeSpan.FromMinutes(1),
                options: null,
                operationContext: null
                );
        }

и запретить его автоматическое чтение.Есть ли способ сделать это?

Ответы [ 2 ]

2 голосов
/ 27 марта 2019

Здесь есть пара вещей.

1) Когда ожидают несколько сообщений очереди, триггер очереди извлекает пакет сообщений и одновременно вызывает экземпляры функций для их обработки. По умолчанию размер пакета равен 16. Но это настраивается в Host.json. Вы можете установить размер пакета равным 1, если хотите минимизировать параллельное выполнение. Документ Microsoft объясняет это.

2) Поскольку это длительный процесс, кажется, что ваши сообщения не завершены, и функция может быть остановлена, и сообщение снова станет видимым. Вы должны попытаться разбить свою функцию на более мелкие функции. Тогда вы можете использовать долговременную функцию, которая будет связывать работу, которую вы должны сделать.

1 голос
/ 27 марта 2019

Да, вы можете удалить одно и то же сообщение дважды.

Причины

1. Рабочий A удаляет сообщение B, и время ожидания невидимости истекает. Сообщение B снова становится видимым, и работник C удаляет сообщение B, аннулируя всплывающую квитанцию ​​работника A. Работник А заканчивает работу, переходит к удалению сообщения Б и выдает ошибку. Это наиболее распространенный.

2. Вероятно, истекает время блокировки исходного сообщения, запускающего первую функцию Azure. Это заставит очередь предположить, что обработка сообщения не удалась, и затем она будет использовать это сообщение для повторного запуска функции.

3. При определенных условиях (очень частый опрос очереди) вы можете получить одно и то же сообщение дважды на GetMessage. Это тип расы, который встречается редко. Рабочие A и B опрашивают очень быстро и одновременно попадают в очередь, и оба получают одно и то же сообщение. Раньше это было гораздо более распространенным (временные рамки SDK 1.0) в сценариях с высоким опросом, но теперь оно стало намного реже в более поздних обновлениях хранилища (не могу вспомнить, увидев это недавно).

1 и 3 имеют место только когда у вас более 1 работника.

Обход

Установка azure-webjobs-sdk версии 1.0.11015.0 (отображается на странице «Настройки» портала «Функции»). Для получения более подробной информации вы можете обратиться к исправлению обновлений видимости очереди

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