SlideShare a Scribd company logo
learned 
Stuff I’ve learnt about 
software performance 
@mikeb2701
• What is a financial exchange? 
• How to lie with numbers 
• Design is (almost) everything 
• Everything else is about making trade-offs
Stuff I Learned About Performance
TL;DR 
1. Low Latency 
2. ??? 
3. Profit
Lies, Damed Lies and 
Performance Numbers
320μs @ 10,000 tx/s
Customer 
Fix 
Gateway 
Load 
Balancer 
Execution 
Venue 
Record Latency 
Parse/Encode FIX 
Order Matching 
Replication 
Journalling
320μs @ 10,000 tx/s
Stuff I Learned About Performance
320μs @ 10,000 tx/s
http://www.infoq.com/presentations/latency-pitfalls
What did I learn 
• Detail Matters 
• Don’t oversimplify the behaviour of your system
If we can really understand the problem, the 
answer will come out of it, because the answer is 
not separate from the problem. 
! 
- Jiddu Krishnamurti
Customer 
Fix 
Gateway 
Load 
Balancer 
Execution 
Venue 
Record Latency 
Parse/Encode FIX 
Order Matching 
Replication 
Journalling
Instruction 
Execution 
Report 
Execution Venue 
OrderBook 
Order 
Execution
Execution Venue 
CreateOrderBook 
<Admin Instruction> 
instrument: Carrots
Execution Venue 
OrderBook 
<Entity> 
instrument: Carrots 
CreateOrderBook 
<Admin Instruction> 
instrument: Carrots
PlaceOrder 
<Instruction> 
id : ABC 
instrument: Carrots 
price : 110 
quantity : 5 
side : BID 
Execution Venue 
OrderBook 
<Entity> 
instrument: Carrots
PlaceOrder 
<Instruction> 
id : ABC 
instrument: Carrots 
price : 110 
quantity : 5 
side : BID 
Execution Venue 
OrderBook 
<Entity> 
instrument: Carrots 
Order 
<Entity> 
orderId : 1 
id : ABC 
price : 110 
quantity : 5 
side : BID 
filled : 0 
cancelled : 0
PlaceOrder 
<Instruction> 
id : ABC 
instrument: Carrots 
price : 110 
quantity : 5 
side : BID 
Execution Venue 
OrderBook 
<Entity> 
instrument: Carrots 
Order 
<Entity> 
orderId : 1 
id : ABC 
price : 110 
quantity : 5 
side : BID 
filled : 0 
cancelled : 0 
Accept 
<ExecutionReport> 
id : ABC 
LiquidityAdded 
<ExecutionReport> 
instrument: Carrots 
price : 110 
quantity : 5
Execution Venue 
OrderBook 
<Entity> 
instrument: Carrots 
Order 
<Entity> 
orderId : 1 
id : ABC 
price : 110 
quantity : 5 
side : BID 
filled : 0 
cancelled : 0 
CancelOrder 
<Instruction> 
originalId: ABC
Execution Venue 
OrderBook 
<Entity> 
instrument: Carrots 
CancelOrder 
<Instruction> 
originalId: ABC 
Cancelled 
<ExecutionReport> 
id : ABC 
instrument: Carrots 
price : 110 
quantity : 5 
Order 
<Entity> 
orderId : 1 
id : ABC 
price : 110 
quantity : 5 
side : BID 
filled : 0 
cancelled : 5
Execution Venue 
OrderBook 
<Entity> 
instrument: Carrots 
CancelOrder 
<Instruction> 
originalId: ABC 
Cancelled 
<ExecutionReport> 
id : ABC 
instrument: Carrots 
price : 110 
quantity : 5
Execution Venue 
OrderBook 
<Entity> 
instrument: Carrots 
Order 
<Entity> 
orderId : 1 
id : ABC 
price : 110 
quantity : 5 
side : BID 
filled : 0 
cancelled : 0 
PlaceOrder 
<Instruction> 
id : DEF 
instrument: Carrots 
price : 110 
quantity : 5 
side : ASK
Execution Venue 
OrderBook 
<Entity> 
instrument: Carrots 
PlaceOrder 
<Instruction> 
id : DEF 
instrument: Carrots 
price : 110 
quantity : 5 
side : ASK 
Accept 
<ExecutionReport> 
id : DEF 
Trade 
<ExecutionReport> 
price : 110 
quantity : 5 
aggressive: DEF 
passive : ABC 
Order 
<Entity> 
orderId : 1 
id : ABC 
price : 110 
quantity : 5 
side : BID 
filled : 5 
cancelled : 0
Execution Venue 
OrderBook 
<Entity> 
instrument: Carrots 
PlaceOrder 
<Instruction> 
id : DEF 
instrument: Carrots 
price : 110 
quantity : 5 
side : ASK 
Accept 
<ExecutionReport> 
id : DEF 
Trade 
<ExecutionReport> 
price : 110 
quantity : 5 
aggressive: DEF 
passive : ABC
Execution Venue 
OrderBook 
<Entity> 
instrument: Carrots 
PlaceOrder 
<Instruction> 
id : ABC 
instrument: Bananas 
price : 110 
quantity : 5 
side : BID
Execution Venue 
OrderBook 
<Entity> 
instrument: Carrots 
PlaceOrder 
<Instruction> 
id : ABC 
instrument: Bananas 
price : 110 
quantity : 5 
side : BID 
Reject 
<ExecutionReport> 
id : ABC
Interesting Properties 
• Stable working set 
• Fits in memory 
• Doesn’t not grow monotonically with time 
• All decisions are made from local information
Event-Sourced Service 
Journalling 
Replication 
Business 
Logic 
Message Message 
http://www.infoq.com/presentations/Event-Sourced-Architectures-for-High-Availability
What did I learn 
• Enough understanding of the problem and 
solutions will appear 
• Pay attention to: 
• Entity Life-cycles 
• Number of entities - in real world scenarios 
• Try to approach the problem without bias
If you can’t talk about the downside and the 
trade offs then you’re just a fan person waiving 
a coffee mug around. That type of behaviour 
really doesn’t benefit anyone. 
! 
- Some guy on the Internet (charmalloc) 
Source: http://allthingshadoop.com/2013/12/06/technology-decisions-are-about-trade-offs-and-solving-problems/
Customer 
Fix 
Gateway 
Load 
Balancer 
10K 
msg/sec 
Execution 
Venue 
Market Data 
Service 
160K 
msg/sec
Design for trade-offs
TIMESTAMP,BID_PRICE_1,BID_QTY_1,ASK_PRICE_1,ASK_QTY_1 
1405890300827,1.35263,50,1.35296,50 
1405890300908,1.35263,50,1.35296,49.9 
1405890300909,1.35263,50,1.35296,47.9 
1405890301090,1.35263,48.2,1.35296,47.9 
1405890301193,1.35263,48.2,1.35296,46.1 
1405890301194,1.35263,48.2,1.35296,44.6 
1405890301280,1.35263,48.2,1.35296,42.6 
1405890301571,1.35263,48.1,1.35296,42.6 
1405890303037,1.35263,47.1,1.35296,42.6
List<String[]> lines = ! 
parseAsList("data.csv");! 
for (String[] line : lines)! 
{! 
double bid = parseDouble(line[1]);! 
double ask = parseDouble(line[3]);! 
! 
// Stuff...! 
}!
Iterable<String[]> lines = ! 
parseAsIterable("data.csv");! 
for (String[] line : lines)! 
{! 
double bid = parseDouble(line[1]);! 
double ask = parseDouble(line[3]);! 
! 
// Stuff...! 
}!
public interface CsvObservable! 
{! 
default void onError(Exception e)! 
{! 
}! 
! 
default void onComplete()! 
{! 
}! 
! 
void onEvent(! 
int row, int column, ! 
CharSequence value, boolean endOfLine);! 
}
parse("data.csv", ! 
(row, column, value, endOfLine) ->! 
{! 
switch (column)! 
{! 
case 1:! 
bid = parseDouble(value);! 
case 3:! 
ask = parseDouble(value);! 
}! 
! 
// Stuff...! 
});
Ops/sec GC Count GC Time (ms) 
Iterable 8.20 104 154 
Observable 16.75 0 0
public class CsvObservableDelegate ! 
implements CsvObservable<CharSequence>! 
{! 
private CsvObservable<String> delegate;! 
! 
public CsvObservableDelegate(CsvObservable<String> delegate)! 
{! 
this.delegate = delegate;! 
}! 
! 
public void onEvent(! 
int row, int column, ! 
CharSequence value, boolean endOfLine)! 
{! 
delegate.onEvent(! 
row, column, value.toString(), endOfLine);! 
}! 
! 
// Other delegate methods! 
}!
Garbage Collection 
Stallin’ your app since 1959
Stuff I Learned About Performance
Stuff I Learned About Performance
mean 95% 99% 99.99% 
JDK6 1.386 1.82 5.75 15.72 
JDK7 1.44 1.79 11.75 20.66
Solutions 
•Don’t Generate Any 
• Use Zing (Azul Systems)
Why Use Java? 
(why not C/C++/..)
Source: https://software.intel.com/en-us/articles/introduction-to-intel-advanced-vector-extensions
public class Doubles ! 
{ ! 
public static void sum(! 
double[] sum, ! 
double[] addendA, ! 
double[] addendB)! 
{! 
for (int i = 0; i < 0 + sum.length; i++)! 
{! 
sum[i] = addendA[i] + addendB[i];! 
}! 
}! 
}!
#include <immintrin.h>! 
! 
void sum(double* c, double* a, double* b, int len)! 
{! 
__m256d rA_AVX, rB_AVX, rC_AVX;! 
! 
for (int i = 0; i < len; i += 4)! 
{! 
rA_AVX = _mm256_load_pd(&a[i]);! 
rB_AVX = _mm256_load_pd(&b[i]);! 
rC_AVX = _mm256_add_pd(rA_AVX, rB_AVX);! 
_mm256_store_pd(&c[i], rC_AVX);! 
}! 
}!
Stuff I Learned About Performance
Stuff I Learned About Performance
More Java vs. C++ 
https://github.com/real-logic/simple-binary-encoding
What did I learn? 
• Details matter (performance measurement) 
• Let the problem define the solution 
• Design without bias 
• Understand the costs/benefits of trade-offs 
• Design to let others make trade-offs 
• Some trade-offs are not technical
Q&A
Links 
• Measuring Latency - http://goo.gl/6bllUP 
• Event Sourcing - http://goo.gl/VcZI7l 
• LMAX Architecture - http://goo.gl/UI5z0T 
• Source Code 
• http://github.com/mikeb01/qconsf2014

