Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
REACTOR AND THE REACTIVE STREAMS 
STANDARD 
Jon Brisbin - Stephane Maldini 
© 2014 SpringOne 2GX. All rights reserved. Do ...
‘Bout the guys speaking 
2 
@j_brisbin - 100% asynchronous poet 
Reactor Committer I 
Reactive-Streams Contributor 
@smald...
Session Manifesto 
• Tweet questions during the presentation 
–@ProjectReactor 
• 90 minutes is long, plenty of time to fa...
4
Aperture Sciences Test 981: 
Observe the following examples 
5 
NanoService, MicroService, NotTooBigService™…
NanoService, MicroService, NotTooBigService™… 
6 
cat file.csv | grep ‘doge’ | sort
NanoService, MicroService, NotTooBigService™… 
7 
POST [json] http://dogecoin.money/send/id 
—> GET [json] http://dogeprof...
NanoService, MicroService, NotTooBigService™… 
8 
userService.auth(username,password) 
—> userService.hashPassword(passwor...
NanoService, MicroService, NotTooBigService™… 
9 
• A SomethingService will always need to interact 
• With the user 
• Wi...
10 
And this threat has a name 
Latency
11 
UberFact : Humans don’t really enjoy waiting 
Neither do The Machines
What is latency doing to you ? 
12 
• Loss of revenues 
• because users switched to another site/app 
• because services a...
13 
Loading
All hail Reactive Programming 
• A possible answer to this issue 
• The very nature of Reactor, look at the name dude 
• A...
No sh*t, what is Reactive Programming ? 
15 
Event-Driven Fault-Tolerant 
Low-latency* 
Scalable
Reactive Architecture ? 
• A Reactive system MUST be resilient 
–splitting concerns to achieve error bulk-heading and 
mod...
Reactive Architecture ! 
• Asynchronous Programming is core to Reactive Architecture 
• Immediate answer to the originatin...
18 
Reactor has 99 problems but Latency isn’t one
Reactor-Core features 
19 
[A]synchronous Dispatchers 
Event Bus [Reactor.class] 
Streams and Promises 
Functional artifac...
Dispatching model matters 
• Context switching hurts performances 
• Locking hurts performances 
• Message passing hurts p...
Built-in UberFast™ dispatcher 
• LMAX Disruptor deals with message passing issues 
• Based on a Ring Buffer structure 
• “...
Message Passing matters 
• Pull vs Push patterns 
– Push: 
•Non blocking programming (e.g. lock-free LMAX RingBuffer) 
•Fu...
Reactor event bus in action In Groovy because Java doesn’t fit into the slide 
23 
import reactor.core.Environment 
import...
Reactor callback hell In Groovy because Java doesn’t fit into the slide 
24 
r.on($('talk')) { Event<String> speak -> 
2nd...
25 
Stream?
26 
Stream
27 
Stream!
28 
Stream!
Solving callback hell 
29 
import reactor.rx.spec.Streams 
def stream = Streams.defer() 
stream.map{ name -> 
Tuple.of(nam...
Using a Stream ? 
30 
Embedded data-processing Event Handling 
Metrics, Statistics Micro-Batching 
Composition Feedback-Lo...
Defining a Stream 
• Represents a sequence of data, possibly unbounded 
• Provide for processing API such as filtering and...
Stream VS Event Bus [Reactor] 
32 
• Works great combined (stream distribution) 
• Type-checked flow 
• Publisher/Subscrib...
Hot Stream vs Cold Stream 
• An Hot Stream multi-casts real-time signals 
–think Trade, Tick, Mouse Click 
• A Cold Stream...
34 
Introducing Reactive Streams Specification !
What is defined by Reactive Streams ? 
35 
Async non-blocking flow-control 
Interoperable protocol 
Async non-blocking dat...
Reactive-Streams: Dynamic Message-Passing 
36 
PUBLISHER 
SUBSCRIBER 
Events 
Demand
Now You Know 
• It is not only queue-based pattern: 
– Signaling demand on a slower Publisher == no buffering 
– Signaling...
Out Of The Box : Flow Control 
38 
PUBLISHER 
SUBSCRIBER 
Slow 
Fast 
SUBSCRIBER
Reactive Streams: Batch Processing ? 
• Requesting sized demand allows for batch publishing 
optimizations 
– Could be ada...
Reactive Streams: What is in the data sequence ? 
• If the Publisher is an Hot Stream 
– Sequence will be defined by when ...
Reactive Streams: Transformations ? 
• Does not specify any transformation, only essentials components 
to enable this pro...
42 
Hold on a minute buddy, there are already Streams in Java 8 !
All the “Streaming” tech around… Java 8 
• Java 8 introduces java.util.stream.Stream 
– Functional DSL to support transfor...
All the “Streaming” tech around… Java 8 
44 
Stream<Widget> widgetsStream = widgets.stream(); 
int sum = widgetsStream 
.f...
What about RxJava mate ! All those hipsters use it. 
45
All the “Streaming” tech around… RxJava 
• RxJava provides the now famous Reactive Extensions 
– Rich transformations 
– E...
All the “Streaming” tech around… Java 8 
47 
Observe a Cold Stream 
numbers = Observable.from([1, 2, 3, 4, 5]); 
numbers.m...
Other “Streaming” tech around… 
• Streaming data is all the rage in modern frameworks: 
– Akka, Storm, Reactor, Ratpack, …...
49 
Reactive Streams: Joining forces 
ccv 
Doug Lea – SUNY Oswego
Reactive Streams: Joining forces 
50 
Reactor 
Data Driver 
Akka 
Distributed 
System 
RxJava 
Metrics 
Pipeline 
Ratpack ...
Reactive Streams: Joining forces 
• Smart solution and pattern to all reactive applications 
• Writing a standard protocol...
Reactive Streams: Joining forces 
• Semantics 
– Single document listing full rules 
– Open enough to allow for various pa...
Reactive Streams: org.reactivestreams 
53 
public interface Publisher<T> { 
public void subscribe(Subscriber<T> s); 
} 
pu...
Reactive Streams: Reactor mapping 
54 
Publisher 
reactor.rx.Stream 
Subscriber 
reactor.rx.actions.Action 
Processor 
rea...
Reactive Streams: Execution Model 
• Publisher creates a capacity-aware container 
– Subscription per Subscriber 
• No con...
Reactive Streams: Signals 
56 
onError | (onSubscribe onNext* (onError | onComplete)?)
Reactive Streams: Async Boundaries 
Resource #1 R2 R3 Resource #4 
57 
nioSelectorThreadOrigin map(f) filter(p) consume(to...
Reactive Streams: Async Boundaries 
Resource #1 Resource #4 
58 
nioSelectorThreadOrigin map(f) filter(p) consume(toNioSel...
Reactive Streams: Async Boundaries 
Resource #1 Resource #2 
59 
nioSelectorThreadOrigin map(f) filter(p) consume(toNioSel...
10 slides and a demo to go :):):) 
60
Reactor : Iterable Cold Stream 
61 
Streams 
.defer(env, 1, 2, 3, 4, 5) 
.subscribe(identityProcessor);
Reactor : Building blackbox processors 
62 
Processor<Integer,Integer> identityProcessor = 
Action.<Integer>passthrough(en...
A Full Slide Just To Talk About flatMap() 
63 
FlatMap Bucket Challenge ! Nominate 3 
friends to explain flatMap()
Another Slide Just To Talk About flatMap() 
64 
flatMap() is nothing more than the functional 
alternative to RPC. Just a ...
The Last Slide about flatMap() 
65 
stream.flatMap{ name -> 
Streams.defer(name) 
.observe{ println 'so wow' } 
.map{ 'muc...
Reactor does also Scale-Up 
66 
deferred = Streams.defer(environment); 
deferred 
.parallel(8) 
.map(stream -> stream 
.ma...
67 
DEMO https://github.com/SpringOne2GX-2014/reactive-geocoder
Early adopters 
• Checkpoint 
–Reactor 2.0.0.M1 implements 0.4.0 - TCK OK 
–Akka Streams implements 0.4.0 - TCK OK 
–Exper...
ReactiveStreams.onSubscribe(Resources) 
• www.reactive-streams.org 
• https://github.com/reactive-streams/reactive-streams...
ReactiveStreams.onNext(Roadmap) 
• Discussed for inclusion in JDK 
• Close to release: 0.4.0 
– Evaluating TCK before goin...
Reactor.onSubscribe(Resources) 
• http://projectreactor.cfapps.io/ 
• https://github.com/reactor 
• Twitter: @projectReact...
Reactor.onNext(Roadmap) 
• Versions 
• Imminent 2.0.0.M1 
• 2.0.0.M2 - September 
• 2.0.0.RELEASE - End September/Early Oc...
Reactor.onError(issues) 
• Tracker: 
• https://github.com/reactor/reactor/issues 
• Group: 
• https://groups.google.com/fo...
74 
Q & A
session.onComplete() 
75
Upcoming SlideShare
Loading in …5
×

Building Reactive Applications with Reactor and the Reactive Streams Standard

3,681 views

Published on

This session will introduce attendees to the Reactive Streams project, a new initiative between reactive software's heavy-hitters like Pivotal, Typesafe, Netflix, Twitter, and others. Since Pivotal's own Reactor framework implements this informal standard, we'll demonstrate how to build applications that can connect to other Reactive Streams implementations in a completely non-blocking way.

Published in: Software
  • Hello! Get Your Professional Job-Winning Resume Here - Check our website! https://vk.cc/818RFv
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

Building Reactive Applications with Reactor and the Reactive Streams Standard

  1. 1. REACTOR AND THE REACTIVE STREAMS STANDARD Jon Brisbin - Stephane Maldini © 2014 SpringOne 2GX. All rights reserved. Do not distribute without permission. including plenty of lol™
  2. 2. ‘Bout the guys speaking 2 @j_brisbin - 100% asynchronous poet Reactor Committer I Reactive-Streams Contributor @smaldini - solve 9 issues, create 10 problems Reactor Committer II Reactive-Streams Contributor
  3. 3. Session Manifesto • Tweet questions during the presentation –@ProjectReactor • 90 minutes is long, plenty of time to fall asleep and awake in a storm of nonsense • Come chat with us after the session • Jump/Sleep to the last slide to find our coordinates 3
  4. 4. 4
  5. 5. Aperture Sciences Test 981: Observe the following examples 5 NanoService, MicroService, NotTooBigService™…
  6. 6. NanoService, MicroService, NotTooBigService™… 6 cat file.csv | grep ‘doge’ | sort
  7. 7. NanoService, MicroService, NotTooBigService™… 7 POST [json] http://dogecoin.money/send/id —> GET [json] http://dogeprofile.money/id —> POST [json] http://nsa.gov.us/cc/trace/id
  8. 8. NanoService, MicroService, NotTooBigService™… 8 userService.auth(username,password) —> userService.hashPassword(password) —> userService.findByNameAndHash(name)
  9. 9. NanoService, MicroService, NotTooBigService™… 9 • A SomethingService will always need to interact • With the user • With other services • The boundary between services is the real deal • A big danger lurks in the dark • More breakdown => More boundaries => Danger Will Robinson
  10. 10. 10 And this threat has a name Latency
  11. 11. 11 UberFact : Humans don’t really enjoy waiting Neither do The Machines
  12. 12. What is latency doing to you ? 12 • Loss of revenues • because users switched to another site/app • because services are compounding inefficiency • because aggressive scaling will be needed • because dev budget will sink into addressing this a postiori ‘2 bucks prediction’ : tech team turnover will increase and keep mourning about how crap is their design
  13. 13. 13 Loading
  14. 14. All hail Reactive Programming • A possible answer to this issue • The very nature of Reactor, look at the name dude • A fancy buzz-word that might work better than MDA or SOA • A simple accumulation of years of engineering 14
  15. 15. No sh*t, what is Reactive Programming ? 15 Event-Driven Fault-Tolerant Low-latency* Scalable
  16. 16. Reactive Architecture ? • A Reactive system MUST be resilient –splitting concerns to achieve error bulk-heading and modularity • A Reactive system MUST be scalable – scale-up : partition work across CPUs – scale-out : distribute over peer nodes 16
  17. 17. Reactive Architecture ! • Asynchronous Programming is core to Reactive Architecture • Immediate answer to the originating publisher • Context segregation to avoid cascade failure as possible • Functional Programming fits perfectly as it is stimulus based • Related: Functional Reactive Programming 17
  18. 18. 18 Reactor has 99 problems but Latency isn’t one
  19. 19. Reactor-Core features 19 [A]synchronous Dispatchers Event Bus [Reactor.class] Streams and Promises Functional artifacts (SAM components, tuples, timers) Fast IO [buffer, net, persistent queues, codec] Fast Data [allocators, batch-processors]
  20. 20. Dispatching model matters • Context switching hurts performances • Locking hurts performances • Message passing hurts performances • Blocking for a thread hurts performances • Resources cost 20
  21. 21. Built-in UberFast™ dispatcher • LMAX Disruptor deals with message passing issues • Based on a Ring Buffer structure • “Mechanical Sympathy” in Disruptor • http://lmax-exchange.github.com/disruptor/files/ Disruptor-1.0.pdf • http://mechanitis.blogspot.co.uk/2011/06/dissecting-disruptor-whats- so-special.html 21
  22. 22. Message Passing matters • Pull vs Push patterns – Push: •Non blocking programming (e.g. lock-free LMAX RingBuffer) •Functional programming •Best for in-process short access – Pull: •Queue based decoupling •Best for slow services or blocking connections 22
  23. 23. Reactor event bus in action In Groovy because Java doesn’t fit into the slide 23 import reactor.core.Environment import reactor.core.spec.Reactors import reactor.event.Event import static reactor.event.selector.Selectors.$ def env = new Environment() def r = Reactors.reactor(env) r.on($('welcome')) { name -> println "hello $name" Manage dispatchers Listen for names on Topic ‘welcome’ } r.notify($('welcome'), Event.wrap('Doge')) Reactor builder Send an Event to Topic ‘welcome’
  24. 24. Reactor callback hell In Groovy because Java doesn’t fit into the slide 24 r.on($('talk')) { Event<String> speak -> 2nd level callback // do stuff with speak def topic = $("bye-$speak.headers.name") r.notify(topic, Event.wrap("$speak.data, much sad")) } r.on($('welcome')) { name -> r.on($("bye-$name")){ farewell -> println "bye bye ! $farewell... $name" } def event = Event.wrap('so wow') event.headers['name'] = name r.notify($('talk'), event) } r.notify($('welcome'), Event.wrap('Doge')) 1st level callback 3rd nested dynamic callback
  25. 25. 25 Stream?
  26. 26. 26 Stream
  27. 27. 27 Stream!
  28. 28. 28 Stream!
  29. 29. Solving callback hell 29 import reactor.rx.spec.Streams def stream = Streams.defer() stream.map{ name -> Tuple.of(name, 'so wow') }.map{ tuple -> Tuple.of(tuple.name, "$tuple.t2, much sad") }.consume{ tuple -> println "bye bye ! $tuple.t2... $tuple.t1" } stream.broadcastNext('Doge') Prepare a simple Stream 1st step 2nd step Terminal callback Send some data into the stream
  30. 30. Using a Stream ? 30 Embedded data-processing Event Handling Metrics, Statistics Micro-Batching Composition Feedback-Loop
  31. 31. Defining a Stream • Represents a sequence of data, possibly unbounded • Provide for processing API such as filtering and enrichment • Not a Collection, not a Storage 31
  32. 32. Stream VS Event Bus [Reactor] 32 • Works great combined (stream distribution) • Type-checked flow • Publisher/Subscriber tight control • No Signal concurrency Rule of thumb: if nested event composition > 2, switch to Stream
  33. 33. Hot Stream vs Cold Stream • An Hot Stream multi-casts real-time signals –think Trade, Tick, Mouse Click • A Cold Stream uni-casts deferred signals –think File, Array, Random 33
  34. 34. 34 Introducing Reactive Streams Specification !
  35. 35. What is defined by Reactive Streams ? 35 Async non-blocking flow-control Interoperable protocol Async non-blocking data sequence (Threads, Nodes…) Minimal resources requirement
  36. 36. Reactive-Streams: Dynamic Message-Passing 36 PUBLISHER SUBSCRIBER Events Demand
  37. 37. Now You Know • It is not only queue-based pattern: – Signaling demand on a slower Publisher == no buffering – Signaling demand on a faster Publisher == buffering • Data volume is bounded by a Subscriber – Scaling dynamically if required 37
  38. 38. Out Of The Box : Flow Control 38 PUBLISHER SUBSCRIBER Slow Fast SUBSCRIBER
  39. 39. Reactive Streams: Batch Processing ? • Requesting sized demand allows for batch publishing optimizations – Could be adapted dynamically based on criteria such as network bandwidth… – A Publisher could decide to apply grouped operations (aggregating, batch serializing) 39
  40. 40. Reactive Streams: What is in the data sequence ? • If the Publisher is an Hot Stream – Sequence will be defined by when the Subscriber is connected • If the Publisher is a Cold Stream – Sequence will be similar for every Subscriber regardless of when they connected 40
  41. 41. Reactive Streams: Transformations ? • Does not specify any transformation, only essentials components to enable this protocol… • …But define a staging component Processor : – Both A Subscriber AND a Publisher 41
  42. 42. 42 Hold on a minute buddy, there are already Streams in Java 8 !
  43. 43. All the “Streaming” tech around… Java 8 • Java 8 introduces java.util.stream.Stream – Functional DSL to support transformations and stages – Proactive fetching – No dynamic message passing – Fits nicely with event-driven libraries such as Reactor and RxJava. 43
  44. 44. All the “Streaming” tech around… Java 8 44 Stream<Widget> widgetsStream = widgets.stream(); int sum = widgetsStream .filter(b -> b.getColor() == RED) .mapToInt(b -> b.getWeight()) .sum(); Pull operation Push operations Collection to Stream (Cold)
  45. 45. What about RxJava mate ! All those hipsters use it. 45
  46. 46. All the “Streaming” tech around… RxJava • RxJava provides the now famous Reactive Extensions – Rich transformations – Event-Driven (onNext, onError, onComplete) – Flexible scheduling – No dynamic demand OoB(possibly unbounded in-flight data) 46
  47. 47. All the “Streaming” tech around… Java 8 47 Observe a Cold Stream numbers = Observable.from([1, 2, 3, 4, 5]); numbers.map({it * it}).subscribe( { println(it); }, // onNext { println("Error: " + it.getMessage()); }, // onError { println("Sequence complete"); } // onCompleted ); Push operations Demand ‘all’ data
  48. 48. Other “Streaming” tech around… • Streaming data is all the rage in modern frameworks: – Akka, Storm, Reactor, Ratpack, … • Semantics compare with Enterprise Integration Patterns: – Camel, Spring Integration/XD, … – However it would technically take multiple channels to model a single Reactive Streams component (filter, transformer…) 48
  49. 49. 49 Reactive Streams: Joining forces ccv Doug Lea – SUNY Oswego
  50. 50. Reactive Streams: Joining forces 50 Reactor Data Driver Akka Distributed System RxJava Metrics Pipeline Ratpack HTTP server
  51. 51. Reactive Streams: Joining forces • Smart solution and pattern to all reactive applications • Writing a standard protocol works best when it is used (!) • Beyond the JVM, initial discussions for network stack started 51
  52. 52. Reactive Streams: Joining forces • Semantics – Single document listing full rules – Open enough to allow for various patterns • 4 API Interfaces – Publisher, Subscriber, Subscription, Processor • TCK to verify implementation behavior 52
  53. 53. Reactive Streams: org.reactivestreams 53 public interface Publisher<T> { public void subscribe(Subscriber<T> s); } public interface Subscriber<T> { public void onSubscribe(Subscription s); public void onNext(T t); public void onError(Throwable t); public void onComplete(); } public interface Subscription { public void request(int n); public void cancel(); } public interface Processor<T, R> extends Subscriber<T>, Publisher<R> {}
  54. 54. Reactive Streams: Reactor mapping 54 Publisher reactor.rx.Stream Subscriber reactor.rx.actions.Action Processor reactor.rx.Promise
  55. 55. Reactive Streams: Execution Model • Publisher creates a capacity-aware container – Subscription per Subscriber • No concurrent notifications on a same Subscriber • Asynchronous or Synchronous – must not impact negatively calling code 55
  56. 56. Reactive Streams: Signals 56 onError | (onSubscribe onNext* (onError | onComplete)?)
  57. 57. Reactive Streams: Async Boundaries Resource #1 R2 R3 Resource #4 57 nioSelectorThreadOrigin map(f) filter(p) consume(toNioSelectorOutput)
  58. 58. Reactive Streams: Async Boundaries Resource #1 Resource #4 58 nioSelectorThreadOrigin map(f) filter(p) consume(toNioSelectorOutput)
  59. 59. Reactive Streams: Async Boundaries Resource #1 Resource #2 59 nioSelectorThreadOrigin map(f) filter(p) consume(toNioSelectorOutput)
  60. 60. 10 slides and a demo to go :):):) 60
  61. 61. Reactor : Iterable Cold Stream 61 Streams .defer(env, 1, 2, 3, 4, 5) .subscribe(identityProcessor);
  62. 62. Reactor : Building blackbox processors 62 Processor<Integer,Integer> identityProcessor = Action.<Integer>passthrough(env.getDispatcher("ringBuffer")) .env(env) .capacity(bufferSize) .map(integer -> integer) .distinctUntilChanged() .flatMap(integer -> Promises.success(integer)) .filter(integer -> integer >= 0) .timeout(100) .combine();
  63. 63. A Full Slide Just To Talk About flatMap() 63 FlatMap Bucket Challenge ! Nominate 3 friends to explain flatMap()
  64. 64. Another Slide Just To Talk About flatMap() 64 flatMap() is nothing more than the functional alternative to RPC. Just a way to say “Ok bind this incoming data to this sub-flow and listen for the result, dude”.
  65. 65. The Last Slide about flatMap() 65 stream.flatMap{ name -> Streams.defer(name) .observe{ println 'so wow' } .map{ 'much monad'} }.consume{ assert it == 'much monad' } Feed a dynamic Sub-Stream with a name Sub-Stream definition Sub-Stream result is merged back to the top-level Steam
  66. 66. Reactor does also Scale-Up 66 deferred = Streams.defer(environment); deferred .parallel(8) .map(stream -> stream .map(i -> i) .reduce(2, service::reducePairAsMap) .consume(service::forwardToOutput) );
  67. 67. 67 DEMO https://github.com/SpringOne2GX-2014/reactive-geocoder
  68. 68. Early adopters • Checkpoint –Reactor 2.0.0.M1 implements 0.4.0 - TCK OK –Akka Streams implements 0.4.0 - TCK OK –Experiments started by RxJava –Ratpack 0.9.9 implements 0.4.0 - TCK WIP • Links –https://github.com/Netflix/RxJava –http://typesafe.com/blog/typesafe-announces-akka-streams –https://github.com/reactor/reactor –http://www.ratpack.io/manual/0.9.9/streams.html 68
  69. 69. ReactiveStreams.onSubscribe(Resources) • www.reactive-streams.org • https://github.com/reactive-streams/reactive-streams • on maven central : 0.4.0 – org.reactivestreams/reactive-streams • Current TCK preview on repo.akka.io : 0.4.0PSHOT – org.reactivestreams/reactive-streams-tck 69
  70. 70. ReactiveStreams.onNext(Roadmap) • Discussed for inclusion in JDK • Close to release: 0.4.0 – Evaluating TCK before going 0.4 final – TCK coverage by Akka Streams and Reactor – Need 3 passing implementations before going 1.0.0.M1 70
  71. 71. Reactor.onSubscribe(Resources) • http://projectreactor.cfapps.io/ • https://github.com/reactor • Twitter: @projectReactor • on maven central : 2.0.0.BUILD-SNAPSHOT – org.projectreactor/reactor 71
  72. 72. Reactor.onNext(Roadmap) • Versions • Imminent 2.0.0.M1 • 2.0.0.M2 - September • 2.0.0.RELEASE - End September/Early October • WIP: additional Stream operations, ecosystem upgrade, new starting guides 72
  73. 73. Reactor.onError(issues) • Tracker: • https://github.com/reactor/reactor/issues • Group: • https://groups.google.com/forum/?#!forum/reactor-framework 73
  74. 74. 74 Q & A
  75. 75. session.onComplete() 75

×