reactive revealed p1 - async nio, back-pressure and message- vs event-driven
TRANSCRIPT
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
Part #1
Message-driven Asynchronous
Non-blocking I/Oand Back-pressure
Part #2
ElasticityScalability
Location Transparency
Part #3
ResiliencyFailures vs Errors
Isolation & ContainmentDelegation & Replication
with Viktor Klang with Jonas Bonér
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
Konrad `ktoso` Malawski
Akka Team,Reactive Streams TCK
(we’re renaming soon!)
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
High Performance Software Development
For the majority of the time, high performance software development
is not about compiler hacks and bit twiddling.
It is about fundamental design principles that are key to doing any effective software development.
Martin Thompson
practicalperformanceanalyst.com/2015/02/17/getting-to-know-martin-thompson-...
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
Agenda
• Reactive Manifesto & our focus today• Asynchronous vs. Synchronous• Messages compared to Events• Patterns enabled by Asynchronous
Messaging• Keeping things Non-blocking: Scheduling• Non-blocking I/O: IO, AIO, NIO, Zero• Asynchronous Non-blocking Back-
pressure• Wrapping up and Q/A
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
Initial version published 2 years ago.
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
Initial version published 2 years ago.
A “not only Typesafe” initiative:Jonas Bonér, Dave Farley, Roland Kuhn, and Martin Thompson
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
Initial version published 2 years ago.
A “not only Typesafe” initiative:Jonas Bonér, Dave Farley, Roland Kuhn, and Martin Thompson
Defines a tech agnostic shared vocabulary.
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
Asynchronous
Sync / Async Basics
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
Sync / Async Basics
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
Sync / Async Basics
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
Sync / Async Basics
Implicitly back-pressures the sender, since it can only send M2 after M1
finished.
(we’ll discuss back-pressure in depth shortly)
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
Sync / Async Basics
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
Sync / Async Basics
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
Sync / Async Basics
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
Sync / Async Basics
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
Sync / Async Basics
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
Sync / Async Basics
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
Messages compared to Events
Messages compared to Events
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
Events are not addressed to a specific receiver.
They’re just “facts”, that get published to topics.
Messages compared to Events
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
Event-based systems tend to focus on addressable event
sources.
Messages compared to Events
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
A Message can contain an Event as it’s payload,
i.e. “listener ! SeatReserved()”.
Messages always have a specific recipient.
Be it Actor or Topic or something else.
Messages compared to Events
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
Message-based systems tend to focus on addressable recipients.
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
Load management
Async enables transparent load balancing
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
Async enables transparent load balancing
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
Async enables transparent load balancing
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
Async enables transparent load balancing
Response latency grows since more and more messages pile up in the
mailbox…
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
Async enables transparent load balancing
Response latency grows since more and more messages pile up in the
mailbox…
We can:A. back-pressure the
PublisherB. add more workers!
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
Async enables transparent load balancing
Can add workers dynamically.
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
Non-blocking
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
Async where it matters: Scheduling
Async where it matters: Scheduling
Async where it matters: Scheduling
Async where it matters: Scheduling
Async where it matters: Scheduling
Async where it matters: Scheduling
Async where it matters: Scheduling
Async where it matters: Scheduling
Async where it matters: Scheduling
Scheduling (notice they grey sync call)
Scheduling (notice they grey sync call)
Scheduling (now with Async db call)
Scheduling (now with Async db call)
Scheduling (now with Async db call)
Scheduling (now with Async db call)
I / O
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
IO / AIO
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
IO / AIO / NIO
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
IO / AIO / NIO / Zero
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
Interruption!CPU: User Mode / Kernel Mode
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
Kernels and CPUs
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
Kernels and CPUs
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
Kernels and CPUs
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
Kernels and CPUs
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
Kernels and CPUs
http://wiki.osdev.org/Context_SwitchingReactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
Kernels and CPUs
[…] switching from user-level to kernel-level on a (2.8 GHz) P4 is 1348 cycles.
[…] Counting actual time, the P4 takes 481ns […]
http://wiki.osdev.org/Context_SwitchingReactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
I / O
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
I / O
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
I / O
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
I / O
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
I / O
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
I / O
“Don’t worry. It only gets worse!”
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
I / O
“Don’t worry. It only gets worse!”
Same data in 3 buffers!4 mode switches!
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
Asynchronous I / O [Linux]
Linux AIO = JVM NIO
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
Asynchronous I / O [Linux]
NewIO… since 2004!(No-one calls it “new” any more)
Linux AIO = JVM NIO
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
Asynchronous I / O [Linux]
Less time wasted waiting.Same amount of buffer copies.
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
ZeroCopy = sendfile [Linux]
“Work smarter. Not harder.”
http://fourhourworkweek.com/Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
ZeroCopy = sendfile [Linux]
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
ZeroCopy = sendfile [Linux]
Data never leaves kernel mode!
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
Delegating failures
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
Delegate Failures
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
Delegate Failures
Backup Requestsusing
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
Backup requests
A technique for fighting “long tail latencies”.By issuing duplicated work, when SLA seems in danger.
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
Backup requests
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
Backup requests
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
Backup requests
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
Backup requests - send
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
Backup requests - send
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
Backup requests - send
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
Backup requests
Avg Std dev 95%ile 99%ile 99.9%ile
No backups 33 ms 1524 ms 24 ms 52 ms 994 ms
After 10ms 14 ms 4 ms 20 ms 23 ms 50 ms
After 50ms 16 ms 12 ms 57 ms 63 ms 68 ms
Jeff Dean - Achieving Rapid Response Times in Large Online Services Peter Bailis - Doing Redundant Work to Speed Up Distributed Queries
Akka - Krzysztof Janosz @ Akkathon, Kraków - TailChoppingRouter (docs, pr)
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
Lesson learned:
Backup requests allowtrade-off increased loadfor decreased latency.
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
Asynchronous Back-pressure
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
Back-pressure &
Combined Requests
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
Combined requests & back-pressure
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
Combined requests & back-pressure
No no no…!Not THAT Back-pressure!
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
Combined requests & back-pressure
THAT kind of back-pressure:
www.reactive-streams.orgReactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
Combined requests & back-pressure
THAT kind of back-pressure:
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawskiwww.reactive-streams.org
Combined requests & back-pressure
THAT kind of back-pressure:
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawskiwww.reactive-streams.org
Combined requests & back-pressure
THAT kind of back-pressure:
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawskiwww.reactive-streams.org
Combined requests
A technique for avoiding duplicated work.By aggregating requests, possibly increasing latency.
“Wat? Why would I increase latency!?”
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
Combined requests
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
Combined requests
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
Combined requests
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
Combined requests
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
Lesson learned:
Back-pressure saves systems from overload.
Combined requests trade higher latency,for less work for the downstream.
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
Wrapping up
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
Wrapping up
• provides a shared vocabulary
• a “ubiquitous language“, for Reactive Systems
• is not re-discovering the wheel, instead just solidifies proven
patterns
• is technology independent
The Reactive Manifesto
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
Wrapping up
• are loosely coupled by design
• therefore can be elastic and resilient
• allow certain patterns to be used which otherwise wouldn’t be
possible
Asynchronous and Message-driven systems:
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
Links• akka.io• reactive-streams.org• akka-user
• Gil Tene - How NOT to measure latency, 2013• Jeff Dean @ Velocity 2014• Alan Bateman, Jeanfrancois Arcand (Sun) Async IO Tips @
JavaOne• http://linux.die.net/man/2/select• http://linux.die.net/man/2/poll• http://linux.die.net/man/4/epoll• giltene/jHiccup• Linux Journal: ZeroCopy I, Dragan Stancevis 2013
• Last slide car picture: http://actu-moteurs.com/sprint/gt-tour/jean-philippe-belloc-un-beau-challenge-avec-le-akka-asp-team/2000
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
Links• http://wiki.osdev.org/Context_Switching• CppCon: Herb Sutter "Lock-Free Programming (or,
Juggling Razor Blades)"• http://www.infoq.com/presentations/reactive-services-scale• Gil Tene’s HdrHistogram.org
• http://hdrhistogram.github.io/HdrHistogram/plotFiles.html• Rob Pike - Concurrency is NOT Parallelism (video)• Brendan Gregg - Systems Performance: Enterprise and the Cloud (b
ook)• http://psy-lob-saw.blogspot.com/2015/02/hdrhistogram-better-laten
cy-capture.html• Jeff Dean, Luiz Andre Barroso - The Tail at Scale (whitepaper, ACM)• http://highscalability.com/blog/2012/3/12/google-taming-the-long-la
tency-tail-when-more-machines-equal.html• http://www.ulduzsoft.com/2014/01/select-poll-epoll-practical-differe
nce-for-system-architects/• Marcus Lagergren - Oracle JRockit: The Definitive Guide (book)• http://mechanical-sympathy.blogspot.com/2013/08/lock-based-vs-lo
ck-free-concurrent.html• Handling of Asynchronous Events -
http://www.win.tue.nl/~aeb/linux/lk/lk-12.html• http://www.kegel.com/c10k.html
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
Links• www.reactivemanifesto.org/• Seriously the only right way to micro benchmark on the
JVM:• JMH openjdk.java.net/projects/code-tools/jmh/• JMH for Scala: https://github.com/ktoso/sbt-jmh
• http://www.ibm.com/developerworks/library/l-async/• http://lse.sourceforge.net/io/aio.html• https://code.google.com/p/kernel/wiki/AIOUserGuide• ShmooCon: C10M - Defending the Internet At Scale (Robert
Graham)• http://blog.erratasec.com/2013/02/scalability-its-question-that-drives-us.html#.VO6E
11PF8SM
•User-level threads....... with threads. - Paul Turner @ Linux Plumbers Conf 2013
• https://www.facebook.com/themainstreetpiggyboys/photos/a.1390784047896753.1073741829.1390594984582326/1423592294615928/?type=1&theater for the Rollin’ Cuy on last slide
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
Part #219 August 2015
ElasticityScalability
Location Transparency
Part #33 September 2015
ResiliencyFailures vs Errors
Isolation & ContainmentDelegation & Replication
with Viktor Klang with Jonas Bonér
Next time:
Reactive Revealed: Message Drivenwith Konrad `@ktosopl` Malawski
see blog.typesafe.com
Go Reactive
More interesting stuff…
HOW TO VIDEO
Managing Library Dependencies with Play,
sbt & Activator
WATCH NOW
HAVE QUESTIONS?
Get in touch with Typesafe today!
CONTACT US
SUCCESS STORY
How Walmart Canada Saved Black Friday with
Akka, Play and Scala
READ NOW
©Typesafe 2015 – All Rights ReservedK©Typesafe 2015 – All Rights Reserved