More Related Content

PPTX
SLEM - Status and Location of Equipment and Material
PDF
Test First
KEY
Deploying Next Gen Systems with Zero Downtime
PDF
Disruptor yow2013 v2
PDF
Transactional Streaming: If you can compute it, you can probably stream it.
PDF
Do more with less code in a serverless world
ODP
Beyond php - it's not (just) about the code
PDF
Practical unit testing 2014
SLEM - Status and Location of Equipment and Material
Test First
Deploying Next Gen Systems with Zero Downtime
Disruptor yow2013 v2
Transactional Streaming: If you can compute it, you can probably stream it.
Do more with less code in a serverless world
Beyond php - it's not (just) about the code
Practical unit testing 2014

Similar to Stuff I Learned About Performance (20)

PPT
Mistake and proofing Poka yokae slide presentation
ODP
Beyond php - it's not (just) about the code
PDF
Brains & Brawn: the Logic and Implementation of a Redesigned Advertising Mark...
KEY
There and Back Again
PDF
Practical Machine Learning
PDF
Moving away from legacy code with BDD
PDF
High Performance Managed Languages
PDF
Why Agile Works But Isn't Working For You
PPTX
Natural born conversion killers - Conversion Jam
PDF
Serverless in production, an experience report (London DevOps)
PPTX
Mutation Testing
PPTX
I don’t understand it fido
PDF
Voicecon - Mashups with Tropo.com
ODP
Scalingprezo
PDF
Building the "right" regression suite using Behavior Driven Testing (BDT)
PDF
Contoh Desain Slide Presentasi Ilmiah Kreatif dan Menarik #1
PDF
Acceptance Test Driven Development at StarWest 2014
PPTX
Reducing Bugs With Static Code Analysis php tek 2025
PDF
Road to A/B testing - Alexey Vasiliev (ENG) | Ruby Meditation 25
KEY
Effective Testing with Ruby
Mistake and proofing Poka yokae slide presentation
Beyond php - it's not (just) about the code
Brains & Brawn: the Logic and Implementation of a Redesigned Advertising Mark...
There and Back Again
Practical Machine Learning
Moving away from legacy code with BDD
High Performance Managed Languages
Why Agile Works But Isn't Working For You
Natural born conversion killers - Conversion Jam
Serverless in production, an experience report (London DevOps)
Mutation Testing
I don’t understand it fido
Voicecon - Mashups with Tropo.com
Scalingprezo
Building the "right" regression suite using Behavior Driven Testing (BDT)
Contoh Desain Slide Presentasi Ilmiah Kreatif dan Menarik #1
Acceptance Test Driven Development at StarWest 2014
Reducing Bugs With Static Code Analysis php tek 2025
Road to A/B testing - Alexey Vasiliev (ENG) | Ruby Meditation 25
Effective Testing with Ruby
Ad

