Saltar al contenido principal

Bulkhead (Límite de Concurrencia)

La política bulkhead limita el número de ejecuciones concurrentes y opcionalmente pone en cola las solicitudes excedentes. Previene que una sola dependencia consuma todos los recursos disponibles.

Uso Básico

var policy = ResiliencePolicy.Create()
.Bulkhead(maxConcurrent: 10, maxQueued: 20)
.Build();

Opciones de Configuración

var policy = ResiliencePolicy.Create()
.Bulkhead(opts =>
{
opts.MaxConcurrency = 10; // máx. ejecuciones paralelas
opts.MaxQueueSize = 50; // máx. solicitudes en cola
opts.QueueTimeout = TimeSpan.FromSeconds(5); // tiempo de espera en cola
opts.OnRejected = context =>
{
_logger.LogWarning("Bulkhead rechazó solicitud — sistema al máximo de capacidad");
return Task.CompletedTask;
};
})
.Build();

Manejo de Rechazo

Cuando el bulkhead está lleno, lanza BulkheadRejectedException:

try
{
var result = await policy.ExecuteAsync<string>(async ct =>
{
return await _expensiveOperation.RunAsync(ct);
});
}
catch (BulkheadRejectedException ex)
{
// Retornar 429 o encolar en trabajo en segundo plano
return Results.StatusCode(429);
}

Casos de Uso

// Limitar llamadas al servicio de pagos a 5 concurrentes
var paymentPolicy = ResiliencePolicy.Create()
.Bulkhead(maxConcurrent: 5, maxQueued: 10)
.Timeout(TimeSpan.FromSeconds(30))
.Build();

// No exceder el pool de conexiones de la base de datos
var dbPolicy = ResiliencePolicy.Create()
.Bulkhead(opts =>
{
opts.MaxConcurrency = 20; // igual al tamaño del pool
opts.MaxQueueSize = 100;
})
.Build();