Что такое RabbitMQ dead letter exchange
Что проверяют
Понимаете ли вы, куда девается сообщение, которое потребитель не смог обработать, и умеете ли строить обработку ошибок в очередях так, чтобы данные не терялись и не крутились бесконечно.
Как отвечать
Dead letter exchange это обычный обменник, в который брокер сам перекладывает сообщения, покинувшие очередь не из-за успешной обработки. Настраивается аргументами очереди x-dead-letter-exchange и необязательным x-dead-letter-routing-key, по умолчанию ключ маршрутизации сохраняется.
Сообщение уходит в DLX, когда потребитель ответил basic.reject или basic.nack с requeue=false, когда истёк TTL сообщения или очереди, когда очередь переполнена по длине или объёму, а в quorum-очереди ещё и когда превышен delivery-limit.
args = {
"x-dead-letter-exchange": "dlx",
"x-dead-letter-routing-key": "orders.failed",
}
channel.queue_declare(queue="orders", durable=True, arguments=args)В заголовке x-death брокер копит историю: сколько раз, из какой очереди и по какой причине. На этом строят отложенный повтор: очередь-отстойник с TTL, чей DLX смотрит обратно в рабочий обменник, плюс проверка счётчика, чтобы после нескольких кругов сообщение осело в разборе окончательно.
Где спотыкаются
Думают, что брокер сам считает попытки. Классическая очередь не считает ничего: если отвечать nack с requeue=True, сообщение вернётся в голову очереди и будет крутиться вечно, занимая потребителя. Счётчик берут из x-death или ведут в своём заголовке.
Путают недоставленное с отклонённым. Сообщение, которое обменник не смог никуда направить, в DLX не попадает: для этого есть alternate exchange и возврат издателю при публикации с флагом mandatory.
Полагаются на TTL как на точный таймер. В классической очереди срок проверяется, когда сообщение доходит до головы, поэтому за долгоживущим сообщением короткое будет ждать своей очереди, и отложенный повтор случится позже расчётного.