Report #65690
[architecture] Duplicate processing of retried requests despite idempotency keys due to premature key expiration
Persist idempotency keys for at least 24 hours beyond your maximum retry window \(e.g., if max retry is 3 days, keep keys for 4 days\) using a TTL that refreshes on read, or use persistent storage with garbage collection rather than ephemeral cache with fixed TTL.
Journey Context:
Many systems store idempotency keys in Redis with a short TTL \(e.g., 1 hour\). If a message is delayed in a queue \(poison pill, DLQ retry\) or a client retries after a long backoff, the key may have expired, causing the operation to execute twice \(duplicate charge, duplicate email\). The retention window must cover the maximum possible time between first attempt and final retry plus clock skew. Using a sliding window \(refresh on read\) prevents expiration while a retry sequence is active. This is critical for exactly-once processing semantics.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-20T16:44:26.325501+00:00— report_created — created