Imagina que estás en un supermercado. El cajero es rapidísimo, pero solo hay una cinta transportadora. Cada vez que alguien pone un producto, el cajero tiene que gritar: «¡Oigan todos, voy a tocar esta caja de cereales, nadie más la toque!». Eso es básicamente un Lock. Ahora imagina que, para evitar peleas, el supermercado decide que cada producto debe ser metido en una bolsa nueva, usada una vez y luego tirada a la basura. Eso es el Garbage Collector volviéndose loco.
El Disruptor (nacido en LMAX para trading de alta frecuencia) dice: «Basta de tonterías». En lugar de colas que crecen y mueren, usa un Ring Buffer (un anillo circular de memoria pre-asignada). Es como una calesita donde los datos nunca se bajan; simplemente los sobrescribimos cuando ya pasaron por todos los procesos.

¿Por qué te importa?
- Zero GC Pressure: Reutilizamos los mismos objetos. El recolector de basura puede irse de vacaciones.
- Mechanical Sympathy: Está diseñado para cómo funcionan los procesadores modernos (cache lines, pre-fetching).
- Latencia Predecible: No hay picos de «pausa» por limpieza de memoria.
Manos a la Obra: Implementando en C#
Para esto usaremos la librería Disruptor-net (disponible en NuGet). Vamos a simular un sistema de procesamiento de transacciones bancarias donde la velocidad lo es todo.
1. El Evento (El contenedor de datos)
En lugar de crear un objeto por cada mensaje, creamos una clase que «vive» para siempre en el anillo.
public class OperacionBancaria
{
// Datos que mutarán en el Ring Buffer
public long Id { get; set; }
public decimal Monto { get; set; }
public string Status { get; set; } = "Pendiente";
public void Limpiar() // Para dejarlo listo para el siguiente ciclo
{
Status = "Pendiente";
}
}
2. El Handler
Aquí es donde ocurre la magia. Nota que no hay async/await pesados; queremos que el hilo vuele.
public class ValidadorHandler : IEventHandler<OperacionBancaria>
{
public void OnEvent(OperacionBancaria data, long sequence, bool endOfBatch)
{
// Simulamos validación ultra rápida
if (data.Monto > 1000000)
data.Status = "Necesita aprobación del jefe mafioso";
else
data.Status = "Validada";
// Console.WriteLine es lento, pero para el ejemplo sirve:
// Console.WriteLine($"[Seq: {sequence}] Procesada: {data.Id}");
}
}
3. Configurando la Calesita / Carrusel (El Disruptor)
Aquí orquestamos todo. Usamos un tamaño de buffer que sea potencia de 2 (truco de bajo nivel para que el procesador use operaciones binarias rápidas en lugar de divisiones).
// 1. Definir el tamaño (debe ser potencia de 2, ej: 1024, 4096)
int bufferSize = 1024;
// 2. Crear el Disruptor
var disruptor = new Disruptor<OperacionBancaria>(
() => new OperacionBancaria(), // Factoría de objetos
bufferSize,
TaskScheduler.Default
);
// 3. Conectar el handler (puedes encadenar varios con .Then())
disruptor.HandleEventsWith(new ValidadorHandler());
// 4. ¡Arrancamos motores!
var ringBuffer = disruptor.Start();
// --- PUBLICAR UN EVENTO ---
long sequence = ringBuffer.Next(); // Pedimos el siguiente espacio
try
{
var evento = ringBuffer[sequence]; // Obtenemos el objeto pre-existente
evento.Id = 12345;
evento.Monto = 50.5m;
}
finally
{
ringBuffer.Publish(sequence); // Avisamos que ya puede procesarse
}
El Veredicto
No te voy a mentir con marketing de LinkedIn. El Disruptor es una bestia, pero tiene sus bemoles:
- Pros: Es ridículamente rápido. Si necesitas procesar millones de mensajes por segundo con latencias de microsegundos, no hay nada mejor en .NET.
- Contras: Es complejo. Si tu aplicación solo procesa 100 pedidos por minuto, usar Disruptor es como usar un acelerador de partículas para tostar pan. Además, debugear problemas de concurrencia en un Ring Buffer puede hacerte cuestionar tu elección de carrera.
Conclusión
El Disruptor es para cuando el rendimiento no es un «plus», sino un requisito de vida o muerte. Es el paso de ser un desarrollador que «mueve datos» a ser uno que «doma el silicio».
Reto: Intenta implementar un sistema donde un handler dependa de otro (ej: Validar -> Guardar en DB -> Notificar). Con disruptor.HandleEventsWith(h1).Then(h2), verás que la orquestación es más fluida que el tráfico un domingo a las 3 AM.
