Очередь хранилища Azure - обработка сообщений в подозрительной очереди

Я тоже использовал очереди хранилища Azure для публикации сообщений, а затем записывал сообщения в таблицу db. Однако я заметил, что при возникновении ошибки при обработке сообщений в очереди сообщение записывается в подозрительную очередь.

Вот некоторая предыстория настройки моего приложения:

Веб-приложение Azure -> Записывает сообщение в очередь

Функция Azure -> Триггер очереди обрабатывает сообщение и записывает его содержимое в базу данных.

Возникла проблема со схемой db, которая привела к сбою INSERTS. Каждое сообщение было повторено 5 раз, что, как я считаю, является стандартным для повторных попыток сообщений очереди, и после 5-й попытки сообщение было помещено в подозрительную очередь.

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

У меня вопрос: можем ли мы восстановить сообщения, записанные в подозрительную очередь, чтобы обработать их и ВСТАВИТЬ в базу данных, и если да, то как?


person laffaner    schedule 23.10.2017    source источник
comment
Отвечает ли это на ваш вопрос? Azure: как перемещать сообщения из опасной очереди обратно в основную очередь?   -  person Michael Freidgeim    schedule 18.01.2020


Ответы (6)


Для вашей конкретной проблемы я бы порекомендовал решение, упомянутое в части вопроса этого сообщения: Azure: как переместить сообщения из подозрительной очереди обратно в основную очередь?

Обратите внимание, что имя очереди заражения == $"{queueName}-poison"

person sANDwORm    schedule 23.10.2017
comment
Не уверен, что это лучший подход на случай, если «поврежденное» сообщение будет переработано навсегда. - person alwayslearning; 23.10.2017
comment
@alwayslearning Согласен, поэтому я сказал «для этой конкретной проблемы». Этот код должен работать только в течение короткого времени, чтобы перекачивать опасные сообщения, вызванные недавним сбоем, а затем удаляться. Код также может игнорировать очень старые (по минимальной отметке времени) сообщения, которые не были вызваны сбоем. - person sANDwORm; 23.10.2017
comment
Я согласен, для моего конкретного сценария будет работать, чтобы скопировать сообщение обратно в исходную очередь и снова обработать его теперь, когда база данных была исправлена. Так что спасибо за это. Однако как это будет работать в производственной среде. Существует вероятность того, что может произойти другая ошибка, и, как говорит @alwayslearning, сообщения могут попасть в вечный цикл повторных попыток. Мне любопытно узнать, какие ручные шаги можно было бы использовать, если мы уведомим кого-то о добавлении сообщения в очередь. - person laffaner; 23.10.2017

Вы можете использовать Azure Management Studio (cerulean) и переместить сообщение из опасной очереди в фактическую очередь. Настоятельно рекомендуемый инструмент для доступа к очередям и BLOB-объектам, а также для выполнения любых действий, связанных с производством. https://www.cerebrata.com/products/cerulean

Я просто пользуюсь этим инструментом и никоим образом не являюсь аффилированным лицом, я рекомендовал, потому что он очень мощный, очень полезный и делает вас очень продуктивным.

введите здесь описание изображения

Нажмите «Переместить», и сообщение можно будет переместить в уже загруженную очередь.

введите здесь описание изображения

person Karthikeyan VK    schedule 14.09.2018

В моем текущем проекте я создал то, что называется: «Вспомогательные функции» в FunctionApp. Он предоставляет специальную конечную точку HTTP с уровнем авторизации Admin, которая может быть запущена в любое время.

См. Приведенный ниже код, который решает проблему повторной обработки сообщений из опасной очереди:

public static class QueueOperations
{
    [FunctionName("Support_ReprocessPoisonQueueMessages")]
    public static async Task<IActionResult> Support_ReprocessPoisonQueueMessages([HttpTrigger(AuthorizationLevel.Admin, "put", Route = "support/reprocessQueueMessages/{queueName}")]HttpRequest req, ILogger log,
        [Queue("{queueName}")] CloudQueue queue,
        [Queue("{queueName}-poison")] CloudQueue poisonQueue, string queueName)
    {
        log.LogInformation("Support_ReprocessPoisonQueueMessages function processed a request.");

        int.TryParse(req.Query["messageCount"], out var messageCountParameter);
        var messageCount = messageCountParameter == 0 ? 10 : messageCountParameter;

        var processedMessages = 0;
        while (processedMessages < messageCount)
        {
            var message = await poisonQueue.GetMessageAsync();
            if (message == null)
                break;

            var messageId = message.Id;
            var popReceipt = message.PopReceipt;

            await queue.AddMessageAsync(message); // a new Id and PopReceipt is assigned
            await poisonQueue.DeleteMessageAsync(messageId, popReceipt);
            processedMessages++;
        }

        return new OkObjectResult($"Reprocessed {processedMessages} messages from the {poisonQueue.Name} queue.");
    }
}

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

