SlideShare a Scribd company logo
Concurrent Programming
  Using The Disruptor
  Trisha Gee, Senior Developer at LMAX
The Disruptor?



• Open Source
• Message Passing
The Magic RingBuffer
Example 1:
One Publisher, One Processor
First, create your Event
public class SimpleEvent {
    public static final EventFactory<SimpleEvent> EVENT_FACTORY = new
        SimpleEventFactory();
    private String value;

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    @Override
    public String toString() {
        return "SimpleEvent{" +
                "value='" + value + ''' +
                '}';
    }

    private static class SimpleEventFactory implements EventFactory<SimpleEvent> {
        public SimpleEvent newInstance() {
            return new SimpleEvent();
        }
    }
}
Then create your
                  EventHandler
public class SimpleEventHandler implements EventHandler<SimpleEvent>{
    private List<String> valuesSeen = new ArrayList<String>();

    @Override
    public void onEvent(final SimpleEvent event,
                        final long sequence,
                        final boolean endOfBatch) throws Exception {
        valuesSeen.add(event.getValue());
    }

    public int getNumberOfEventsProcessed() {
        return valuesSeen.size();
    }

    public List<String> getEventValuesSeen() {
        return valuesSeen;
    }
}
Then wire it all together
final RingBuffer<SimpleEvent> ringBuffer =
    new RingBuffer<SimpleEvent>(SimpleEvent.EVENT_FACTORY,
                new SingleThreadedClaimStrategy(RING_BUFFER_SIZE),
                new YieldingWaitStrategy());

final SimpleEventHandler eventHandler = new SimpleEventHandler();

final BatchEventProcessor<SimpleEvent> eventProcessor =
    new BatchEventProcessor<SimpleEvent>(ringBuffer,
                                         ringBuffer.newBarrier(),
                                         eventHandler);

eventHandler.setSequence(eventProcessor.getSequence());
ringBuffer.setGatingSequences(eventProcessor.getSequence());
Great. But Boring.
Example 2:
One Publisher, Three Processors
...and in the Disruptor?
A more complicated
              Event
public class WriteTrackingEvent {
    public static final EventFactory<> EVENT_FACTORY =
        new MyEventFactory();

    private Values redValues = new Values();
    private Values blueValues = new Values();
    private Result result;

    public void setResult(Result result) {
        this.result = result;
    }

    private static final class MyEventFactory implements
            EventFactory<WriteTrackingEvent> {
        public WriteTrackingEvent newInstance() {
            return new WriteTrackingEvent();
        }
    }
}
...a couple of
                 EventHandlers
public class BlueEventHandler implements
        EventHandler<WriteTrackingEvent> {
    @Override
    public void onEvent(WriteTrackingEvent event, long sequence,
                        final boolean endOfBatch) throws Exception {
        event.getBlueValues().setTime(System.currentTimeMillis());
        System.out.println("blue: " + event);
    }
}
public class RedEventHandler implements
        EventHandler<WriteTrackingEvent> {
    @Override
    public void onEvent(WriteTrackingEvent event, long sequence,
                        boolean endOfBatch) throws Exception {
        event.getRedValues().setTime(System.currentTimeMillis());
        System.out.println("red: " + event);
    }
}
...a final EventHandler
public class SummaryEventHandler implements EventHandler<WriteTrackingEvent> {
    private int numberOfEventsProcessed = 0;

    public void onEvent(WriteTrackingEvent event, long sequence,
                        boolean endOfBatch) throws Exception {
        numberOfEventsProcessed++;
        final long blueTimestamp = event.getBlueValues().getTimestamp();
        final long redTimestamp = event.getRedValues().getTimestamp();

        WriteTrackingEvent.Result result;
        if (blueTimestamp < redTimestamp) {
            result = WriteTrackingEvent.Result.BLUE_FIRST;
        } else if (redTimestamp < blueTimestamp) {
            result = WriteTrackingEvent.Result.RED_FIRST;
        } else {
            result = WriteTrackingEvent.Result.SAME_TIME;
        }

        event.setResult(result);
        System.out.println("final: " + event);
    }

    public int getNumberOfEventsProcessed() {
        return numberOfEventsProcessed;
    }
}
Put it all together, and what
                  have you got?
RingBuffer<WriteTrackingEvent> ringBuffer = new
    RingBuffer<WriteTrackingEvent>(WriteTrackingEvent.EVENT_FACTORY,
                                   new SingleThreadedClaimStrategy(RING_BUFFER_SIZE),
                                   new YieldingWaitStrategy());

SequenceBarrier colourSequenceBarrier = ringBuffer.newBarrier();
BatchEventProcessor<WriteTrackingEvent> redEventProcessor = new
    BatchEventProcessor<WriteTrackingEvent>(ringBuffer, colourSequenceBarrier,
                                            new RedEventHandler());

BatchEventProcessor<WriteTrackingEvent> blueEventProcessor = new
    BatchEventProcessor<WriteTrackingEvent>(ringBuffer, colourSequenceBarrier,
                                            new BlueEventHandler());

SequenceBarrier summarySequenceBarrier =
    ringBuffer.newBarrier(redEventProcessor.getSequence(),
                          blueEventProcessor.getSequence());
BatchEventProcessor<WriteTrackingEvent> finalEventProcessor = new
    BatchEventProcessor<WriteTrackingEvent>(ringBuffer, summarySequenceBarrier,
                                            new SummaryEventHandler());

ringBuffer.setGatingSequences(finalEventProcessor.getSequence());
What’s all that gubbins
        on the RingBuffer?
      RingBuffer<WriteTrackingEvent> ringBuffer = new
Buffer<WriteTrackingEvent>(WriteTrackingEvent.EVENT_FA
          new SingleThreadedClaimStrategy(RING_B
                        new YieldingWaitStrategy());
Is that it?

• Multiple publishers
• Different EventHandlers
• The Wizard
More Information

• Blog
• Wiki
• Presentations
Q&A


• We are hiring!
• careers@lmax.com

More Related Content

What's hot (19)

PPTX
Smart Contract programming 101 with Solidity #PizzaHackathon
Sittiphol Phanvilai
 
PPTX
Correcting Common .NET Async/Await Mistakes
Brandon Minnick, MBA
 
PDF
$q and Promises in AngularJS
a_sharif
 
PDF
Anton Moldovan "Load testing which you always wanted"
Fwdays
 
PPT
Expert JavaScript tricks of the masters
Ara Pehlivanian
 
PDF
#Gophercon Talk by Smita Vijayakumar - Go's Context Library
Exotel
 
PDF
Android dev 3
Aravindharamanan S
 
PDF
Asynchronní programování
PeckaDesign.cz
 
PPTX
Understanding reactive programming with microsoft reactive extensions
Oleksandr Zhevzhyk
 
PPT
Gwt RPC
maheshm1206
 
PPTX
JavaScript Promises
L&T Technology Services Limited
 
PDF
Oop assignment 02
MamoonKhan39
 
KEY
Small pieces loosely joined
ennui2342
 
PDF
How to send gzipped requests with boto3
Luciano Mammino
 
PDF
Codepot - Pig i Hive: szybkie wprowadzenie / Pig and Hive crash course
Sages
 
PPTX
Deep Dumpster Diving
RonnBlack
 
PDF
JavaScript Promises
Tomasz Bak
 
PDF
Understanding Asynchronous JavaScript
jnewmanux
 
PPTX
Single server queue (Simulation Project)
Md.zahedul Karim Tuhin
 
Smart Contract programming 101 with Solidity #PizzaHackathon
Sittiphol Phanvilai
 
Correcting Common .NET Async/Await Mistakes
Brandon Minnick, MBA
 
$q and Promises in AngularJS
a_sharif
 
Anton Moldovan "Load testing which you always wanted"
Fwdays
 
Expert JavaScript tricks of the masters
Ara Pehlivanian
 
#Gophercon Talk by Smita Vijayakumar - Go's Context Library
Exotel
 
Android dev 3
Aravindharamanan S
 
Asynchronní programování
PeckaDesign.cz
 
Understanding reactive programming with microsoft reactive extensions
Oleksandr Zhevzhyk
 
Gwt RPC
maheshm1206
 
JavaScript Promises
L&T Technology Services Limited
 
Oop assignment 02
MamoonKhan39
 
Small pieces loosely joined
ennui2342
 
How to send gzipped requests with boto3
Luciano Mammino
 
Codepot - Pig i Hive: szybkie wprowadzenie / Pig and Hive crash course
Sages
 
Deep Dumpster Diving
RonnBlack
 
JavaScript Promises
Tomasz Bak
 
Understanding Asynchronous JavaScript
jnewmanux
 
Single server queue (Simulation Project)
Md.zahedul Karim Tuhin
 

Similar to Trisha gee concurrentprogrammingusingthedisruptor (20)

PDF
A Series of Fortunate Events - Drupalcon Europe, Amsterdam 2014
Matthias Noback
 
PDF
C# Delegates and Event Handling
Jussi Pohjolainen
 
PDF
Clean coding-practices
John Ferguson Smart Limited
 
PDF
The Ring programming language version 1.7 book - Part 16 of 196
Mahmoud Samir Fayed
 
PDF
A Series of Fortunate Events - Symfony Camp Sweden 2014
Matthias Noback
 
PDF
Speed up your Web applications with HTML5 WebSockets
Yakov Fain
 
PDF
The Ring programming language version 1.6 book - Part 15 of 189
Mahmoud Samir Fayed
 
PDF
#JavaFX.forReal() - ElsassJUG
Thierry Wasylczenko
 
KEY
openFrameworks 007 - events
roxlu
 
PDF
Decoupling with Design Patterns and Symfony2 DIC
Konstantin Kudryashov
 
KEY
Android TDD & CI
Marcin Gryszko
 
PPTX
Unit testing patterns for concurrent code
Dror Helper
 
PPTX
A GWT Application with MVP Pattern Deploying to CloudFoundry using Spring Roo
Ali Parmaksiz
 
PPTX
Reactive programming every day
Vadym Khondar
 
ODP
Jersey Guice AOP
Domenico Briganti
 
PPTX
Rx workshop
Ryan Riley
 
PPTX
An intro to cqrs
Neil Robbins
 
PDF
Durable functions 2.0 (2019-10-10)
Paco de la Cruz
 
PDF
Saving lives with rx java
Shahar Barsheshet
 
PDF
33rd Degree 2013, Bad Tests, Good Tests
Tomek Kaczanowski
 
A Series of Fortunate Events - Drupalcon Europe, Amsterdam 2014
Matthias Noback
 
C# Delegates and Event Handling
Jussi Pohjolainen
 
Clean coding-practices
John Ferguson Smart Limited
 
The Ring programming language version 1.7 book - Part 16 of 196
Mahmoud Samir Fayed
 
A Series of Fortunate Events - Symfony Camp Sweden 2014
Matthias Noback
 
Speed up your Web applications with HTML5 WebSockets
Yakov Fain
 
The Ring programming language version 1.6 book - Part 15 of 189
Mahmoud Samir Fayed
 
#JavaFX.forReal() - ElsassJUG
Thierry Wasylczenko
 
openFrameworks 007 - events
roxlu
 
Decoupling with Design Patterns and Symfony2 DIC
Konstantin Kudryashov
 
Android TDD & CI
Marcin Gryszko
 
Unit testing patterns for concurrent code
Dror Helper
 
A GWT Application with MVP Pattern Deploying to CloudFoundry using Spring Roo
Ali Parmaksiz
 
Reactive programming every day
Vadym Khondar
 
Jersey Guice AOP
Domenico Briganti
 
Rx workshop
Ryan Riley
 
An intro to cqrs
Neil Robbins
 
Durable functions 2.0 (2019-10-10)
Paco de la Cruz
 
Saving lives with rx java
Shahar Barsheshet
 
33rd Degree 2013, Bad Tests, Good Tests
Tomek Kaczanowski
 
Ad

Recently uploaded (20)

PDF
HubSpot Main Hub: A Unified Growth Platform
Jaswinder Singh
 
PDF
The Builder’s Playbook - 2025 State of AI Report.pdf
jeroen339954
 
PPTX
WooCommerce Workshop: Bring Your Laptop
Laura Hartwig
 
PDF
HCIP-Data Center Facility Deployment V2.0 Training Material (Without Remarks ...
mcastillo49
 
PDF
Complete JavaScript Notes: From Basics to Advanced Concepts.pdf
haydendavispro
 
PDF
Presentation - Vibe Coding The Future of Tech
yanuarsinggih1
 
PDF
Bitcoin for Millennials podcast with Bram, Power Laws of Bitcoin
Stephen Perrenod
 
PDF
Log-Based Anomaly Detection: Enhancing System Reliability with Machine Learning
Mohammed BEKKOUCHE
 
PDF
Chris Elwell Woburn, MA - Passionate About IT Innovation
Chris Elwell Woburn, MA
 
PDF
How Startups Are Growing Faster with App Developers in Australia.pdf
India App Developer
 
PDF
CIFDAQ Market Insights for July 7th 2025
CIFDAQ
 
PPTX
From Sci-Fi to Reality: Exploring AI Evolution
Svetlana Meissner
 
PPTX
OpenID AuthZEN - Analyst Briefing July 2025
David Brossard
 
PPTX
COMPARISON OF RASTER ANALYSIS TOOLS OF QGIS AND ARCGIS
Sharanya Sarkar
 
PPTX
"Autonomy of LLM Agents: Current State and Future Prospects", Oles` Petriv
Fwdays
 
PPTX
Webinar: Introduction to LF Energy EVerest
DanBrown980551
 
PDF
Agentic AI lifecycle for Enterprise Hyper-Automation
Debmalya Biswas
 
PDF
[Newgen] NewgenONE Marvin Brochure 1.pdf
darshakparmar
 
PDF
CIFDAQ Token Spotlight for 9th July 2025
CIFDAQ
 
PDF
From Code to Challenge: Crafting Skill-Based Games That Engage and Reward
aiyshauae
 
HubSpot Main Hub: A Unified Growth Platform
Jaswinder Singh
 
The Builder’s Playbook - 2025 State of AI Report.pdf
jeroen339954
 
WooCommerce Workshop: Bring Your Laptop
Laura Hartwig
 
HCIP-Data Center Facility Deployment V2.0 Training Material (Without Remarks ...
mcastillo49
 
Complete JavaScript Notes: From Basics to Advanced Concepts.pdf
haydendavispro
 
Presentation - Vibe Coding The Future of Tech
yanuarsinggih1
 
Bitcoin for Millennials podcast with Bram, Power Laws of Bitcoin
Stephen Perrenod
 
Log-Based Anomaly Detection: Enhancing System Reliability with Machine Learning
Mohammed BEKKOUCHE
 
Chris Elwell Woburn, MA - Passionate About IT Innovation
Chris Elwell Woburn, MA
 
How Startups Are Growing Faster with App Developers in Australia.pdf
India App Developer
 
CIFDAQ Market Insights for July 7th 2025
CIFDAQ
 
From Sci-Fi to Reality: Exploring AI Evolution
Svetlana Meissner
 
OpenID AuthZEN - Analyst Briefing July 2025
David Brossard
 
COMPARISON OF RASTER ANALYSIS TOOLS OF QGIS AND ARCGIS
Sharanya Sarkar
 
"Autonomy of LLM Agents: Current State and Future Prospects", Oles` Petriv
Fwdays
 
Webinar: Introduction to LF Energy EVerest
DanBrown980551
 
Agentic AI lifecycle for Enterprise Hyper-Automation
Debmalya Biswas
 
[Newgen] NewgenONE Marvin Brochure 1.pdf
darshakparmar
 
CIFDAQ Token Spotlight for 9th July 2025
CIFDAQ
 
From Code to Challenge: Crafting Skill-Based Games That Engage and Reward
aiyshauae
 
Ad

Trisha gee concurrentprogrammingusingthedisruptor

  • 1. Concurrent Programming Using The Disruptor Trisha Gee, Senior Developer at LMAX
  • 2. The Disruptor? • Open Source • Message Passing
  • 5. First, create your Event public class SimpleEvent { public static final EventFactory<SimpleEvent> EVENT_FACTORY = new SimpleEventFactory(); private String value; public String getValue() { return value; } public void setValue(String value) { this.value = value; } @Override public String toString() { return "SimpleEvent{" + "value='" + value + ''' + '}'; } private static class SimpleEventFactory implements EventFactory<SimpleEvent> { public SimpleEvent newInstance() { return new SimpleEvent(); } } }
  • 6. Then create your EventHandler public class SimpleEventHandler implements EventHandler<SimpleEvent>{ private List<String> valuesSeen = new ArrayList<String>(); @Override public void onEvent(final SimpleEvent event, final long sequence, final boolean endOfBatch) throws Exception { valuesSeen.add(event.getValue()); } public int getNumberOfEventsProcessed() { return valuesSeen.size(); } public List<String> getEventValuesSeen() { return valuesSeen; } }
  • 7. Then wire it all together final RingBuffer<SimpleEvent> ringBuffer = new RingBuffer<SimpleEvent>(SimpleEvent.EVENT_FACTORY, new SingleThreadedClaimStrategy(RING_BUFFER_SIZE), new YieldingWaitStrategy()); final SimpleEventHandler eventHandler = new SimpleEventHandler(); final BatchEventProcessor<SimpleEvent> eventProcessor = new BatchEventProcessor<SimpleEvent>(ringBuffer, ringBuffer.newBarrier(), eventHandler); eventHandler.setSequence(eventProcessor.getSequence()); ringBuffer.setGatingSequences(eventProcessor.getSequence());
  • 9. Example 2: One Publisher, Three Processors
  • 10. ...and in the Disruptor?
  • 11. A more complicated Event public class WriteTrackingEvent { public static final EventFactory<> EVENT_FACTORY = new MyEventFactory(); private Values redValues = new Values(); private Values blueValues = new Values(); private Result result; public void setResult(Result result) { this.result = result; } private static final class MyEventFactory implements EventFactory<WriteTrackingEvent> { public WriteTrackingEvent newInstance() { return new WriteTrackingEvent(); } } }
  • 12. ...a couple of EventHandlers public class BlueEventHandler implements EventHandler<WriteTrackingEvent> { @Override public void onEvent(WriteTrackingEvent event, long sequence, final boolean endOfBatch) throws Exception { event.getBlueValues().setTime(System.currentTimeMillis()); System.out.println("blue: " + event); } } public class RedEventHandler implements EventHandler<WriteTrackingEvent> { @Override public void onEvent(WriteTrackingEvent event, long sequence, boolean endOfBatch) throws Exception { event.getRedValues().setTime(System.currentTimeMillis()); System.out.println("red: " + event); } }
  • 13. ...a final EventHandler public class SummaryEventHandler implements EventHandler<WriteTrackingEvent> { private int numberOfEventsProcessed = 0; public void onEvent(WriteTrackingEvent event, long sequence, boolean endOfBatch) throws Exception { numberOfEventsProcessed++; final long blueTimestamp = event.getBlueValues().getTimestamp(); final long redTimestamp = event.getRedValues().getTimestamp(); WriteTrackingEvent.Result result; if (blueTimestamp < redTimestamp) { result = WriteTrackingEvent.Result.BLUE_FIRST; } else if (redTimestamp < blueTimestamp) { result = WriteTrackingEvent.Result.RED_FIRST; } else { result = WriteTrackingEvent.Result.SAME_TIME; } event.setResult(result); System.out.println("final: " + event); } public int getNumberOfEventsProcessed() { return numberOfEventsProcessed; } }
  • 14. Put it all together, and what have you got? RingBuffer<WriteTrackingEvent> ringBuffer = new RingBuffer<WriteTrackingEvent>(WriteTrackingEvent.EVENT_FACTORY, new SingleThreadedClaimStrategy(RING_BUFFER_SIZE), new YieldingWaitStrategy()); SequenceBarrier colourSequenceBarrier = ringBuffer.newBarrier(); BatchEventProcessor<WriteTrackingEvent> redEventProcessor = new BatchEventProcessor<WriteTrackingEvent>(ringBuffer, colourSequenceBarrier, new RedEventHandler()); BatchEventProcessor<WriteTrackingEvent> blueEventProcessor = new BatchEventProcessor<WriteTrackingEvent>(ringBuffer, colourSequenceBarrier, new BlueEventHandler()); SequenceBarrier summarySequenceBarrier = ringBuffer.newBarrier(redEventProcessor.getSequence(), blueEventProcessor.getSequence()); BatchEventProcessor<WriteTrackingEvent> finalEventProcessor = new BatchEventProcessor<WriteTrackingEvent>(ringBuffer, summarySequenceBarrier, new SummaryEventHandler()); ringBuffer.setGatingSequences(finalEventProcessor.getSequence());
  • 15. What’s all that gubbins on the RingBuffer? RingBuffer<WriteTrackingEvent> ringBuffer = new Buffer<WriteTrackingEvent>(WriteTrackingEvent.EVENT_FA new SingleThreadedClaimStrategy(RING_B new YieldingWaitStrategy());
  • 16. Is that it? • Multiple publishers • Different EventHandlers • The Wizard
  • 17. More Information • Blog • Wiki • Presentations