Routing failed messages somewhere they cannot block the main queue is the correct design, and it converts a loud failure into a silent one unless something alerts on the depth.
$ rabbitmqctl list_queues name messages consumers
orders.placed 0 4
orders.placed.dead 7 0 ← nobody is reading this
# the alert that has to exist alongside the queue:
# rabbitmq_queue_messages{queue="orders.placed.dead"} > 0 for 5m
# and the runbook: what is in it, why, and how to replay
Zero consumers on the dead letter queue is deliberate — it is an inbox rather than a stage — which is precisely why the depth needs a threshold of one rather than a large number. Without the alert, lost orders accumulate for weeks and the discovery is a customer complaint. A replay mechanism has to be built at the same time, because the first thing anyone will want after reading the alert is to put the messages back.