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

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

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

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

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

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

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

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

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

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

В .NET можно использовать FormatDeadLetterPath этот метод.

QueueClient.FormatDeadLetterPath(queuePath)
SubscriptionClient.FormatDeadLetterPath(topicPath, subscriptionName)

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

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

Изображение, показывающее 62 сообщения в очереди недоставленных писем.

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

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

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

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

Срок жизни

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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