Что такое Dead Letter Queue (DLQ)
Dead Letter Queue (DLQ) — это очередь, куда могут перенаправляться сообщения, которые не смогли обработать получатели в обычных очередях. Сообщения могут не обработаться по ряду причин, например, из-за изменившихся состояний отправителя или получателя. Перенаправленные в DLQ сообщения будут храниться там для дальнейшей диагностики и больше не будут мешать работе приложений.
Если сообщение не удается считать из очереди после заданного количества попыток, то его можно перенаправить в DLQ. Количество попыток считывания и идентификатор DLQ определяются политикой перенаправления, установленной для очереди из которой будут перемещаться сообщения.
Политика перенаправления
Условия перенаправления сообщений в DLQ задаются политикой перенаправления.
Политика перенаправления настраивается с помощью атрибута RedrivePolicy
в методах CreateQueue и SetQueueAttributes.
В атрибуте указываются DLQ, куда будут перемещаться сообщения, и параметр maxReceiveCount
, определяющий максимальное количество попыток получения сообщения перед отправкой в DLQ. Когда значение параметра ReceiveCount
у сообщения превышает значение maxReceiveCount
, сообщение перенаправляется в DLQ. При перемещении в DLQ сообщение сохраняет свой идентификатор.
Применение
Со стандартными очередями
DLQ следует использовать со стандартными очередями, когда вам не важен порядок доставки сообщений. В стандартных очередях сообщения хранятся до истечения срока хранения. Если срок хранения сообщения истечет, то сообщение будет удалено из очереди.
Если вам необходимо обрабатывать большое количество сообщений, среди которых часто попадаются те, которые не удается обработать потребителям, то используйте DLQ, чтобы не ждать окончания срока хранения дефектных сообщений, а убирать их из основной очереди после нескольких неудачных попыток обработки. Это позволит снизить затраты и уменьшить нагрузку на оборудование и виртуальные машины. Большое количество необработанных сообщений в стандартных очередях может замедлить работу ваших приложений.
Для стандартных очередей DLQ тоже должна быть стандартной очередью.
С очередями FIFO
При использовании DLQ с очередями FIFO может нарушиться порядок обработки сообщений. Если сообщение из группы не будет обработано, то прекратится обработка всей группы сообщений. Получатель может продолжить обработку этой группы сообщений только после того, как дефектное сообщение будет успешно обработано. Убедитесь, что ваше приложение корректно обрабатывает все сообщения, иначе вся очередь FIFO может быть заблокирована из-за одного сообщения.
Для очереди FIFO DLQ тоже должна быть очередью FIFO.