A message that fails repeatedly either blocks the queue behind it or is discarded, and both are worse than setting it aside. A dead letter queue is the third option, and it is only useful if someone looks at it.
# rabbitmq: route rejected messages elsewhere after N attempts
x-dead-letter-exchange: dlx
x-dead-letter-routing-key: orders.failed
# and alert on depth, or it is a folder nobody opens
depth(orders.failed) > 0 for 10m
The alert is the part people skip, and without it the queue is an archive of problems nobody knows about — usually discovered weeks later when a customer asks why something never happened. Keep the original message and the failure reason together, or triage means guessing. Replaying is a first-class operation and should be a command, not an afternoon with a script.