Why it matters
Without bulkheads, a hanging downstream can consume all threads in the calling service, taking down every code path. With bulkheads, only the affected dependency's callers hang; the rest of the service works.
The architecture
Thread pool isolation: dedicated pool per downstream dependency. If service A hangs, only its pool fills; other services still get threads.
Connection pool isolation: dedicated DB connections per code path or tenant. Runaway query on one tenant doesn't consume all connections.
How it works end to end
Process isolation: run critical services in separate processes. A crash in one doesn't take down others. Container per service enforces this.
Semaphore-based bulkhead: lightweight version limits concurrent access to a resource without dedicated thread pool.
Bulkhead + circuit breaker: bulkhead contains the failure; breaker stops sending traffic to the failed dependency.