2012-01-14 17 views
23

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 funcione y le muestra cómo implementar los métodos. ¿Qué sería un ejemplo?Disruptor.NET ejemplo

+0

Esta pregunta podría llevarle a cierta información que aún no ha visto: http://stackoverflow.com/questions/6933347/how-should-one-use-disruptor-disruptor-pattern-to-build-real- world-message-sys –

+0

El [wiki oficial del proyecto] (http://code.google.com/p/disruptor-net/w/list) tiene algo de información. – caesay

+0

El ejemplo de un código en su parece estar desactualizado, por ejemplo, no puedo encontrar la interfaz "IBatchHandler" en ninguna parte de la compilación actual y los parámetros del RingBuffer parecen tener parámetros completamente diferentes. Parece que el sitio oficial se ha movido a GitHub, pero no puedo encontrar ningún otro documento/documentación adicional en el sitio (pero no estoy seguro si lo estoy haciendo correctamente) - https://github.com/odeheurles/ Disruptor-net # readme – William

Respuesta

28

Frustrado de que no pude encontrar un 'Hola mundo' viable para Disruptor-net, jugueteé hasta que conseguí uno funcionando - ver abajo. Es de esperar que sea bastante auto explicativo. Las líneas Console.WriteLine son prácticas para ver cómo funcionan las cosas, por ejemplo, que RingBuffer crea cada instancia de entrada al inicio (lo cual 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); 
      } 
     } 
    } 
} 
+0

también puede agregar notas sobre cómo ejecutarlo? ¿Qué dll debería agregar a un proyecto? ¿Debería descargarlos en algún lado o debería construirlos yo mismo? – javapowered

+0

también alguien puede explicar un ejemplo? ¿Por qué es mejor que el estándar .net libriries? ¿Cuántos hilos están involucrados? ¿solo uno? No veo ninguna creación de hilos. – javapowered

+0

La mayoría de las personas que usan el patrón disruptor probablemente usarán una tubería de tres etapas, por lo que sería bueno con un ejemplo con un disruptor de entrada y un disruptor de salida. – Fred

2

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

+1

Este enlace es obsoleto. El nuevo enlace es http://www.tradesharp.se/over-6-million-transactions-per-second-in-a-real-time-system-an-out-of-the-box-approach/ –

+0

Nuevo enlace está rancio también – Ozgur