For a renewal reminder that must wait until a business deadline, I would use a main queue with a bounded retry policy and a dead letter queue (DLQ), then make the reminder consumer idempotent. The DLQ is the part that turns a failed background task from a disappearing error into something I can inspect, reprocess, or debug.
That decision is about revenue per hour. I run a one-person SaaS. A queue that needs constant hand-holding steals time from shipping weekly. A queue that silently sends the same renewal reminder twice creates a support problem. I want the smallest system that makes those two risks visible.
How do I handle failed background tasks using a dead letter queue?
Imagine a media business schedules a renewal reminder for the day its contract requires one. The worker receives a task, calls the reminder service, and fails. It might be a temporary network error. It might be malformed data. Those cases should not be treated as the same thing forever.
The main queue gets a finite re-delivery limit.…