I am trying to learn how to use the Disruptor.NET messaging framework, and I can't find any practical examples. There are quite a few articles out there with pictures about how it works, but I can't find anywhere that actually goes and shows you how to implement the methods. What would be an example?
Disruptor.NET example
Asked Answered
This question might lead you to some information you haven't seen yet: #6933847 –
Discommodity
The official project wiki has some information. –
Rusch
The one code example on their seems to be outdated - for instance, I can't find the interface "IBatchHandler" anywhere in the current build and the parameters of the RingBuffer seems to have entirely different parameters. It would seem that the official site has moved to GitHub but I can't find any additional examples/documentations on the site (but I'm not sure if I am doing it correctly) - github.com/odeheurles/Disruptor-net#readme –
Rozanna
Frustrated that I couldn't find a workable 'Hello World' for Disruptor-net, I fiddled around until I got one working. See below. The Console.WriteLine
lines are handy for seeing how things work. For example, the RingBuffer creates each entry instance at start-up (which makes sense).
Hopefully this helps anyone looking for help with Disruptor on .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 power 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);
}
}
}
}
also can you add note how to run it? what dll should I add to a project? should I download them somewhere or I should build them myself? –
Linolinocut
also can someone explaing an example? why it's better than standard .net libriries? how many threads are involved? just one? i don't see any threads creation. –
Linolinocut
Most people using the disruptor pattern would likely be using a three stage pipeline, so it would be nice with an example with an Input Disruptor and an Output Disruptor. –
Latrena
The comment for
_ringSize
is wrong. The value should be a power of 2, not a multiple of 2. –
Grotius Thanks @tzachs, updated the answer with correct comment on _ringSize. –
Find
There is a detailed blog post on the Disruptor pattern, The Latency Issue. It demonstrates how to get started and use the Disruptor in detail.
This link is stale. New link is tradesharp.se/… –
Gorden
New link is stale too. –
Whitefish
© 2022 - 2024 — McMap. All rights reserved.