The problem

One thing I have been paying more attention to in backend systems is how they behave when something they depend on stops behaving normally.

An API call to an external service can fail for many reasons. The dependency might be temporarily unavailable, slow to respond, returning errors, or failing consistently.

The first instinct is often simple:

“Try again.”

Sometimes that is exactly what the system needs.

But retrying is not a complete failure strategy.

If the dependency is already struggling, repeatedly sending the same request can create even more traffic. A temporary failure can turn into a larger problem if every caller keeps retrying without any limits.

That is where I started thinking about retries, circuit breakers, and fallbacks as three different tools rather than three interchangeable patterns.