2012-01-14 3 views
23

Я пытаюсь узнать, как использовать инфраструктуру обмена сообщениями Disruptor.NET, и я не могу найти никаких практических примеров. Существует немало статей с фотографиями о том, как это работает, но я не могу найти нигде, что действительно происходит, и показывает вам, как реализовать методы. Какой пример?Пример disruptor.NET

+0

Этот вопрос может привести вас к некоторой информации, которую вы еще не видели: http://stackoverflow.com/questions/6933347/how-should-one-use-disruptor-disruptor-pattern-to-build-real- world-message-sys –

+0

[официальный вики проекта] (http://code.google.com/p/disruptor-net/w/list) содержит некоторую информацию. – caesay

+0

Пример одного кода на их, кажется, устарел - например, я не могу найти интерфейс «IBatchHandler» в любой точке текущей сборки, и параметры RingBuffer, похоже, имеют совершенно разные параметры. Казалось бы, официальный сайт переместился в GitHub, но я не могу найти никаких дополнительных примеров/документов на сайте (но я не уверен, что я делаю это правильно) - https://github.com/odeheurles/ Disruptor-net # readme – William

ответ

28

Разочарованный, что я не смог найти работоспособный «Hello World» для Disruptor-net, я поиграл, пока не получил работу, как показано ниже. Надеюсь, это довольно понятно. Строки Console.WriteLine удобны для просмотра того, как все работает - например, RingBuffer создает каждый экземпляр записи при запуске (что имеет смысл).

Надеюсь, что это поможет любому, кто ищет помощь с Disruptor на .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

также можете добавить примечание, как его запустить? какую DLL следует добавить в проект? должен ли я загрузить их где-нибудь, или я должен сам их создать? – javapowered

+0

также может кто-нибудь объяснить пример? почему это лучше, чем стандартные .net libriries? сколько потоков задействовано? только один? Я не вижу создания нитей. – javapowered

+0

Большинство людей, использующих шаблон разрушителя, вероятно, будет использовать трехступенчатый конвейер, поэтому было бы неплохо с примером с входным прерывителем и выходным прерывителем. – Fred

2

Существует подробный блог по образцу Disruptor, The Latency Issue. Он демонстрирует, как начать работу и использовать Disruptor в деталях.

+1

Эта ссылка устарела. Новая ссылка: http://www.tradesharp.se/over-6-million-transactions-per-second-in-a-real-time-system-an-out-of-the-box-approach/ –

+0

Новая ссылка также является устаревшим. – Ozgur