02 / RELIABILITY

Retries are a product decision, not just an error handler.

A retry can save a user from a temporary failure. It can also repeat an action that already succeeded. The difference is where dependable systems are made.

4 minute read · Reliability

A timeout is not a no.

When a request times out, the caller knows only that it did not receive a response. The remote system may have rejected the work, still be processing it, or have completed it successfully. Treating every timeout as permission to repeat the operation is how duplicate work enters a system.

scroll ↓ uncertainty needs a name

retry safely
01Request IDsame work, same identity
02Unknown statetimeout is not a no
03Recoveryreturn the known outcome

A retry only becomes safe when the operation can be recognised.

Name the operation.

For important actions, give the work a stable identity before sending it. That identity can be used to recognise a repeated request and return the already-created result instead of performing the action again. This is the practical value of idempotency.

A reliable retry is not “try again.” It is “try again without changing the result twice.”

Make uncertainty visible.

Some operations cannot be confirmed immediately. Design for that state explicitly: record the request, expose its status, and make the eventual outcome discoverable. A clear “processing” state is often more honest—and more useful—than pretending a timeout means nothing happened.

Retries also need limits, backoff, and good observability. Those details stop a temporary dependency problem from turning into a self-inflicted traffic spike. More importantly, they make the recovery path understandable for both the system and the people operating it.