Discussion, Blogs & Other Useful Links
- Disruptor Google Group
- Bad Concurrency (Michael Barker)
- LMAX (Planet)
- LMAX Exchange
- Disruptor presentation @ QCon SF
- Disruptor Technical Paper
- Mechanical Sympathy (Martin Thompson)
- Martin Fowler's Technical Review
- .NET Disruptor Port
3.0.1 Released (16-Apr-2013)
- Remove Sequencer.ensureAvailable() and move functionality into the ProcessingSequenceBarrier.
- Add get() method and deprecate getPublished() and getPreallocated() from the RingBuffer.
- Add TimeoutException to SequenceBarrier.waitFor().
- Fix off by one bug in MultiProducerSequencer.publish(lo, hi).
- Improve testing for Sequencers.
3.0.0 Released (10-Apr-2013)
- Add remaining capacity to RingBuffer
- Add batch publish methods to Sequencer
- Add DataProvider interface to decouple the RingBuffer and BatchEventProcessor
- Upgrade to gradle 1.5
- Make Sequencer public
- Refactoring, merge Publisher back into Sequencer and some of the gating sequence repsonsibilities up to the sequencer.
- Significant Javadoc updates (thanks Jason Koch)
- DSL support for WorkerPool
- Small performance tweaks
- Add TimeoutHandler and TimeoutBlockingWaitStrategy and support timeouts in BatchEventProcessor
- Remove millisecond wakeup from BlockingWaitStrategy
- Add RingBuffer.claimAndGetPreallocated
- Add RingBuffer.isPublished
- Remove claim strategies and replace with Publishers/Sequences, remove pluggability of claim strategies.
- Introduce new multi-producer publisher algorithm (faster and more scalable).
- Introduce more flexible EventPublisher interface that allow for static definition of translators that can handle local values.
- Allow for dynamic addition of gating sequences to ring buffer. Default it to empty, will allow messages to be sent and the ring buffer to wrap if there are no gating sequences defined.
- Remove batch writes to the ring buffer.
- Remove timeout read methods.
- Switch to gradle build and layout the source maven style.
- API change, remove RingBuffer.get, add RingBuffer.getPreallocated for producers and RingBuffer.getPublished for consumers.
- Change maven dependency group id to com.lmax.
- Added PhasedBackoffStrategy.
- Remove explicit claim/forcePublish and supply a resetTo method.
- Added better handling of cases when the gating sequence is ahead of the cursor value.
2.10.4 Released (13-Nov-2012)
- Fix for removing non-existent sequences from a SequenceGroup (Issue #30)
- Remove numWaiters optimisation from BlockingWaitStrategy
Read This First
To understand the problem the Disruptor is trying to solve, and to get a feel for why this concurrency framework is so fast, read the Technical Paper. It also contains detailed performance results.
And now for some words from our sponsors... LMAX are recruiting once again. If you are interested in working with a great team, with some amazing technology, and think you can add something to the mix then please check out our jobs page.
What is the Disruptor?
LMAX aims to be the fastest trading platform in the world. Clearly, in order to achieve this we needed to do something special to achieve very low-latency and high-throughput with our Java platform. Performance testing showed that using queues to pass data between stages of the system was introducing latency, so we focused on optimising this area.
The Disruptor is the result of our research and testing. We found that cache misses at the CPU-level, and locks requiring kernel arbitration are both extremely costly, so we created a framework which has "mechanical sympathy" for the hardware it's running on, and that's lock-free.
This is not a specialist solution, it's not designed to work only for a financial application. The Disruptor is a general-purpose mechanism for solving a difficult problem in concurrent programming.
It works in a different way to more conventional approaches, so you use it a little differently than you might be used to. For example, applying the pattern to your system is not as simple as replacing all your queues with the magic ring buffer. We've got code samples to guide you, a growing number of blogs and articles giving an overview of how it works, the technical paper goes into some detail as you'd expect, and the performance tests give examples of how to use the Disruptor:
If you prefer real, live people explaining things instead of a dry paper or content-heavy website, there's always the presentation Mike and Martin gave at QCon San Francisco. If you fancy a natter with the folks involved head over to our Discussion Group. Martin will also witter on occasionally about performance in his Mechanical Sympathy blog. Martin Fowler has also done a great review of the Disruptor's application at LMAX.
What's the big deal?
It's fast. Very fast.
Note that this is a log-log scale, not linear. If we tried to plot the comparisons on a linear scale, we'd run out of space very quickly. We have performance results of the test that produced these results, plus others of throughput testing.