Introducción: Compartimentos aislados
Bulkhead divide recursos en compartimentos aislados para que un fallo no afecte a todo el sistema.
Si un pool se satura, solo ese compartimento falla; los demás siguen operativos.
Es común en conexiones a servicios externos, colas o pools de threads.

Prompt: Bulkhead compartments isolating failures, clean minimal style.
1. Naturaleza: Compartimentos de barco
Los barcos tienen compartimentos estancos para que una filtración no hunda toda la nave.
Bulkhead aplica esa idea: limitar el impacto de una falla.

Prompt: Ship compartments diagram, soft illustration.
2. Mundo Real: Pools por servicio
Un sistema puede tener un pool de conexiones para pagos y otro para reportes.
Si el pool de pagos se satura, los reportes siguen funcionando.

Prompt: Connection pools separated, clean flat style.
3. Implementación en C#: Código Paso a Paso
public class Bulkhead
{
private readonly SemaphoreSlim _pool;
public Bulkhead(int max) => _pool = new SemaphoreSlim(max);
public async Task ExecuteAsync(Func action)
{
await _pool.WaitAsync();
try { await action(); }
finally { _pool.Release(); }
}
}
Separar pools por tipo de operación evita que tareas intensas bloqueen recursos críticos.
Se complementa con Circuit Breaker para un aislamiento más completo.
4. Bulkhead vs Circuit Breaker
Bulkhead limita recursos; Circuit Breaker corta el flujo ante fallos.
Ambos se combinan para controlar saturación y evitar cascadas.
5. Diagrama UML

Prompt: UML diagram of bulkhead pattern, clean vector layout.

Prompt: Bulkhead resource isolation diagram, minimal infographic style.
⚠️ Cuándo NO Usar Bulkhead
- Si el sistema es pequeño y no requiere aislamiento.
- Si no tienes métricas para dimensionar pools.
- Si la complejidad adicional no se justifica.
💪 Ejercicio
Implementa dos pools separados: uno para operaciones críticas y otro para tareas batch.
Conclusión
Bulkhead evita que un fallo local se convierta en un desastre global.
Con buen dimensionamiento, mejora la estabilidad y resiliencia.