reactive revealed p1 - async nio, back-pressure and message- vs event-driven

Post on 14-Aug-2015

2.926 Views

Category:

Software

2 Downloads

Preview:

Click to see full reader

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

top related