Обзор очередей недоставленных сообщений служебной шины

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

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

Очередь недоставленных сообщений

Очередь недоставленных сообщений предназначена для хранения сообщений, которые невозможно доставить ни одному адресату либо не удалось обработать. Сообщение из очереди DLQ можно извлечь и изучить. Приложение с помощью оператора может исправить проблемы и повторно отправить это сообщение, зарегистрировать ошибку и предпринять действие по исправлению.

С точки зрения интерфейса API и протокола очередь DLQ очень похожа на другие очереди за исключением того, что сообщения могут отправляться только посредством операции недоставленного сообщения родительской сущности. Кроме того, в ней не отслеживается время жизни и из нее нельзя удалить сообщение. Очередь недоставленных сообщений полностью поддерживает доставку с блокировкой для просмотра и транзакционные операции.

Автоматическая очистка очереди DLQ не выполняется. Сообщения остаются в очереди DLQ, пока вы явно не извлечете их оттуда и не завершите недоставленное сообщение.

Количество сообщений в очереди недоставленных сообщений

Нет возможности получить количество сообщений в очереди недоставленных сообщений на уровне разделов. Это связано с тем, что сообщения не сидят на уровне темы. Вместо этого, когда отправитель отправляет сообщение в раздел, оно за несколько миллисекунд передается в подписку этого раздела и уже не находится на уровне раздела. Это означает, что сообщения нужно просматривать в очереди недоставленных сообщений, сопоставленной с подпиской нужного раздела. В следующем примере Service Bus Explorer показывает, что в очереди недоставленных сообщений для подписки test1 есть 62 сообщения.

Image showing 62 messages in the dead-letter queue.

Количество сообщений в очереди недоставленных сообщений можно узнать с помощью команды Azure CLI az servicebus topic subscription show.

Перемещение сообщений в очередь DLQ

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

Причина недоставленных сообщений. Описание ошибки недоставленных сообщений.
HeaderSizeExceeded Превышен максимальный размер для этого потока.
TTLExpiredException Время жизни сообщения истекло, и оно было перемещено в очередь недоставленных. Дополнительные сведения см. в разделе Срок жизни.
Идентификатор сеанса имеет значение NULL. Сущность, поддерживающая сеансы, не допускает использование сообщений, идентификатор сеанса которых имеет значение null.
MaxTransferHopCountExceeded Превышено максимальное количество допустимых прыжков при переадресации между очередями. Задано значение 4.
MaxDeliveryCountExceeded Сообщение не удалось обработать после максимально возможного количества попыток доставки. Дополнительные сведения см. в разделе Максимальное число доставок.

Максимальное число доставок

Существует ограничение на количество попыток доставки сообщений для очередей и подписок служебная шина. Значение по умолчанию — 10. Всякий раз, когда сообщение доставляется с блокировкой для просмотра, но затем от него явно отказываются или срок действия блокировки истекает, значение счетчика увеличивается. Если число доставок превышает это ограничение, сообщение перемещается в очередь DLQ. Для сообщения в DLQ задана MaxDeliveryCountExceededпричина недоставленной буквы: Это поведение нельзя отключить, но можно увеличить максимальное число попыток.

Срок жизни

При включении функции недоставленных сообщений для очередей или подписок все сообщения с истекшим сроком действия перемещаются в очередь DLQ. Код причины недоставки имеет значение: TTLExpiredException

Отложенные сообщения не будут удалены и перемещены в очередь недоставленных писем после истечения срока их действия. В этом весь замысел.

Ошибки при обработке правил подписки

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

Недоставленные сообщения на уровне приложения

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

Это можно сделать, вызвав метод ServiceBusReceiver.DeadLetterMessageAsync.

Рекомендуется включить тип исключения в DeadLetterReason трассировку стека исключения, DeadLetterDescription так как это упрощает устранение причины проблемы, что приводит к недоставке сообщений. Помните, что это может привести к тому, что некоторые сообщения превышают ограничение квоты на 256 КБ уровня Служебная шина Azure "Стандартный", что означает, что уровень "Премиум" должен использоваться для рабочих сред.

Недоставка в сценариях автоматического пересылки

Сообщения отправляются в очередь недоставленных писем в следующих условиях:

  • Сообщение проходит более 4 очередей или разделов, которые связаны друг с другом.
  • Целевая очередь (или раздел) отключена или удалена.
  • Очередь или раздел назначения превышает максимальный размер сущности.

Недоставка при отправке с помощью сценариев

  • Если очередь или раздел назначения отключены, сообщение отправляется в очередь недоставленных сообщений (TDLQ) исходной очереди.
  • Если очередь или раздел назначения удалены, возникает исключение 404.
  • Если целевая очередь или сущность превышают размер сущности, сообщение отправляется в TDLQ исходной очереди.

Путь к очереди недоставленных сообщений

Вы можете обратиться к очереди недоставленных сообщений с помощью следующего синтаксиса:

<queue path>/$deadletterqueue
<topic path>/Subscriptions/<subscription path>/$deadletterqueue

Отправка недоставленных сообщений для повторной обработки

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

Такие инструменты, как Служебная шина Azure Обозреватель позволяют вручную перемещать сообщения между очередями и разделами. Если в очереди недоставленных писем есть много сообщений, которые необходимо переместить, код, как это , может помочь переместить их одновременно. Операторы часто предпочитают использовать пользовательский интерфейс, чтобы они могли устранять сбой обработки типов сообщений, из каких исходных очередей и по каким причинам, при этом возможность повторной отправки пакетов сообщений для повторной обработки. Такие средства, как ServicePulse с NServiceBus , предоставляют эти возможности.

Следующие шаги

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