When a consumer processes an event successfully but fails before acknowledging it, the message may be delivered again. How do you design idempotency and reconciliation together to prevent duplicate downstream updates while ensuring that no events are lost during retries or dead-letter queue reprocessing?