Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Очереди служебной шины Azure и подписки на разделы предоставляют дополнительную очередь, которая называется очередью недоставленных сообщений. Очередь недоставленных сообщений не нужно создавать явным образом. Ее нельзя удалить, ею нельзя управлять отдельно от основной сущности.
В этой статье описываются очереди недоставленных сообщений в Service Bus. Большую часть обсуждения иллюстрирует пример Dead-Letter queues на сайте GitHub.
Очередь недоставленных сообщений
Очередь недоставленных сообщений предназначена для хранения сообщений, которые невозможно доставить ни одному адресату либо не удалось обработать. Сообщения из очереди DLQ можно извлечь и проверить. Приложение может разрешить пользователю исправлять проблемы и повторно отправить сообщение.
С точки зрения интерфейса API и протокола очередь DLQ очень похожа на другие очереди за исключением того, что сообщения могут отправляться только посредством операции недоставленного сообщения родительской сущности. Кроме того, не учитывается время жизни, и нельзя отправить сообщение в очередь мертвых писем. Очередь недоставленных сообщений полностью поддерживает обычные операции, такие как доставка с предварительным просмотром и блокировкой, получение и удаление, а также транзакционные операции.
Автоматическая очистка очереди DLQ не выполняется. Сообщения остаются в очереди непринятых сообщений (DLQ), пока вы явно не извлечете их оттуда и не удалите или обработаете недоставленное сообщение.
Путь к очереди недоставленных сообщений
Вы можете обратиться к очереди недоставленных сообщений с помощью следующего синтаксиса:
<queue path>/$deadletterqueue
<topic path>/Subscriptions/<subscription path>/$deadletterqueue
В .NET можно использовать метод FormatDeadLetterPath
.
QueueClient.FormatDeadLetterPath(queuePath)
SubscriptionClient.FormatDeadLetterPath(topicPath, subscriptionName)
Количество сообщений в очереди недоставленных сообщений
Получение количества сообщений в очереди недоставленных писем на уровне темы не применимо, так как сообщения не находятся на уровне темы. Вместо этого, когда отправитель отправляет сообщение в раздел, оно за несколько миллисекунд передается в подписку этого раздела и уже не находится на уровне раздела. Сообщения можно увидеть в DLQ, связанной с подпиской на тему. В следующем примере Service Bus Explorer показывает, что в очереди недоставленных сообщений для подписки test1 есть 62 сообщения.
Вы также можете узнать количество сообщений в очереди недоставленных сообщений (DLQ) с помощью команды Azure CLI az servicebus topic subscription show
.
Перемещение сообщений в очередь недоставленных писем (DLQ)
В служебной шине есть несколько действий, которые приводят к отправке сообщений в очередь DLQ из самой системы обработки сообщений. Сообщения также могут явно перемещаться в очередь DLQ самим приложением. К недоставленным сообщениям добавляются следующие два свойства (причина и описание недоставленных сообщений). Приложения могут определять собственные коды для свойства причины недоставленных сообщений, однако система задает следующие значения.
Причина недоставленных сообщений. | Описание ошибки обработки недоставленных сообщений. |
---|---|
HeaderSizeExceeded |
Квота на размер этого потока превышена. |
TTLExpiredException |
Срок действия сообщения истек, и оно было перемещено в очередь недоставленных. Дополнительные сведения см. в разделе Срок жизни. |
Session ID is null . |
Сущность, поддерживающая сеансы, не допускает использование сообщений, идентификатор сеанса которых имеет значение null. |
MaxTransferHopCountExceeded |
Максимальное количество разрешенных переходов при переадресации между очередями превысило установленный предел. Задано значение 4. |
MaxDeliveryCountExceeded |
Сообщение не удалось обработать после максимального количества попыток доставки. Дополнительные сведения см. в разделе Максимальное число доставок. |
Срок жизни
При включении функции мертвых писем для очередей или подписок все сообщения с истекшим сроком действия перемещаются в очередь мертвых писем (DLQ). Код причины недоставки установлен на: TTLExpiredException
Отложенные сообщения не будут удалены и перемещены в очередь недоставленных писем после истечения срока их действия. Такое поведение предусмотрено программой.
Максимальное число доставок
Для очередей и подписок Service Bus существует ограничение на количество попыток доставки сообщений. Значение по умолчанию — 10. Всякий раз, когда сообщение доставляется под блокировкой для просмотра, но либо явно отменено, либо срок действия блокировки истек, количество доставки сообщения увеличивается. Если число доставок превышает это ограничение, сообщение перемещается в очередь DLQ. Для сообщения в DLQ задана MaxDeliveryCountExceeded
причина недоставленной буквы: Это поведение нельзя отключить, но можно увеличить максимальное число попыток.
Ошибки при обработке правил подписки
Если включить механизм обработки неподтверждённых сообщений для исключений при фильтрации, то все ошибки, возникающие во время выполнения правила фильтра SQL для подписки, попадают в очередь недоставленных писем (DLQ) вместе с проблемным сообщением. Не используйте этот параметр в рабочей среде, в которой есть типы сообщений, отправляемые в раздел, которые не имеют подписчиков, так как это может привести к большой нагрузке сообщений DLLQ. Таким образом, убедитесь, что все сообщения, отправленные в раздел, имеют по крайней мере одну соответствующую подписку.
Обработка недоставленных сообщений на уровне приложения
Помимо системных функций работы с недоставленными сообщениями, приложения могут использовать очередь DLQ (очередь неприемлемых сообщений) для явного отклонения недопустимых сообщений. Сюда могут относиться сообщения, которые невозможно обработать из-за каких-либо системных проблем, сообщения с данными неправильного формата или сообщения, не прошедшие проверку подлинности при использовании какой-либо схемы безопасности на уровне сообщений.
В .NET его можно сделать, вызвав метод ServiceBusReceiver.DeadLetterMessageAsync.
Рекомендуется указать тип исключения в DeadLetterReason
и трассировку стека исключения в DeadLetterDescription
, так как это упрощает устранение причины проблемы, приводящей к отправке сообщений в мертвую очередь. Помните, что это может привести к тому, что некоторые сообщения могут превышать ограничение квоты на 256 КБ для Служебной шины Azure уровня "Стандартный". Вы можете обновить пространство имен Service Bus с уровня 'Стандартный' до уровня 'Премиум', чтобы иметь большие квоты и лимиты.
Обработка недоставленных писем в сценариях автоматической пересылки
Сообщения отправляются в очередь недоставленных писем в следующих условиях:
- Сообщение проходит более 4 очередей или разделов, которые связаны друг с другом.
- Целевая очередь (или раздел) отключена или удалена.
- Очередь или тема назначения превышает максимальный размер объекта.
Обработка невостребованных сообщений в сценариях отправки
- Если очередь или раздел назначения отключены, сообщение отправляется в очередь недоставленных сообщений (TDLQ) исходной очереди.
- Если целевая очередь или сущность превышают размер сущности, сообщение отправляется в TDLQ исходной очереди.
Отправка недоставленных сообщений для повторной обработки
После устранения проблемы, из-за которой сообщение было отправлено в неактивное состояние, его можно повторно отправить в очередь или раздел для повторной обработки. В некоторых случаях, если в очереди недоставленных писем есть много сообщений, которые необходимо переместить, код, как это может помочь переместить их одновременно. Операторы часто предпочитают иметь пользовательский интерфейс, который позволяет выявлять, какие типы сообщений не прошли обработку, из каких исходных очередей они поступили и по каким причинам, при этом обеспечивая возможность повторной отправки пакетов сообщений для их повторной обработки.
Доступные средства
- Azure Service Bus Explorer позволяет вручную перемещать сообщения между очередями и топиками. Он позволяет просматривать список сообщений и повторно обрабатывать их. Он доступен через портал Azure независимо от пакета SDK, который вы используете для отправки сообщений.
- ServicePulse с NServiceBus упрощает обработку ошибок с помощью этой централизованной панели мониторинга. Быстро визуализировать, группировать, фильтровать и выполнять поиск ошибок, а также эффективно повторять отдельные или сгруппированные сообщения. Доступно для конечных точек NServiceBus.
- ServicePulse с MassTransit предоставляет централизованную панель мониторинга для управления ошибками. Вы можете визуализировать, группировать, фильтровать и искать ошибки с помощью различных критериев. Он также позволяет редактировать и повторно отправлять отдельные сообщения или повторно отправлять сообщения группами. Доступно для конечных точек MassTransit.
Связанный контент
См. раздел Включение функции недоставленных сообщений для очереди или подписки, чтобы узнать о различных способах настройки недоставленных сообщений по истечении срока действия.