Every backend team learns the same lesson, usually at 3 AM: your service did not fail because of your code. It failed because a dependency got slow, and your code kept calling it.
The payments API slows to thirty seconds. Your threads block waiting. Incoming requests queue behind those threads. Memory climbs, health checks fail, and the orchestrator restarts you in the middle of the backlog. The dependency never went down. It just got slow, and slowness is contagious.
Then your own retries finish the job. Every timed-out call gets retried, so a thousand requests become four thousand against an API that is already struggling. The dependency never gets a quiet moment to recover, because your good intentions keep hammering it. This is a retry storm, and it turns a partial outage into a full one.
Circuit breakers exist to stop this exact cascade.…