This talk is split in two parts:
- The first part describes how and why we end up using the Disruptor at ABC Arbitrage.
- The second part is a catalogue of Disruptor specific patterns and practices.
30. public class MarketDataInfo
{
public int SecurityId;
public long BidPrice;
public long AskPrice;
}
public class ExecutionInfo
{
public int SecurityId;
public long Price;
public long Quantity;
public string ExecutionCode;
}
// ...
31. public class XEvent
{
public XEventType EventType;
public MarketDataInfo MarketData;
public ExecutionInfo Execution;
public TradingSignal1Info TradingSignal1;
// ...
Option #1 Members for all event types
32. public void OnEvent(XEvent data, long seq, bool endOfBatch)
{
switch (data.EventType)
{
case XEventType.MarketData:
OnMarketData(ref data.MarketData);
break;
case XEventType.Execution:
OnExecution(ref data.Execution);
break;
// ...
35. public class XEvent
{
public XEventType EventType;
public object EventData;
}
Option #2 Allocate or pool the event data
36. public void OnEvent(XEvent data, long seq, bool endOfBatch)
{
switch (data.EventType)
{
case XEventType.MarketData:
OnMarketData((MarketDataInfo)data.EventData);
break;
case XEventType.Execution:
OnExecution((ExecutionInfo)data.EventData);
break;
// ...
37. You just scrapped pre-
fetching and introduced
extra synchronization
Congratulations!
38. public class XEvent
{
public XEventType EventType;
public EventInfo EventData;
[StructLayout(LayoutKind.Explicit)]
public struct EventInfo
{
[FieldOffset(0)]
public ExecutionInfo Execution;
[FieldOffset(0)]
public MarketDataInfo MarketData;
}
Option #3 Unions
39. public void OnEvent(XEvent data, long seq, bool endOfBatch)
{
switch (data.EventType)
{
case XEventType.MarketData:
OnMarketData(ref data.EventData.MarketData);
break;
case XEventType.Execution:
OnExecution(ref data.EventData.Execution);
break;
// ...
45. public class XEvent
{
public XEventType EventType;
public ByteBuffer EventData;
// use a zero-copy wrapper like flatbuffer
// to read or write your event data
Option #4 LMAX style
61. Engine A Engine B Engine C
Enqueue multiple times
Store data locally in every consumer
FX rate producer
Engine A Engine B Engine C
FX rate producer
Engine A Engine B Engine C
FX rate producer
Engine A Engine B Engine C
FX rate producer
enqueue
enqueue
enqueue