Bulkhead Pattern en C#: Guía Completa

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.

Bulkhead
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.

Barco
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.

Pools
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

UML Bulkhead
Prompt: UML diagram of bulkhead pattern, clean vector layout.
Flujo Bulkhead
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.