2012-01-14 14 views
23

Sto cercando di imparare come utilizzare il framework di messaggistica Disruptor.NET e non riesco a trovare alcun esempio pratico. Ci sono alcuni articoli là fuori con le immagini su come funziona, ma non riesco a trovare da nessuna parte che in realtà vada e ti mostra come implementare i metodi. Quale sarebbe un esempio?Esempio di Disruptor.NET

+0

Questa domanda potrebbe portarti ad alcune informazioni che non hai ancora visto: http://stackoverflow.com/questions/6933347/how-should-one-use-disruptor-disruptor-pattern-to-build-real- world-message-sys –

+0

Il [wiki del progetto ufficiale] (http://code.google.com/p/disruptor-net/w/list) ha alcune informazioni. – caesay

+0

L'unico esempio di codice sul loro sembra essere obsoleto - ad esempio, non riesco a trovare l'interfaccia "IBatchHandler" in qualsiasi punto della build corrente e i parametri del RingBuffer sembrano avere parametri completamente diversi. Sembrerebbe che il sito ufficiale si sia spostato su GitHub ma non riesco a trovare altri esempi/documentazioni sul sito (ma non sono sicuro che lo stia facendo correttamente) - https://github.com/odeheurles/ Il readme di Disruptor-net n. – William

risposta

28

Frustrato che non riuscivo a trovare un "Hello World" funzionante per Disruptor-net, ho smanettato fino a quando non ne ho avuto uno funzionante - vedi sotto. Spero che sia abbastanza auto-esplicativo. Le linee Console.WriteLine sono utili per vedere come funzionano le cose, ad esempio che RingBuffer crea ogni istanza di entrata all'avvio (che ha senso).

Spero che questo aiuti chiunque cerchi aiuto con Disruptor su .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

puoi anche aggiungere note su come eseguirlo? che cosa dovrei aggiungere a un progetto? dovrei scaricarli da qualche parte o dovrei costruirli da solo? – javapowered

+0

può anche qualcuno spiegare un esempio? perché è meglio delle librerie .net standard? quanti thread sono coinvolti? solo uno? non vedo alcuna creazione di thread. – javapowered

+0

La maggior parte delle persone che utilizzano lo schema di interruzione utilizza probabilmente una pipeline a tre fasi, quindi sarebbe bello con un esempio con un Disinput di input e un Disruptor di output. – Fred

2

C'è un post sul blog dettagliata sul modello Disruptor, The Latency Issue. Dimostra come iniziare e utilizzare Disruptor in dettaglio.

+1

Questo collegamento è obsoleto. Il nuovo collegamento è http://www.tradesharp.se/over-6-million-transactions-per-second-in-a-real-time-system-an-out-of-the-box-approach/ –

+0

Nuovo collegamento è anche stantio. – Ozgur