More from Michael Barker (6)

PDF
Value Types
PDF
Test automation 3
PDF
Concurrecy techdrop
KEY
Lock? We don't need no stinkin' locks!
PDF
Beginners guide-concurrency
PDF
Disruptor tools in action
Value Types
Test automation 3
Concurrecy techdrop
Lock? We don't need no stinkin' locks!
Beginners guide-concurrency
Disruptor tools in action
Ad

Recently uploaded (20)

PDF
AI in Product Development-omnex systems
PDF
How to Choose the Right IT Partner for Your Business in Malaysia
PDF
2025 Textile ERP Trends: SAP, Odoo & Oracle
PDF
Raksha Bandhan Grocery Pricing Trends in India 2025.pdf
PDF
Odoo Companies in India – Driving Business Transformation.pdf
PDF
Internet Downloader Manager (IDM) Crack 6.42 Build 41
PPTX
Agentic AI Use Case- Contract Lifecycle Management (CLM).pptx
PDF
How Creative Agencies Leverage Project Management Software.pdf
PDF
Addressing The Cult of Project Management Tools-Why Disconnected Work is Hold...
PPTX
Operating system designcfffgfgggggggvggggggggg
PPTX
Introduction to Artificial Intelligence
PDF
Softaken Excel to vCard Converter Software.pdf
PDF
Audit Checklist Design Aligning with ISO, IATF, and Industry Standards — Omne...
PDF
Flood Susceptibility Mapping Using Image-Based 2D-CNN Deep Learnin. Overview ...
PPTX
history of c programming in notes for students .pptx
PPTX
Odoo POS Development Services by CandidRoot Solutions
PDF
T3DD25 TYPO3 Content Blocks - Deep Dive by André Kraus
PPTX
ai tools demonstartion for schools and inter college
PPTX
Transform Your Business with a Software ERP System
PDF
Internet Downloader Manager (IDM) Crack 6.42 Build 42 Updates Latest 2025
AI in Product Development-omnex systems
How to Choose the Right IT Partner for Your Business in Malaysia
2025 Textile ERP Trends: SAP, Odoo & Oracle
Raksha Bandhan Grocery Pricing Trends in India 2025.pdf
Odoo Companies in India – Driving Business Transformation.pdf
Internet Downloader Manager (IDM) Crack 6.42 Build 41
Agentic AI Use Case- Contract Lifecycle Management (CLM).pptx
How Creative Agencies Leverage Project Management Software.pdf
Addressing The Cult of Project Management Tools-Why Disconnected Work is Hold...
Operating system designcfffgfgggggggvggggggggg
Introduction to Artificial Intelligence
Softaken Excel to vCard Converter Software.pdf
Audit Checklist Design Aligning with ISO, IATF, and Industry Standards — Omne...
Flood Susceptibility Mapping Using Image-Based 2D-CNN Deep Learnin. Overview ...
history of c programming in notes for students .pptx
Odoo POS Development Services by CandidRoot Solutions
T3DD25 TYPO3 Content Blocks - Deep Dive by André Kraus
ai tools demonstartion for schools and inter college
Transform Your Business with a Software ERP System
Internet Downloader Manager (IDM) Crack 6.42 Build 42 Updates Latest 2025

