Pattern
Bulkhead
Problem
One misbehaving caller or workload consumes all your resources (threads, connections, memory) and starves everyone else.
Context
A shared resource pool + heterogeneous workloads = correlated failure. One expensive query eats the whole DB connection pool.
Solution
Partition resources by workload class. Give each caller/workload its own pool (threads, connection pool, memory bucket). When one workload is misbehaving, its pool exhausts — others are unaffected.
Trade-offs
- Wasted capacity: each partition needs its own headroom
- Complex to configure — how many partitions, how big?
- Cross-partition orchestration is harder
Failure modes
- Sizing mistakes: partition too small, legitimate workload throttled
- Cross-cutting concern (auth) still shared — one point of failure remains
- Config drift over time
When to use
- Multi-tenant systems (per-tenant pools)
- Heterogeneous workloads (fast queries vs expensive queries)
- Any shared resource pool that could be starved
When NOT to use
- Homogeneous workloads — one pool is fine
- Small-scale systems — over-engineering
Systems that use this pattern
Where this pattern gets applied on the platform — concrete usage context per system.