c# disruptor-pattern

c# - Ejemplo de Disruptor.NET



disruptor-pattern (2)

Hay una publicación de blog detallada sobre el patrón de Disruptor, The Latency Issue . Demuestra cómo comenzar y usar el Disruptor en detalle.

Estoy tratando de aprender a usar el marco de mensajería Disruptor.NET, y no puedo encontrar ningún ejemplo práctico. Hay bastantes artículos con imágenes sobre cómo funciona, pero no puedo encontrar ningún lugar que realmente vaya y te muestra cómo implementar los métodos. ¿Cuál sería un ejemplo?


Frustrado por no haber podido encontrar un ''Hello World'' viable para Disruptor-net, juguetee hasta que encontré uno, vea más abajo. Esperemos que sea bastante autoexplicativo. Las líneas Console.WriteLine son útiles para ver cómo funcionan las cosas, por ejemplo, que RingBuffer crea cada instancia de entrada en el inicio (lo que tiene sentido).

Espero que esto ayude a cualquiera que busque ayuda con Disruptor en .NET.

using System; using System.Linq; using System.Threading; using System.Threading.Tasks; using Disruptor; using Disruptor.Dsl; namespace DisruptorTest { public sealed class ValueEntry { public long Value { get; set; } public ValueEntry() { Console.WriteLine("New ValueEntry created"); } } public class ValueAdditionHandler : IEventHandler<ValueEntry> { public void OnNext(ValueEntry data, long sequence, bool endOfBatch) { Console.WriteLine("Event handled: Value = {0} (processed event {1}", data.Value, sequence); } } class Program { private static readonly Random _random = new Random(); private static readonly int _ringSize = 16; // Must be multiple of 2 static void Main(string[] args) { var disruptor = new Disruptor.Dsl.Disruptor<ValueEntry>(() => new ValueEntry(), _ringSize, TaskScheduler.Default); disruptor.HandleEventsWith(new ValueAdditionHandler()); var ringBuffer = disruptor.Start(); while (true) { long sequenceNo = ringBuffer.Next(); ValueEntry entry = ringBuffer[sequenceNo]; entry.Value = _random.Next(); ringBuffer.Publish(sequenceNo); Console.WriteLine("Published entry {0}, value {1}", sequenceNo, entry.Value); Thread.Sleep(250); } } } }