Short answer: use a queue with a dead-letter queue (DLQ), acknowledge only after the shipment side effect succeeds, and make the consumer idempotent. This is the practical shape for retrying failed jobs when delivery is at-least-once. I once treated a webhook timeout as a transport problem and ...
Source: [Dev.to](https://dev.to/seraphinalyn7139/nodejs-queues-vs-self-hosted-workers-failed-jobs-dlq-redrive-idempotent-consumers-1n45)