Stuff I Learned About Performance

  • 1. learned Stuff I’ve learnt about software performance @mikeb2701
  • 2. • What is a financial exchange? • How to lie with numbers • Design is (almost) everything • Everything else is about making trade-offs
  • 4. TL;DR 1. Low Latency 2. ??? 3. Profit
  • 5. Lies, Damed Lies and Performance Numbers
  • 7. Customer Fix Gateway Load Balancer Execution Venue Record Latency Parse/Encode FIX Order Matching Replication Journalling
  • 12. What did I learn • Detail Matters • Don’t oversimplify the behaviour of your system
  • 13. If we can really understand the problem, the answer will come out of it, because the answer is not separate from the problem. ! - Jiddu Krishnamurti
  • 14. Customer Fix Gateway Load Balancer Execution Venue Record Latency Parse/Encode FIX Order Matching Replication Journalling
  • 15. Instruction Execution Report Execution Venue OrderBook Order Execution
  • 16. Execution Venue CreateOrderBook <Admin Instruction> instrument: Carrots
  • 17. Execution Venue OrderBook <Entity> instrument: Carrots CreateOrderBook <Admin Instruction> instrument: Carrots
  • 18. PlaceOrder <Instruction> id : ABC instrument: Carrots price : 110 quantity : 5 side : BID Execution Venue OrderBook <Entity> instrument: Carrots
  • 19. PlaceOrder <Instruction> id : ABC instrument: Carrots price : 110 quantity : 5 side : BID Execution Venue OrderBook <Entity> instrument: Carrots Order <Entity> orderId : 1 id : ABC price : 110 quantity : 5 side : BID filled : 0 cancelled : 0
  • 20. PlaceOrder <Instruction> id : ABC instrument: Carrots price : 110 quantity : 5 side : BID Execution Venue OrderBook <Entity> instrument: Carrots Order <Entity> orderId : 1 id : ABC price : 110 quantity : 5 side : BID filled : 0 cancelled : 0 Accept <ExecutionReport> id : ABC LiquidityAdded <ExecutionReport> instrument: Carrots price : 110 quantity : 5
  • 21. Execution Venue OrderBook <Entity> instrument: Carrots Order <Entity> orderId : 1 id : ABC price : 110 quantity : 5 side : BID filled : 0 cancelled : 0 CancelOrder <Instruction> originalId: ABC
  • 22. Execution Venue OrderBook <Entity> instrument: Carrots CancelOrder <Instruction> originalId: ABC Cancelled <ExecutionReport> id : ABC instrument: Carrots price : 110 quantity : 5 Order <Entity> orderId : 1 id : ABC price : 110 quantity : 5 side : BID filled : 0 cancelled : 5
  • 23. Execution Venue OrderBook <Entity> instrument: Carrots CancelOrder <Instruction> originalId: ABC Cancelled <ExecutionReport> id : ABC instrument: Carrots price : 110 quantity : 5
  • 24. Execution Venue OrderBook <Entity> instrument: Carrots Order <Entity> orderId : 1 id : ABC price : 110 quantity : 5 side : BID filled : 0 cancelled : 0 PlaceOrder <Instruction> id : DEF instrument: Carrots price : 110 quantity : 5 side : ASK
  • 25. Execution Venue OrderBook <Entity> instrument: Carrots PlaceOrder <Instruction> id : DEF instrument: Carrots price : 110 quantity : 5 side : ASK Accept <ExecutionReport> id : DEF Trade <ExecutionReport> price : 110 quantity : 5 aggressive: DEF passive : ABC Order <Entity> orderId : 1 id : ABC price : 110 quantity : 5 side : BID filled : 5 cancelled : 0
  • 26. Execution Venue OrderBook <Entity> instrument: Carrots PlaceOrder <Instruction> id : DEF instrument: Carrots price : 110 quantity : 5 side : ASK Accept <ExecutionReport> id : DEF Trade <ExecutionReport> price : 110 quantity : 5 aggressive: DEF passive : ABC
  • 27. Execution Venue OrderBook <Entity> instrument: Carrots PlaceOrder <Instruction> id : ABC instrument: Bananas price : 110 quantity : 5 side : BID
  • 28. Execution Venue OrderBook <Entity> instrument: Carrots PlaceOrder <Instruction> id : ABC instrument: Bananas price : 110 quantity : 5 side : BID Reject <ExecutionReport> id : ABC
  • 29. Interesting Properties • Stable working set • Fits in memory • Doesn’t not grow monotonically with time • All decisions are made from local information
  • 30. Event-Sourced Service Journalling Replication Business Logic Message Message http://www.infoq.com/presentations/Event-Sourced-Architectures-for-High-Availability
  • 31. What did I learn • Enough understanding of the problem and solutions will appear • Pay attention to: • Entity Life-cycles • Number of entities - in real world scenarios • Try to approach the problem without bias
  • 32. If you can’t talk about the downside and the trade offs then you’re just a fan person waiving a coffee mug around. That type of behaviour really doesn’t benefit anyone. ! - Some guy on the Internet (charmalloc) Source: http://allthingshadoop.com/2013/12/06/technology-decisions-are-about-trade-offs-and-solving-problems/
  • 33. Customer Fix Gateway Load Balancer 10K msg/sec Execution Venue Market Data Service 160K msg/sec
  • 35. TIMESTAMP,BID_PRICE_1,BID_QTY_1,ASK_PRICE_1,ASK_QTY_1 1405890300827,1.35263,50,1.35296,50 1405890300908,1.35263,50,1.35296,49.9 1405890300909,1.35263,50,1.35296,47.9 1405890301090,1.35263,48.2,1.35296,47.9 1405890301193,1.35263,48.2,1.35296,46.1 1405890301194,1.35263,48.2,1.35296,44.6 1405890301280,1.35263,48.2,1.35296,42.6 1405890301571,1.35263,48.1,1.35296,42.6 1405890303037,1.35263,47.1,1.35296,42.6
  • 36. List<String[]> lines = ! parseAsList("data.csv");! for (String[] line : lines)! {! double bid = parseDouble(line[1]);! double ask = parseDouble(line[3]);! ! // Stuff...! }!
  • 37. Iterable<String[]> lines = ! parseAsIterable("data.csv");! for (String[] line : lines)! {! double bid = parseDouble(line[1]);! double ask = parseDouble(line[3]);! ! // Stuff...! }!
  • 38. public interface CsvObservable! {! default void onError(Exception e)! {! }! ! default void onComplete()! {! }! ! void onEvent(! int row, int column, ! CharSequence value, boolean endOfLine);! }
  • 39. parse("data.csv", ! (row, column, value, endOfLine) ->! {! switch (column)! {! case 1:! bid = parseDouble(value);! case 3:! ask = parseDouble(value);! }! ! // Stuff...! });
  • 40. Ops/sec GC Count GC Time (ms) Iterable 8.20 104 154 Observable 16.75 0 0
  • 41. public class CsvObservableDelegate ! implements CsvObservable<CharSequence>! {! private CsvObservable<String> delegate;! ! public CsvObservableDelegate(CsvObservable<String> delegate)! {! this.delegate = delegate;! }! ! public void onEvent(! int row, int column, ! CharSequence value, boolean endOfLine)! {! delegate.onEvent(! row, column, value.toString(), endOfLine);! }! ! // Other delegate methods! }!
  • 42. Garbage Collection Stallin’ your app since 1959
  • 45. mean 95% 99% 99.99% JDK6 1.386 1.82 5.75 15.72 JDK7 1.44 1.79 11.75 20.66
  • 46. Solutions •Don’t Generate Any • Use Zing (Azul Systems)
  • 47. Why Use Java? (why not C/C++/..)
  • 49. public class Doubles ! { ! public static void sum(! double[] sum, ! double[] addendA, ! double[] addendB)! {! for (int i = 0; i < 0 + sum.length; i++)! {! sum[i] = addendA[i] + addendB[i];! }! }! }!
  • 50. #include <immintrin.h>! ! void sum(double* c, double* a, double* b, int len)! {! __m256d rA_AVX, rB_AVX, rC_AVX;! ! for (int i = 0; i < len; i += 4)! {! rA_AVX = _mm256_load_pd(&a[i]);! rB_AVX = _mm256_load_pd(&b[i]);! rC_AVX = _mm256_add_pd(rA_AVX, rB_AVX);! _mm256_store_pd(&c[i], rC_AVX);! }! }!
  • 53. More Java vs. C++ https://github.com/real-logic/simple-binary-encoding
  • 54. What did I learn? • Details matter (performance measurement) • Let the problem define the solution • Design without bias • Understand the costs/benefits of trade-offs • Design to let others make trade-offs • Some trade-offs are not technical
  • 55. Q&A
  • 56. Links • Measuring Latency - http://goo.gl/6bllUP • Event Sourcing - http://goo.gl/VcZI7l • LMAX Architecture - http://goo.gl/UI5z0T • Source Code • http://github.com/mikeb01/qconsf2014