A retry feels free because it is written as a few lines of configuration. In practice it is a second real request that consumes the same network socket, thread, and pool slot as the first, a point the retry and timeout guide at the System Design Academy makes explicitly: "a retry is not free error handling" (retry and timeout patterns). The problem is timing. Retries fire when errors are happening, and errors cluster when the downstream is degraded. So the moment your dependency has the least spare capacity is the same moment your callers multiply their offered load.
Connection pools make this worse than the raw request count suggests. A pool only cycles as fast as connections come back. As one systems write-up puts it, a pool of 100 connections returning in 10 milliseconds each can serve 10,000 queries per second, while 1,000 connections returning in 100 milliseconds each is "more exhausted" because circulation is slower (connection pool exhaustion). Slow calls hold their slot longer, so the same concurrency cap absorbs fewer requests per second, and then the retries arrive on top.
That is the trap. Your concurrency cap is a limit on requests in flight, not on requests offered. Retries sit outside the primary request but inside the same cap when they share a pool, a client, or a rate-limited API quota. If you size the cap for primary traffic alone, the retries have nowhere to go, and they either queue (inflating latency, which causes more timeouts, which causes more retries) or fail with a pool timeout, which the caller may retry again.
Two metrics tell you whether you are in this regime. The first is active connection count: a value pinned at the pool maximum for more than a few seconds is a warning sign, and a count that climbs and never recovers is a leak rather than a load problem (connection pool exhaustion). The second is acquisition wait time. Under 1 millisecond is healthy, and above 10 milliseconds means the pool is congested (connection pool exhaustion). Both move before anyone notices, which is why the fix belongs in capacity math rather than in an alert.



