Переместить сообщение в "мертвую букву" в azure servicebus - PullRequest
1 голос
/ 12 июля 2020

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

Теперь я столкнулся с двумя проблемами: 1) я вижу, что количество доставок не увеличивается когда я клонирую и повторно отправляю обратно в очередь 2) Я хочу переместить его в мертвую букву, если достигнуто максимальное количество доставок.

Код:

catch (Exception ex)
                {
                    _logger.Error(ex, $"Failed to process request {requestId}");
                    var clone = messageResult.Message.Clone();
                    clone.ScheduledEnqueueTimeUtc = DateTime.UtcNow.AddSeconds(45);
                    
                    await messageResult.ResendMessage(clone);
                    if (retryCount == MaxAttempts)
                    {
                        //messageResult.dea
                    }
                    return new PdfResponse { Error = ex.ToString() };

                }

пожалуйста, помогите мне в этом

1 Ответ

1 голос
/ 12 июля 2020

Когда вы клонируете сообщение, оно становится новым сообщением, это означает, что системные свойства не клонируются, что дает клонированному сообщению fre sh счетчик доставки, начиная с 1 снова. См. Также https://docs.azure.cn/zh-cn/dotnet/api/microsoft.azure.servicebus.message.clone?view=azure-dotnet

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

Эта функция задокументирована здесь: https://docs.microsoft.com/en-us/azure/service-bus-messaging/message-transfers-locks-settlement#peeklock

Но важно то, что если вы не выполнять любое из вышеупомянутых действий, например клонирование Azure Service Bus автоматически сделает сообщение видимым снова после определенного интервала (свойство LockDuration) или когда вы отказываетесь от него.

Таким образом, чтобы получить отложенную повторную попытку и поведение мертвой буквы (когда максимальное количество доставок имеет достигнуто) вы можете использовать следующие параметры:

Вариант 1. Повторить попытку через Azure автоблокировка служебной шины

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

Вариант 2. Реализуйте собственную политику повтора

Выполните собственную политику повтора в своем код и повторите обработку сообщения. Если достигнуто максимальное количество повторных попыток, откажитесь от сообщения, которое сделает его снова видимым для следующего шага чтения очереди после того, как будет достигнуто время повтора. В этом случае количество доставок также увеличивается.

Примечание : если вы выберете вариант 2.) убедитесь, что ваш период повтора соответствует определенному LockDuration, чтобы что ваше сообщение больше не будет отображаться в очереди, если вы все еще обрабатываете его с повторными попытками. Вы также можете возобновить блокировку между повторными попытками, вызвав метод RenewLock () в сообщении между повторными попытками.

Если вы реализуете политику повторных попыток в своем коде, я рекомендую использовать в Polly . Net, который уже предоставляет вам такие замечательные функции, как политики Retry и Circuit Breaker. См. https://github.com/App-vNext/Polly

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