person Pawel Maga    schedule 19.10.2018

У вас есть два варианта

  1. Добавьте еще одну функцию, которая запускается сообщениями, добавленными в подозрительную очередь. Вы можете попробовать добавить содержимое в базу данных в этой функции. Более подробную информацию об этом подходе можно найти здесь. Конечно, если эта функция тоже не может обработать сообщение, вы можете проверить количество исключений из очереди и опубликовать уведомление, которое требует ручного вмешательства.
  2. Добавьте параметр int 'dequeueCount' в функцию, обрабатывающую очередь, и после, скажем, 5 повторных попыток регистрируйте сбой вместо того, чтобы позволить сообщению перейти в опасную очередь. Например, вы можете отправить электронное письмо, чтобы уведомить о необходимости ручного вмешательства.
person alwayslearning    schedule 23.10.2017
comment
Спасибо, это то, что я искал :) Вы упомянули ручное вмешательство, и ссылка на документы github также касается этого, но какие действия вручную вы могли бы предпринять для сообщения, у которого было превышено количество исключений? Например, я использую обозреватель хранилищ Azure и вижу сообщение в очереди подозрительных сообщений. Однако, похоже, я ничего не могу сделать с сообщением. Есть возможность удалить сообщение из очереди, но я не вижу, куда оно отправляется после этого? Я новичок в лазурных функциях (как вы, наверное, догадались), поэтому пытаюсь понять их. - person laffaner; 23.10.2017
comment
Я не пробовал, но если вы запускаете другую функцию Azure, когда сообщение добавляется в подозрительную очередь и оно успешно обрабатывает сообщение, я предполагаю, что сообщение будет удалено из опасной очереди. В конце концов, это не то, чего вы хотите достичь - обработать «неудачные» сообщения. - person alwayslearning; 23.10.2017
comment
Итак, 2 функции, одна для основной очереди, а другая для опасной очереди, выполняют одну и ту же обработку. Однако, если это проблема, отличная от той, с которой я столкнулся, и сообщение повреждено, не будет ли он всегда повторять поврежденные сообщения? Или счетчик удаления из очереди тоже включается в очередь с ядом? - person laffaner; 23.10.2017
comment
Вы можете добавить параметр int dequeueCount к любой из функций, чтобы выполнить некоторую обработку. Вы можете добавить его к исходной функции и после 5 повторных попыток, например, позволить ему перейти в очередь подозрений по умолчанию или отправить электронное письмо для ручного вмешательства. Проверьте тему «Обработка подозрительных сообщений вручную» по ссылке, указанной в ответе. Используйте привязку вывода SendGrid в функции для программной отправки электронной почты. docs.microsoft.com/en-us/azure/ лазурные функции / - person alwayslearning; 23.10.2017
comment
Спасибо, мне есть через что пройти и попробовать. Я дам тебе знать, как у меня дела :) - person laffaner; 23.10.2017
comment
Не стесняйтесь голосовать и отмечать это как ответ, если считаете, что это вам помогло :) - person alwayslearning; 23.10.2017
comment
Я пытался проголосовать за, но он не появляется, потому что я новичок (хотя, видимо, он регистрируется)! Я отмечу это как ответ, как только поиграю с ним завтра, когда буду в офисе. - person laffaner; 24.10.2017

Просто укажите своей функцией Azure в очереди с ошибками, и элементы в этой очереди будут обработаны. Подробнее здесь: https://briancaos.wordpress.com/2018/05/03/azure-functions-how-to-retry-messages-in-the-poison-queue/

person AndersBaumann    schedule 16.11.2019

Обозреватель службы хранилища Azure (версия выше 1.15.0) теперь поддерживает перемещение сообщений из одной очереди в другую. Это позволяет переместить все или выбранный набор сообщений из опасной очереди обратно в исходную очередь.

https://github.com/microsoft/AzureStorageExplorer/issues/1064

person sree    schedule 08.03.2021