SlideShare ist ein Scribd-Unternehmen logo
1 von 90
Downloaden Sie, um offline zu lesen
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Reactor 3. 

Reactive Foundation for Java 8 and Spring
Stephane Maldini
@smaldini
Reactive ?
Reactive ?
Publisher Subscriber
Reactive Streams

reactive-streams.org
Publisher Subscriber
Reactive Streams

reactive-streams.org
Standard definition
Publisher Subscriber
Reactive Streams

reactive-streams.org
Standard definition
0..N Data 

+ 0..1 (Error | Complete)
Publisher Subscriber
Backpressure
Reactive Streams

reactive-streams.org
Standard definition
0..N Data 

+ 0..1 (Error | Complete)
Publisher Subscriber
Backpressure
Reactive Streams

reactive-streams.org
Standard definition
0..N Data 

+ 0..1 (Error | Complete)
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Reactor Core provides for a minimalist set of
Reactive Streams ready 

generators and transformers
4
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Reactor Core provides for a minimalist set of
Reactive Streams ready 

generators and transformers
4
WHY ?
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 5
DIY Reactive Streams
Publisher<User> rickSanchez =
userRepository.findUser(“rick”);
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 5
DIY Reactive Streams
Publisher<User> rickSanchez =
userRepository.findUser(“rick”);
Produce User when ready
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 5
DIY Reactive Streams
Publisher<User> rickSanchez =
userRepository.findUser(“rick”);
Might produce 0, 1 or N Users !
Produce User when ready
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 5
DIY Reactive Streams
Publisher<User> rickSanchez =
userRepository.findUser(“rick”);
Might produce 0, 1 or N Users !
Produce User when ready
rickSanchez.subscribe(new Subscriber<User>(){ … });
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 5
DIY Reactive Streams
Publisher<User> rickSanchez =
userRepository.findUser(“rick”);
Might produce 0, 1 or N Users !
Produce User when ready
Callback for start, result, error or complete
rickSanchez.subscribe(new Subscriber<User>(){ … });
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
DIY Reactive Streams
6
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
DIY Reactive Streams
6
Can I have an API ?
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
DIY Reactive Streams - top issues
• Should Work with RS TCK
• Address reentrance
• Address thread safety
• Address efficiency
• Address state
• For Many-To-One flows, implement your own merging operation
• For One-To-Many lows, implement your own broadcasting operation
• ….
7
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
DIY Reactive Streams - top issues
• Should Work with RS TCK
• Address reentrance
• Address thread safety
• Address efficiency
• Address state
• For Many-To-One flows, implement your own merging operation
• For One-To-Many lows, implement your own broadcasting operation
• ….
7
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 8
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
3 years to mature
9
R e a c t i v e S t r e a m s
C o m m o n s
I P C
A D D O N S
S p r i n g R x
C O R E
2013: 1.x 2014: 2.x 2016: 3.0
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
3 years to mature
9
R e a c t i v e S t r e a m s
C o m m o n s
I P C
A D D O N S
S p r i n g R x
C O R E
Existential
questions
2013: 1.x 2014: 2.x 2016: 3.0
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
3 years to mature
9
R e a c t i v e S t r e a m s
C o m m o n s
I P C
A D D O N S
S p r i n g R x
C O R E
Existential
questions
2013: 1.x 2014: 2.x 2016: 3.0
Microservices
become the norm
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
3 years to mature
9
R e a c t i v e S t r e a m s
C o m m o n s
I P C
A D D O N S
S p r i n g R x
C O R E
Existential
questions
2013: 1.x 2014: 2.x 2016: 3.0
Microservices
become the norm
Rocky style revival
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
3x Influences and Collaborations
10
R e a c t i v e S t r e a m s
C o m m o n s
I P C
A D D O N S
S p r i n g R x
C O R E
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
3x Influences and Collaborations
10
R e a c t i v e S t r e a m s
C o m m o n s
I P C
A D D O N S
S p r i n g R x
C O R E
Flux
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Flux.just("red", "white", "blue")

.flatMap(carRepository::findByColor)

.collect(Result::new, Result::add)

.doOnNext(Result::stop)

.subscribe(doWithResult);
A smarter Publisher ? Flux !
12
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Flux.just("red", "white", "blue")

.flatMap(carRepository::findByColor)

.collect(Result::new, Result::add)

.doOnNext(Result::stop)

.subscribe(doWithResult);
A smarter Publisher ? Flux !
12
interface CarRepository {
Flux<Car> findByColor(String color);
}
Mono
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Mono, push/pull CompletionStage
14
Mono.delayMillis(3000)

.map(d -> "Spring 4")

.or(Mono.delayMillis(2000).map(d -> "Spring 5"))

.then(t -> Mono.just(t+ " world"))

.elapsed()

.block();
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Mono, push/pull CompletionStage
14
Mono.delayMillis(3000)

.map(d -> "Spring 4")

.or(Mono.delayMillis(2000).map(d -> "Spring 5"))

.then(t -> Mono.just(t+ " world"))

.elapsed()

.block();
Non!
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Mono, push/pull CompletionStage
15
Mono.delayMillis(3000)

.map(d -> "Spring 4")

.or(Mono.delayMillis(2000).map(d -> "Spring 5"))

.then(t -> Mono.just(t+ " world"))

.elapsed()

.subscribe();
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Mono, push/pull CompletionStage
15
Mono.delayMillis(3000)

.map(d -> "Spring 4")

.or(Mono.delayMillis(2000).map(d -> "Spring 5"))

.then(t -> Mono.just(t+ " world"))

.elapsed()

.subscribe();
Oui!
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Non Blocking and RS types around
16
Type Semantic /Library Java 8
Reactive Streams
/Java 9
RxJava1

(java6)
Reactor3

(java8)
RxJava2

(java6)
0 or 1 result CompletableFuture<T> Publisher<T> Observable<T> Mono<T> Maybe<T>
0 or N results Publisher<T> Observable<T> Flux<T>
Observable<T>

Flowable<T>
1 result CompletableFuture<T> Publisher<T> Single<T> Mono<T> Single<T>
No result CompletableFuture<Void> Publisher<Void> Completable Mono<Void> Completable
*Reactive Streams types are in bold
**Akka Streams is also a notable RS implementor
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 17
3x Simpler API
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
ONE JAR

reactor-core.jar
17
3x Simpler API
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
ONE JAR

reactor-core.jar
17
3x Simpler API
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
ONE JAR

reactor-core.jar
17
3x Simpler API Where Flux and Mono live
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
ONE JAR

reactor-core.jar
17
3x Simpler API Where Flux and Mono live
Make task execution great again and FIFO
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Execution Model Freedom
18
Synchronous
Asynchronous
Scheduler /
Scheduler.Worker
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Execution Model Freedom
19
Publisher Subscriber
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Execution Model Freedom
19
Publisher Subscriber
Thread: MAIN
Thread: MAIN
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Execution Model Freedom
20
Publisher Subscriber
+publishOn()

Thread: Worker A
Thread: Worker A
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Execution Model Freedom
21
Publisher Subscriber
Thread: Worker B
+subscribeOn()
Thread: Worker B
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Execution Model Freedom
22
Publisher Subscriber
+publishOn()

Thread: Worker A
+subscribeOn()
Thread: Worker B
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
3x more focus on Javadoc
23
http://projectreactor.io/core/docs/api
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Learning to Flux & Mono
24
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Learning to Flux & Mono
24
https://spring.io/blog/2016/06/07/notes-on-
reactive-programming-part-i-the-reactive-
landscape
https://spring.io/blog/2016/06/13/notes-on-
reactive-programming-part-ii-writing-some-code
https://spring.io/blog/2016/07/20/notes-on-
reactive-programming-part-iii-a-simple-http-server-
application
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Learning to Flux & Mono
24
https://spring.io/blog/2016/06/07/notes-on-
reactive-programming-part-i-the-reactive-
landscape
https://spring.io/blog/2016/06/13/notes-on-
reactive-programming-part-ii-writing-some-code
https://spring.io/blog/2016/07/20/notes-on-
reactive-programming-part-iii-a-simple-http-server-
application
Just browse spring.io/blog already
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Bridge Existing Asynchronous Code
Mono<String> response = Mono.create(sink -> {

HttpListener listener = event -> {

if (event.getResponseCode() >= 400) {

sink.error(new RuntimeExeption("Failed"));

} else {

String body = event.getBody();

if (body.isEmpty()) {

sink.success();

} else {

sink.success(body.toLowerCase());

}

}

};



client.addListener(listener);



emitter.setCancellation(() -> client.removeListener(listener));

});
•
25
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Bridge Existing Asynchronous Code
Mono<String> response = Mono.create(sink -> {

HttpListener listener = event -> {

if (event.getResponseCode() >= 400) {

sink.error(new RuntimeExeption("Failed"));

} else {

String body = event.getBody();

if (body.isEmpty()) {

sink.success();

} else {

sink.success(body.toLowerCase());

}

}

};



client.addListener(listener);



emitter.setCancellation(() -> client.removeListener(listener));

});
•
25
Also exists for Flux of N items
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Debug Mode
26
215 Hooks.onOperator(op -> op.operatorStacktrace());
216 try {
217 Mono.just(1)
218 .map(d -> {
219 throw new RuntimeException();
220 })
221 .filter(d -> true)
222 .timestamp()
223 .elapsed()
224 .map(d -> d)
225 .block();
226 }
227 catch(Exception e){
228 e.printStackTrace();
229 }
230 finally {
231 Hooks.resetOnOperator();
232 }
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Debug Mode
26
215 Hooks.onOperator(op -> op.operatorStacktrace());
216 try {
217 Mono.just(1)
218 .map(d -> {
219 throw new RuntimeException();
220 })
221 .filter(d -> true)
222 .timestamp()
223 .elapsed()
224 .map(d -> d)
225 .block();
226 }
227 catch(Exception e){
228 e.printStackTrace();
229 }
230 finally {
231 Hooks.resetOnOperator();
232 }
Capture stack for each
operator declared after
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Debug Mode
26
215 Hooks.onOperator(op -> op.operatorStacktrace());
216 try {
217 Mono.just(1)
218 .map(d -> {
219 throw new RuntimeException();
220 })
221 .filter(d -> true)
222 .timestamp()
223 .elapsed()
224 .map(d -> d)
225 .block();
226 }
227 catch(Exception e){
228 e.printStackTrace();
229 }
230 finally {
231 Hooks.resetOnOperator();
232 }
Capture stack for each
operator declared after
Assembly trace from producer [reactor.core.publisher.MonoMapFuseable] :
reactor.core.publisher.Mono.map(Mono.java:1795)
reactor.HooksTest.testTrace2(HooksTest.java:218)
Composition chain until failing Operator :
|_ Mono.map(HooksTest.java:218)
|_ Mono.filter(HooksTest.java:221)
|_ Mono.timestamp(HooksTest.java:222)
|_ Mono.elapsed(HooksTest.java:223)
|_ Mono.map(HooksTest.java:224)
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Create Gateways to Flux And Mono
27
EmitterProcessor<Integer> processor = EmitterProcessor.create();



int n = 100_000;

processor.publishOn(Schedulers.single())

.subscribe(someService::handleData);



BlockingSink<Integer> session = processor.connectSink();



for (int i = 0; i < n; i++) {

while (!session.emit(i).isOk()) {

if (session.hasFailed()) {

throw session.getError();

}
//fake throttling
Thread.sleep(1);

}

}

session.finish();
•
EmitterProcessor
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Create Gateways to Flux And Mono
27
EmitterProcessor<Integer> processor = EmitterProcessor.create();



int n = 100_000;

processor.publishOn(Schedulers.single())

.subscribe(someService::handleData);



BlockingSink<Integer> session = processor.connectSink();



for (int i = 0; i < n; i++) {

while (!session.emit(i).isOk()) {

if (session.hasFailed()) {

throw session.getError();

}
//fake throttling
Thread.sleep(1);

}

}

session.finish();
•
EmitterProcessor
Backpressure Companion
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
EmitterProcessor<Integer> processor = EmitterProcessor.create();



int n = 100_000;

processor.publishOn(Schedulers.single())

.subscribe(someService::handleData);



BlockingSink<Integer> session = processor.connectSink();



for (int i = 0; i < n; i++) {

while (!session.emit(i).isOk()) {

if (session.hasFailed()) {

throw session.getError();

}
Thread.sleep(1); //fake throttling

}

}

session.finish();
•
Create Gateways to Flux And Mono
28
EmitterProcessor
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Operation Fusion
• Reactor has a mission to limit the overhead in stack and message
passing
• 2 key categories :
• “Macro Fusion” : merge operators in one (assembly time)
• “Micro Fusion” : avoid queue creation and short circuit where
possible request lifecycle.
29
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Starve CPU’s with ParallelFlux…
30
Flux.range(1, 100000)

.parallel(3)

.runOn(Schedulers.parallel())

.collect(ArrayList::new, ArrayList::add)

.sequential()

.reduce(0, (a, b) -> a + b.size())

.subscribeWith(TestSubscriber.create())

.await(Duration.ofSeconds(5))

.assertValues(100_000)

.assertNoError()

.assertComplete();
•
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Starve CPU’s with ParallelFlux…
30
Flux.range(1, 100000)

.parallel(3)

.runOn(Schedulers.parallel())

.collect(ArrayList::new, ArrayList::add)

.sequential()

.reduce(0, (a, b) -> a + b.size())

.subscribeWith(TestSubscriber.create())

.await(Duration.ofSeconds(5))

.assertValues(100_000)

.assertNoError()

.assertComplete();
•
x3
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Efficient and micro bench ready
31
https://github.com/akarnokd/akarnokd-misc/tree/master/src/jmh/java/hu/akarnokd/comparison
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Efficient and micro bench ready
31
https://github.com/akarnokd/akarnokd-misc/tree/master/src/jmh/java/hu/akarnokd/comparison
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Efficient and micro bench ready
31
https://github.com/akarnokd/akarnokd-misc/tree/master/src/jmh/java/hu/akarnokd/comparison
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Bridge Fabulous RxJava
32
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Bridge Fabulous RxJava
32
RxJava1Adapter
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Bridge Java 9 Reactive Streams
33
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Bridge Java 9 Reactive Streams
33
JdkFlowAdapter
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Play with Reactor Core .NET
34
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Play with Reactor Core .NET
34
https://www.nuget.org/packages/Reactor.Core/
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Backpressure for JS: Reactor Core TypeScript
35
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Backpressure for JS: Reactor Core TypeScript
35
https://www.npmjs.com/package/reactor-core-js
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
EVERYTHING REACTIVE ?
36
µ Service A
Data
Cloud
Messaging
Web
Service B
Message

Broker
Datastore
20 ms
50 ms
150 ms
250 ms
20 ms
15 ms
3 ms
GATEWAY
µ Service A
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Reactor Ecosystem roadmap
39
Reactor Netty
Reactor IPC
Spring Framework
Spring 5, 

Spring Cloud Stream, 

Spring Integration,

Spring Data, 

Spring Boot, 

Spring Cloud, 

Spring Security,

…
Reactor Kafka
Extra add-ons

dashboard, bus,
codecs, more
operations &
schedulers…
Reactor Redis
Reactor Aeron
Spring Framework 5
Spring Web MVC
@Controller, @RequestMapping
Servlet API
Servlet Container
Spring Web MVC
@Controller, @RequestMapping
Servlet API
Servlet Container
Reactive
Non-blocking
…
Spring Web MVC Spring Web Reactive
@Controller, @RequestMapping
Servlet API
Servlet Container
Spring Web MVC Spring Web Reactive
@Controller, @RequestMapping
Servlet API
Servlet Container
Reactive HTTP
Spring Web MVC Spring Web Reactive
@Controller, @RequestMapping
Servlet API
Servlet Container
Reactive HTTP
Servlet 3.1 Container
Spring Web MVC Spring Web Reactive
@Controller, @RequestMapping
Servlet API
Servlet Container
Reactive HTTP
Servlet 3.1 ContainerServlet 3.1, Netty
Spring Web MVC Spring Web Reactive
@Controller, @RequestMapping
Servlet API
Servlet Container
Reactive HTTP
Servlet 3.1 ContainerServlet 3.1, Netty, Undertow
Non-Blocking HTTP GET
Non-Blocking HTTP POST
WebClient Scatter/Gather
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 51
SpringBootApplication

@EnableBinding(Processor.class)

public class WordCountApplication {



@StreamListener

@Output("output")

public Flux<WordCount> countWords(@Input("input") Flux<String> words) {

return words.window(ofSeconds(5), ofSeconds(1))

.flatMap(window -> window.groupBy(word -> word)

.flatMap(group -> group.reduce(0, (counter, word) -> counter + 1)

.map(count -> new WordCount(group.key(), count))));

}
}
Spring Cloud Stream: 

Stateful processors
Boot Data Cloud IntegrationSecurity
Reactive Efforts
Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a
Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
@ProjectReactor
http://github.com/reactor
http://projectreactor.io
Extra Slideware:
www.slideshare.net/SpringCentral/imperative-to-reactive-web-applications
www.slideshare.net/SpringCentral/designing-implementing-and-using-reactive-apis
http://www.slideshare.net/RobHarrop/going-reactive-63425158

Weitere ähnliche Inhalte

Was ist angesagt?

「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜
「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜
「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜
Takahiro Inoue
 
AmebaのMongoDB活用事例
AmebaのMongoDB活用事例AmebaのMongoDB活用事例
AmebaのMongoDB活用事例
Akihiro Kuwano
 
Mongo dbを知ろう
Mongo dbを知ろうMongo dbを知ろう
Mongo dbを知ろう
CROOZ, inc.
 

Was ist angesagt? (20)

がっつりMongoDB事例紹介
がっつりMongoDB事例紹介がっつりMongoDB事例紹介
がっつりMongoDB事例紹介
 
Introduction to Kafka Cruise Control
Introduction to Kafka Cruise ControlIntroduction to Kafka Cruise Control
Introduction to Kafka Cruise Control
 
RDB技術者のためのNoSQLガイド NoSQLの必要性と位置づけ
RDB技術者のためのNoSQLガイド NoSQLの必要性と位置づけRDB技術者のためのNoSQLガイド NoSQLの必要性と位置づけ
RDB技術者のためのNoSQLガイド NoSQLの必要性と位置づけ
 
Serverless時代のJavaについて
Serverless時代のJavaについてServerless時代のJavaについて
Serverless時代のJavaについて
 
マイクロサービスにおける 結果整合性との戦い
マイクロサービスにおける 結果整合性との戦いマイクロサービスにおける 結果整合性との戦い
マイクロサービスにおける 結果整合性との戦い
 
「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜
「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜
「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜
 
REST API のコツ
REST API のコツREST API のコツ
REST API のコツ
 
オラクルのHPC/GPUソリューションご紹介(2021/08版)
オラクルのHPC/GPUソリューションご紹介(2021/08版)オラクルのHPC/GPUソリューションご紹介(2021/08版)
オラクルのHPC/GPUソリューションご紹介(2021/08版)
 
Apache Spark 2.4 and 3.0 What's Next?
Apache Spark 2.4 and 3.0  What's Next? Apache Spark 2.4 and 3.0  What's Next?
Apache Spark 2.4 and 3.0 What's Next?
 
ClickHouse導入事例紹介
ClickHouse導入事例紹介ClickHouse導入事例紹介
ClickHouse導入事例紹介
 
ゼロから始めるSparkSQL徹底活用!
ゼロから始めるSparkSQL徹底活用!ゼロから始めるSparkSQL徹底活用!
ゼロから始めるSparkSQL徹底活用!
 
機械学習の定番プラットフォームSparkの紹介
機械学習の定番プラットフォームSparkの紹介機械学習の定番プラットフォームSparkの紹介
機械学習の定番プラットフォームSparkの紹介
 
JVMのGCアルゴリズムとチューニング
JVMのGCアルゴリズムとチューニングJVMのGCアルゴリズムとチューニング
JVMのGCアルゴリズムとチューニング
 
AmebaのMongoDB活用事例
AmebaのMongoDB活用事例AmebaのMongoDB活用事例
AmebaのMongoDB活用事例
 
Mongo dbを知ろう
Mongo dbを知ろうMongo dbを知ろう
Mongo dbを知ろう
 
Java Clientで入門する Apache Kafka #jjug_ccc #ccc_e2
Java Clientで入門する Apache Kafka #jjug_ccc #ccc_e2Java Clientで入門する Apache Kafka #jjug_ccc #ccc_e2
Java Clientで入門する Apache Kafka #jjug_ccc #ccc_e2
 
Mule Runtime のアーキテクチャコンセプト紹介
Mule Runtime のアーキテクチャコンセプト紹介Mule Runtime のアーキテクチャコンセプト紹介
Mule Runtime のアーキテクチャコンセプト紹介
 
グラフデータベース Neptune 使ってみた
グラフデータベース Neptune 使ってみたグラフデータベース Neptune 使ってみた
グラフデータベース Neptune 使ってみた
 
Introduction and Overview of Apache Kafka, TriHUG July 23, 2013
Introduction and Overview of Apache Kafka, TriHUG July 23, 2013Introduction and Overview of Apache Kafka, TriHUG July 23, 2013
Introduction and Overview of Apache Kafka, TriHUG July 23, 2013
 
Apache Hadoop YARNとマルチテナントにおけるリソース管理
Apache Hadoop YARNとマルチテナントにおけるリソース管理Apache Hadoop YARNとマルチテナントにおけるリソース管理
Apache Hadoop YARNとマルチテナントにおけるリソース管理
 

Andere mochten auch

โรงไฟฟ้านิวเคลียร์ 1
โรงไฟฟ้านิวเคลียร์ 1โรงไฟฟ้านิวเคลียร์ 1
โรงไฟฟ้านิวเคลียร์ 1
nuchida suwapaet
 

Andere mochten auch (18)

Reactive Programming in Spring 5
Reactive Programming in Spring 5Reactive Programming in Spring 5
Reactive Programming in Spring 5
 
Reactive Spring Framework 5
Reactive Spring Framework 5Reactive Spring Framework 5
Reactive Spring Framework 5
 
Reactor, Reactive streams and MicroServices
Reactor, Reactive streams and MicroServicesReactor, Reactive streams and MicroServices
Reactor, Reactive streams and MicroServices
 
Going Reactive
Going ReactiveGoing Reactive
Going Reactive
 
Embracing Reactive Streams with Java 9 and Spring 5
Embracing Reactive Streams with Java 9 and Spring 5Embracing Reactive Streams with Java 9 and Spring 5
Embracing Reactive Streams with Java 9 and Spring 5
 
Designing for Distributed Systems with Reactor and Reactive Streams
Designing for Distributed Systems with Reactor and Reactive StreamsDesigning for Distributed Systems with Reactor and Reactive Streams
Designing for Distributed Systems with Reactor and Reactive Streams
 
Machine intelligence
Machine intelligenceMachine intelligence
Machine intelligence
 
Introduction to Reactive Streams and Reactor 2.5
Introduction to Reactive Streams and Reactor 2.5Introduction to Reactive Streams and Reactor 2.5
Introduction to Reactive Streams and Reactor 2.5
 
Reactive Web Applications
Reactive Web ApplicationsReactive Web Applications
Reactive Web Applications
 
Supercharged java 8 : with cyclops-react
Supercharged java 8 : with cyclops-reactSupercharged java 8 : with cyclops-react
Supercharged java 8 : with cyclops-react
 
Eventsggx
EventsggxEventsggx
Eventsggx
 
โรงไฟฟ้านิวเคลียร์ 1
โรงไฟฟ้านิวเคลียร์ 1โรงไฟฟ้านิวเคลียร์ 1
โรงไฟฟ้านิวเคลียร์ 1
 
Spring 5 + Kotlin (Rus)
Spring 5 + Kotlin (Rus)Spring 5 + Kotlin (Rus)
Spring 5 + Kotlin (Rus)
 
Reactive Software Systems
Reactive Software SystemsReactive Software Systems
Reactive Software Systems
 
Asynchronous design with Spring and RTI: 1M events per second
Asynchronous design with Spring and RTI: 1M events per secondAsynchronous design with Spring and RTI: 1M events per second
Asynchronous design with Spring and RTI: 1M events per second
 
The Reactive Manifesto: Message-driven, Resilient, Elastic, Responsive - Stef...
The Reactive Manifesto: Message-driven, Resilient, Elastic, Responsive - Stef...The Reactive Manifesto: Message-driven, Resilient, Elastic, Responsive - Stef...
The Reactive Manifesto: Message-driven, Resilient, Elastic, Responsive - Stef...
 
Spring Framework 5: History and Reactive features
Spring Framework 5: History and Reactive featuresSpring Framework 5: History and Reactive features
Spring Framework 5: History and Reactive features
 
Understanding Microservice Performance
Understanding Microservice PerformanceUnderstanding Microservice Performance
Understanding Microservice Performance
 

Ähnlich wie Reactor 3.0, a reactive foundation for java 8 and Spring

Case Study of Batch Processing With Spring Cloud Data Flow Server in Cloud Fo...
Case Study of Batch Processing With Spring Cloud Data Flow Server in Cloud Fo...Case Study of Batch Processing With Spring Cloud Data Flow Server in Cloud Fo...
Case Study of Batch Processing With Spring Cloud Data Flow Server in Cloud Fo...
VMware Tanzu
 

Ähnlich wie Reactor 3.0, a reactive foundation for java 8 and Spring (20)

Avoiding that $1M Dollar AWS Bill
Avoiding that $1M Dollar AWS BillAvoiding that $1M Dollar AWS Bill
Avoiding that $1M Dollar AWS Bill
 
Continuous Delivery for Microservice Architectures with Concourse & Cloud Fou...
Continuous Delivery for Microservice Architectures with Concourse & Cloud Fou...Continuous Delivery for Microservice Architectures with Concourse & Cloud Fou...
Continuous Delivery for Microservice Architectures with Concourse & Cloud Fou...
 
Reactive frontends with RxJS and Angular
Reactive frontends with RxJS and AngularReactive frontends with RxJS and Angular
Reactive frontends with RxJS and Angular
 
SpringOnePlatform2017 recap
SpringOnePlatform2017 recapSpringOnePlatform2017 recap
SpringOnePlatform2017 recap
 
Zuul @ Netflix SpringOne Platform
Zuul @ Netflix SpringOne PlatformZuul @ Netflix SpringOne Platform
Zuul @ Netflix SpringOne Platform
 
Implementing microservices tracing with spring cloud and zipkin (spring one)
Implementing microservices tracing with spring cloud and zipkin (spring one)Implementing microservices tracing with spring cloud and zipkin (spring one)
Implementing microservices tracing with spring cloud and zipkin (spring one)
 
Cloud Native Java with Spring Cloud Services
Cloud Native Java with Spring Cloud ServicesCloud Native Java with Spring Cloud Services
Cloud Native Java with Spring Cloud Services
 
Under the Hood of Reactive Data Access (2/2)
Under the Hood of Reactive Data Access (2/2)Under the Hood of Reactive Data Access (2/2)
Under the Hood of Reactive Data Access (2/2)
 
Tools to Slay the Fire Breathing Monoliths in Your Enterprise
Tools to Slay the Fire Breathing Monoliths in Your EnterpriseTools to Slay the Fire Breathing Monoliths in Your Enterprise
Tools to Slay the Fire Breathing Monoliths in Your Enterprise
 
Who Does What? Mapping Cloud Foundry Activities and Entitlements to IT Roles
Who Does What? Mapping Cloud Foundry Activities and Entitlements to IT RolesWho Does What? Mapping Cloud Foundry Activities and Entitlements to IT Roles
Who Does What? Mapping Cloud Foundry Activities and Entitlements to IT Roles
 
In the workshop with GCP, Home Depot & Cloud Foundry
In the workshop with GCP, Home Depot & Cloud FoundryIn the workshop with GCP, Home Depot & Cloud Foundry
In the workshop with GCP, Home Depot & Cloud Foundry
 
Under the Hood of Reactive Data Access (1/2)
Under the Hood of Reactive Data Access (1/2)Under the Hood of Reactive Data Access (1/2)
Under the Hood of Reactive Data Access (1/2)
 
What's new in Reactor Californium
What's new in Reactor CaliforniumWhat's new in Reactor Californium
What's new in Reactor Californium
 
Caching for Microservives - Introduction to Pivotal Cloud Cache
Caching for Microservives - Introduction to Pivotal Cloud CacheCaching for Microservives - Introduction to Pivotal Cloud Cache
Caching for Microservives - Introduction to Pivotal Cloud Cache
 
Enable SQL/JDBC Access to Apache Geode/GemFire Using Apache Calcite
Enable SQL/JDBC Access to Apache Geode/GemFire Using Apache CalciteEnable SQL/JDBC Access to Apache Geode/GemFire Using Apache Calcite
Enable SQL/JDBC Access to Apache Geode/GemFire Using Apache Calcite
 
Marcin Grzejszczak - Contract Tests in the Enterprise
Marcin Grzejszczak - Contract Tests in the EnterpriseMarcin Grzejszczak - Contract Tests in the Enterprise
Marcin Grzejszczak - Contract Tests in the Enterprise
 
Latency analysis for your microservices using Spring Cloud & Zipkin
Latency analysis for your microservices using Spring Cloud & ZipkinLatency analysis for your microservices using Spring Cloud & Zipkin
Latency analysis for your microservices using Spring Cloud & Zipkin
 
Case Study of Batch Processing With Spring Cloud Data Flow Server in Cloud Fo...
Case Study of Batch Processing With Spring Cloud Data Flow Server in Cloud Fo...Case Study of Batch Processing With Spring Cloud Data Flow Server in Cloud Fo...
Case Study of Batch Processing With Spring Cloud Data Flow Server in Cloud Fo...
 
Cloud Native Key Management
Cloud Native Key ManagementCloud Native Key Management
Cloud Native Key Management
 
Documenting RESTful APIs with Spring REST Docs
Documenting RESTful APIs with Spring REST Docs Documenting RESTful APIs with Spring REST Docs
Documenting RESTful APIs with Spring REST Docs
 

Mehr von Stéphane Maldini

Reactor grails realtime web devoxx 2013
Reactor grails realtime web   devoxx 2013Reactor grails realtime web   devoxx 2013
Reactor grails realtime web devoxx 2013
Stéphane Maldini
 
Groovy reactor grails realtime web devoxx 2013
Groovy reactor grails realtime web   devoxx 2013Groovy reactor grails realtime web   devoxx 2013
Groovy reactor grails realtime web devoxx 2013
Stéphane Maldini
 

Mehr von Stéphane Maldini (11)

The value of reactive
The value of reactiveThe value of reactive
The value of reactive
 
Multi-service reactive streams using Spring, Reactor, RSocket
Multi-service reactive streams using Spring, Reactor, RSocketMulti-service reactive streams using Spring, Reactor, RSocket
Multi-service reactive streams using Spring, Reactor, RSocket
 
The Future of Reactive Architectures
The Future of Reactive ArchitecturesThe Future of Reactive Architectures
The Future of Reactive Architectures
 
Spring Cloud Gateway
Spring Cloud GatewaySpring Cloud Gateway
Spring Cloud Gateway
 
Spring boot 2.0 reactive bits (June 2018)
Spring boot 2.0 reactive bits (June 2018)Spring boot 2.0 reactive bits (June 2018)
Spring boot 2.0 reactive bits (June 2018)
 
Intro to Reactive Programming
Intro to Reactive ProgrammingIntro to Reactive Programming
Intro to Reactive Programming
 
Springone2gx 2014 Reactive Streams and Reactor
Springone2gx 2014 Reactive Streams and ReactorSpringone2gx 2014 Reactive Streams and Reactor
Springone2gx 2014 Reactive Streams and Reactor
 
Reactor grails realtime web devoxx 2013
Reactor grails realtime web   devoxx 2013Reactor grails realtime web   devoxx 2013
Reactor grails realtime web devoxx 2013
 
Groovy reactor grails realtime web devoxx 2013
Groovy reactor grails realtime web   devoxx 2013Groovy reactor grails realtime web   devoxx 2013
Groovy reactor grails realtime web devoxx 2013
 
Ss2gx
Ss2gxSs2gx
Ss2gx
 
Reactor spring one2gx_2013_0902-final
Reactor spring one2gx_2013_0902-finalReactor spring one2gx_2013_0902-final
Reactor spring one2gx_2013_0902-final
 

Kürzlich hochgeladen

JustNaik Solution Deck (stage bus sector)
JustNaik Solution Deck (stage bus sector)JustNaik Solution Deck (stage bus sector)
JustNaik Solution Deck (stage bus sector)
Max Lee
 

Kürzlich hochgeladen (20)

Wired_2.0_CREATE YOUR ULTIMATE LEARNING ENVIRONMENT_JCON_16052024
Wired_2.0_CREATE YOUR ULTIMATE LEARNING ENVIRONMENT_JCON_16052024Wired_2.0_CREATE YOUR ULTIMATE LEARNING ENVIRONMENT_JCON_16052024
Wired_2.0_CREATE YOUR ULTIMATE LEARNING ENVIRONMENT_JCON_16052024
 
Sourcing Success - How to Find a Clothing Manufacturer
Sourcing Success - How to Find a Clothing ManufacturerSourcing Success - How to Find a Clothing Manufacturer
Sourcing Success - How to Find a Clothing Manufacturer
 
Implementing KPIs and Right Metrics for Agile Delivery Teams.pdf
Implementing KPIs and Right Metrics for Agile Delivery Teams.pdfImplementing KPIs and Right Metrics for Agile Delivery Teams.pdf
Implementing KPIs and Right Metrics for Agile Delivery Teams.pdf
 
Microsoft 365 Copilot; An AI tool changing the world of work _PDF.pdf
Microsoft 365 Copilot; An AI tool changing the world of work _PDF.pdfMicrosoft 365 Copilot; An AI tool changing the world of work _PDF.pdf
Microsoft 365 Copilot; An AI tool changing the world of work _PDF.pdf
 
The Impact of PLM Software on Fashion Production
The Impact of PLM Software on Fashion ProductionThe Impact of PLM Software on Fashion Production
The Impact of PLM Software on Fashion Production
 
Workforce Efficiency with Employee Time Tracking Software.pdf
Workforce Efficiency with Employee Time Tracking Software.pdfWorkforce Efficiency with Employee Time Tracking Software.pdf
Workforce Efficiency with Employee Time Tracking Software.pdf
 
The mythical technical debt. (Brooke, please, forgive me)
The mythical technical debt. (Brooke, please, forgive me)The mythical technical debt. (Brooke, please, forgive me)
The mythical technical debt. (Brooke, please, forgive me)
 
5 Reasons Driving Warehouse Management Systems Demand
5 Reasons Driving Warehouse Management Systems Demand5 Reasons Driving Warehouse Management Systems Demand
5 Reasons Driving Warehouse Management Systems Demand
 
A Deep Dive into Secure Product Development Frameworks.pdf
A Deep Dive into Secure Product Development Frameworks.pdfA Deep Dive into Secure Product Development Frameworks.pdf
A Deep Dive into Secure Product Development Frameworks.pdf
 
Optimizing Operations by Aligning Resources with Strategic Objectives Using O...
Optimizing Operations by Aligning Resources with Strategic Objectives Using O...Optimizing Operations by Aligning Resources with Strategic Objectives Using O...
Optimizing Operations by Aligning Resources with Strategic Objectives Using O...
 
Odoo vs Shopify: Why Odoo is Best for Ecommerce Website Builder in 2024
Odoo vs Shopify: Why Odoo is Best for Ecommerce Website Builder in 2024Odoo vs Shopify: Why Odoo is Best for Ecommerce Website Builder in 2024
Odoo vs Shopify: Why Odoo is Best for Ecommerce Website Builder in 2024
 
AI Hackathon.pptx
AI                        Hackathon.pptxAI                        Hackathon.pptx
AI Hackathon.pptx
 
JustNaik Solution Deck (stage bus sector)
JustNaik Solution Deck (stage bus sector)JustNaik Solution Deck (stage bus sector)
JustNaik Solution Deck (stage bus sector)
 
What is an API Development- Definition, Types, Specifications, Documentation.pdf
What is an API Development- Definition, Types, Specifications, Documentation.pdfWhat is an API Development- Definition, Types, Specifications, Documentation.pdf
What is an API Development- Definition, Types, Specifications, Documentation.pdf
 
KLARNA - Language Models and Knowledge Graphs: A Systems Approach
KLARNA -  Language Models and Knowledge Graphs: A Systems ApproachKLARNA -  Language Models and Knowledge Graphs: A Systems Approach
KLARNA - Language Models and Knowledge Graphs: A Systems Approach
 
Anypoint Code Builder - Munich MuleSoft Meetup - 16th May 2024
Anypoint Code Builder - Munich MuleSoft Meetup - 16th May 2024Anypoint Code Builder - Munich MuleSoft Meetup - 16th May 2024
Anypoint Code Builder - Munich MuleSoft Meetup - 16th May 2024
 
architecting-ai-in-the-enterprise-apis-and-applications.pdf
architecting-ai-in-the-enterprise-apis-and-applications.pdfarchitecting-ai-in-the-enterprise-apis-and-applications.pdf
architecting-ai-in-the-enterprise-apis-and-applications.pdf
 
Modern binary build systems - PyCon 2024
Modern binary build systems - PyCon 2024Modern binary build systems - PyCon 2024
Modern binary build systems - PyCon 2024
 
IT Software Development Resume, Vaibhav jha 2024
IT Software Development Resume, Vaibhav jha 2024IT Software Development Resume, Vaibhav jha 2024
IT Software Development Resume, Vaibhav jha 2024
 
A Guideline to Zendesk to Re:amaze Data Migration
A Guideline to Zendesk to Re:amaze Data MigrationA Guideline to Zendesk to Re:amaze Data Migration
A Guideline to Zendesk to Re:amaze Data Migration
 

Reactor 3.0, a reactive foundation for java 8 and Spring

  • 1. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Reactor 3. 
 Reactive Foundation for Java 8 and Spring Stephane Maldini @smaldini
  • 6. Publisher Subscriber Reactive Streams
 reactive-streams.org Standard definition 0..N Data 
 + 0..1 (Error | Complete)
  • 9. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Reactor Core provides for a minimalist set of Reactive Streams ready 
 generators and transformers 4
  • 10. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Reactor Core provides for a minimalist set of Reactive Streams ready 
 generators and transformers 4 WHY ?
  • 11. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 5 DIY Reactive Streams Publisher<User> rickSanchez = userRepository.findUser(“rick”);
  • 12. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 5 DIY Reactive Streams Publisher<User> rickSanchez = userRepository.findUser(“rick”); Produce User when ready
  • 13. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 5 DIY Reactive Streams Publisher<User> rickSanchez = userRepository.findUser(“rick”); Might produce 0, 1 or N Users ! Produce User when ready
  • 14. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 5 DIY Reactive Streams Publisher<User> rickSanchez = userRepository.findUser(“rick”); Might produce 0, 1 or N Users ! Produce User when ready rickSanchez.subscribe(new Subscriber<User>(){ … });
  • 15. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 5 DIY Reactive Streams Publisher<User> rickSanchez = userRepository.findUser(“rick”); Might produce 0, 1 or N Users ! Produce User when ready Callback for start, result, error or complete rickSanchez.subscribe(new Subscriber<User>(){ … });
  • 16. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ DIY Reactive Streams 6
  • 17. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ DIY Reactive Streams 6 Can I have an API ?
  • 18. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ DIY Reactive Streams - top issues • Should Work with RS TCK • Address reentrance • Address thread safety • Address efficiency • Address state • For Many-To-One flows, implement your own merging operation • For One-To-Many lows, implement your own broadcasting operation • …. 7
  • 19. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ DIY Reactive Streams - top issues • Should Work with RS TCK • Address reentrance • Address thread safety • Address efficiency • Address state • For Many-To-One flows, implement your own merging operation • For One-To-Many lows, implement your own broadcasting operation • …. 7
  • 20. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 8
  • 21. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 3 years to mature 9 R e a c t i v e S t r e a m s C o m m o n s I P C A D D O N S S p r i n g R x C O R E 2013: 1.x 2014: 2.x 2016: 3.0
  • 22. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 3 years to mature 9 R e a c t i v e S t r e a m s C o m m o n s I P C A D D O N S S p r i n g R x C O R E Existential questions 2013: 1.x 2014: 2.x 2016: 3.0
  • 23. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 3 years to mature 9 R e a c t i v e S t r e a m s C o m m o n s I P C A D D O N S S p r i n g R x C O R E Existential questions 2013: 1.x 2014: 2.x 2016: 3.0 Microservices become the norm
  • 24. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 3 years to mature 9 R e a c t i v e S t r e a m s C o m m o n s I P C A D D O N S S p r i n g R x C O R E Existential questions 2013: 1.x 2014: 2.x 2016: 3.0 Microservices become the norm Rocky style revival
  • 25. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 3x Influences and Collaborations 10 R e a c t i v e S t r e a m s C o m m o n s I P C A D D O N S S p r i n g R x C O R E
  • 26. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 3x Influences and Collaborations 10 R e a c t i v e S t r e a m s C o m m o n s I P C A D D O N S S p r i n g R x C O R E
  • 27. Flux
  • 28. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Flux.just("red", "white", "blue")
 .flatMap(carRepository::findByColor)
 .collect(Result::new, Result::add)
 .doOnNext(Result::stop)
 .subscribe(doWithResult); A smarter Publisher ? Flux ! 12
  • 29. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Flux.just("red", "white", "blue")
 .flatMap(carRepository::findByColor)
 .collect(Result::new, Result::add)
 .doOnNext(Result::stop)
 .subscribe(doWithResult); A smarter Publisher ? Flux ! 12 interface CarRepository { Flux<Car> findByColor(String color); }
  • 30. Mono
  • 31. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Mono, push/pull CompletionStage 14 Mono.delayMillis(3000)
 .map(d -> "Spring 4")
 .or(Mono.delayMillis(2000).map(d -> "Spring 5"))
 .then(t -> Mono.just(t+ " world"))
 .elapsed()
 .block();
  • 32. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Mono, push/pull CompletionStage 14 Mono.delayMillis(3000)
 .map(d -> "Spring 4")
 .or(Mono.delayMillis(2000).map(d -> "Spring 5"))
 .then(t -> Mono.just(t+ " world"))
 .elapsed()
 .block(); Non!
  • 33. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Mono, push/pull CompletionStage 15 Mono.delayMillis(3000)
 .map(d -> "Spring 4")
 .or(Mono.delayMillis(2000).map(d -> "Spring 5"))
 .then(t -> Mono.just(t+ " world"))
 .elapsed()
 .subscribe();
  • 34. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Mono, push/pull CompletionStage 15 Mono.delayMillis(3000)
 .map(d -> "Spring 4")
 .or(Mono.delayMillis(2000).map(d -> "Spring 5"))
 .then(t -> Mono.just(t+ " world"))
 .elapsed()
 .subscribe(); Oui!
  • 35. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Non Blocking and RS types around 16 Type Semantic /Library Java 8 Reactive Streams /Java 9 RxJava1
 (java6) Reactor3
 (java8) RxJava2
 (java6) 0 or 1 result CompletableFuture<T> Publisher<T> Observable<T> Mono<T> Maybe<T> 0 or N results Publisher<T> Observable<T> Flux<T> Observable<T>
 Flowable<T> 1 result CompletableFuture<T> Publisher<T> Single<T> Mono<T> Single<T> No result CompletableFuture<Void> Publisher<Void> Completable Mono<Void> Completable *Reactive Streams types are in bold **Akka Streams is also a notable RS implementor
  • 36. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 17 3x Simpler API
  • 37. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ ONE JAR
 reactor-core.jar 17 3x Simpler API
  • 38. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ ONE JAR
 reactor-core.jar 17 3x Simpler API
  • 39. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ ONE JAR
 reactor-core.jar 17 3x Simpler API Where Flux and Mono live
  • 40. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ ONE JAR
 reactor-core.jar 17 3x Simpler API Where Flux and Mono live Make task execution great again and FIFO
  • 41. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Execution Model Freedom 18 Synchronous Asynchronous Scheduler / Scheduler.Worker
  • 42. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Execution Model Freedom 19 Publisher Subscriber
  • 43. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Execution Model Freedom 19 Publisher Subscriber Thread: MAIN Thread: MAIN
  • 44. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Execution Model Freedom 20 Publisher Subscriber +publishOn()
 Thread: Worker A Thread: Worker A
  • 45. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Execution Model Freedom 21 Publisher Subscriber Thread: Worker B +subscribeOn() Thread: Worker B
  • 46. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Execution Model Freedom 22 Publisher Subscriber +publishOn()
 Thread: Worker A +subscribeOn() Thread: Worker B
  • 47. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 3x more focus on Javadoc 23 http://projectreactor.io/core/docs/api
  • 48. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Learning to Flux & Mono 24
  • 49. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Learning to Flux & Mono 24 https://spring.io/blog/2016/06/07/notes-on- reactive-programming-part-i-the-reactive- landscape https://spring.io/blog/2016/06/13/notes-on- reactive-programming-part-ii-writing-some-code https://spring.io/blog/2016/07/20/notes-on- reactive-programming-part-iii-a-simple-http-server- application
  • 50. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Learning to Flux & Mono 24 https://spring.io/blog/2016/06/07/notes-on- reactive-programming-part-i-the-reactive- landscape https://spring.io/blog/2016/06/13/notes-on- reactive-programming-part-ii-writing-some-code https://spring.io/blog/2016/07/20/notes-on- reactive-programming-part-iii-a-simple-http-server- application Just browse spring.io/blog already
  • 51. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Bridge Existing Asynchronous Code Mono<String> response = Mono.create(sink -> {
 HttpListener listener = event -> {
 if (event.getResponseCode() >= 400) {
 sink.error(new RuntimeExeption("Failed"));
 } else {
 String body = event.getBody();
 if (body.isEmpty()) {
 sink.success();
 } else {
 sink.success(body.toLowerCase());
 }
 }
 };
 
 client.addListener(listener);
 
 emitter.setCancellation(() -> client.removeListener(listener));
 }); • 25
  • 52. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Bridge Existing Asynchronous Code Mono<String> response = Mono.create(sink -> {
 HttpListener listener = event -> {
 if (event.getResponseCode() >= 400) {
 sink.error(new RuntimeExeption("Failed"));
 } else {
 String body = event.getBody();
 if (body.isEmpty()) {
 sink.success();
 } else {
 sink.success(body.toLowerCase());
 }
 }
 };
 
 client.addListener(listener);
 
 emitter.setCancellation(() -> client.removeListener(listener));
 }); • 25 Also exists for Flux of N items
  • 53. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Debug Mode 26 215 Hooks.onOperator(op -> op.operatorStacktrace()); 216 try { 217 Mono.just(1) 218 .map(d -> { 219 throw new RuntimeException(); 220 }) 221 .filter(d -> true) 222 .timestamp() 223 .elapsed() 224 .map(d -> d) 225 .block(); 226 } 227 catch(Exception e){ 228 e.printStackTrace(); 229 } 230 finally { 231 Hooks.resetOnOperator(); 232 }
  • 54. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Debug Mode 26 215 Hooks.onOperator(op -> op.operatorStacktrace()); 216 try { 217 Mono.just(1) 218 .map(d -> { 219 throw new RuntimeException(); 220 }) 221 .filter(d -> true) 222 .timestamp() 223 .elapsed() 224 .map(d -> d) 225 .block(); 226 } 227 catch(Exception e){ 228 e.printStackTrace(); 229 } 230 finally { 231 Hooks.resetOnOperator(); 232 } Capture stack for each operator declared after
  • 55. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Debug Mode 26 215 Hooks.onOperator(op -> op.operatorStacktrace()); 216 try { 217 Mono.just(1) 218 .map(d -> { 219 throw new RuntimeException(); 220 }) 221 .filter(d -> true) 222 .timestamp() 223 .elapsed() 224 .map(d -> d) 225 .block(); 226 } 227 catch(Exception e){ 228 e.printStackTrace(); 229 } 230 finally { 231 Hooks.resetOnOperator(); 232 } Capture stack for each operator declared after Assembly trace from producer [reactor.core.publisher.MonoMapFuseable] : reactor.core.publisher.Mono.map(Mono.java:1795) reactor.HooksTest.testTrace2(HooksTest.java:218) Composition chain until failing Operator : |_ Mono.map(HooksTest.java:218) |_ Mono.filter(HooksTest.java:221) |_ Mono.timestamp(HooksTest.java:222) |_ Mono.elapsed(HooksTest.java:223) |_ Mono.map(HooksTest.java:224)
  • 56. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Create Gateways to Flux And Mono 27 EmitterProcessor<Integer> processor = EmitterProcessor.create();
 
 int n = 100_000;
 processor.publishOn(Schedulers.single())
 .subscribe(someService::handleData);
 
 BlockingSink<Integer> session = processor.connectSink();
 
 for (int i = 0; i < n; i++) {
 while (!session.emit(i).isOk()) {
 if (session.hasFailed()) {
 throw session.getError();
 } //fake throttling Thread.sleep(1);
 }
 }
 session.finish(); • EmitterProcessor
  • 57. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Create Gateways to Flux And Mono 27 EmitterProcessor<Integer> processor = EmitterProcessor.create();
 
 int n = 100_000;
 processor.publishOn(Schedulers.single())
 .subscribe(someService::handleData);
 
 BlockingSink<Integer> session = processor.connectSink();
 
 for (int i = 0; i < n; i++) {
 while (!session.emit(i).isOk()) {
 if (session.hasFailed()) {
 throw session.getError();
 } //fake throttling Thread.sleep(1);
 }
 }
 session.finish(); • EmitterProcessor Backpressure Companion
  • 58. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ EmitterProcessor<Integer> processor = EmitterProcessor.create();
 
 int n = 100_000;
 processor.publishOn(Schedulers.single())
 .subscribe(someService::handleData);
 
 BlockingSink<Integer> session = processor.connectSink();
 
 for (int i = 0; i < n; i++) {
 while (!session.emit(i).isOk()) {
 if (session.hasFailed()) {
 throw session.getError();
 } Thread.sleep(1); //fake throttling
 }
 }
 session.finish(); • Create Gateways to Flux And Mono 28 EmitterProcessor
  • 59. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Operation Fusion • Reactor has a mission to limit the overhead in stack and message passing • 2 key categories : • “Macro Fusion” : merge operators in one (assembly time) • “Micro Fusion” : avoid queue creation and short circuit where possible request lifecycle. 29
  • 60. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Starve CPU’s with ParallelFlux… 30 Flux.range(1, 100000)
 .parallel(3)
 .runOn(Schedulers.parallel())
 .collect(ArrayList::new, ArrayList::add)
 .sequential()
 .reduce(0, (a, b) -> a + b.size())
 .subscribeWith(TestSubscriber.create())
 .await(Duration.ofSeconds(5))
 .assertValues(100_000)
 .assertNoError()
 .assertComplete(); •
  • 61. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Starve CPU’s with ParallelFlux… 30 Flux.range(1, 100000)
 .parallel(3)
 .runOn(Schedulers.parallel())
 .collect(ArrayList::new, ArrayList::add)
 .sequential()
 .reduce(0, (a, b) -> a + b.size())
 .subscribeWith(TestSubscriber.create())
 .await(Duration.ofSeconds(5))
 .assertValues(100_000)
 .assertNoError()
 .assertComplete(); • x3
  • 62. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Efficient and micro bench ready 31 https://github.com/akarnokd/akarnokd-misc/tree/master/src/jmh/java/hu/akarnokd/comparison
  • 63. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Efficient and micro bench ready 31 https://github.com/akarnokd/akarnokd-misc/tree/master/src/jmh/java/hu/akarnokd/comparison
  • 64. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Efficient and micro bench ready 31 https://github.com/akarnokd/akarnokd-misc/tree/master/src/jmh/java/hu/akarnokd/comparison
  • 65. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Bridge Fabulous RxJava 32
  • 66. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Bridge Fabulous RxJava 32 RxJava1Adapter
  • 67. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Bridge Java 9 Reactive Streams 33
  • 68. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Bridge Java 9 Reactive Streams 33 JdkFlowAdapter
  • 69. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Play with Reactor Core .NET 34
  • 70. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Play with Reactor Core .NET 34 https://www.nuget.org/packages/Reactor.Core/
  • 71. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Backpressure for JS: Reactor Core TypeScript 35
  • 72. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Backpressure for JS: Reactor Core TypeScript 35 https://www.npmjs.com/package/reactor-core-js
  • 73. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ EVERYTHING REACTIVE ? 36
  • 75. Service B Message
 Broker Datastore 20 ms 50 ms 150 ms 250 ms 20 ms 15 ms 3 ms GATEWAY µ Service A
  • 76. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Reactor Ecosystem roadmap 39 Reactor Netty Reactor IPC Spring Framework Spring 5, 
 Spring Cloud Stream, 
 Spring Integration,
 Spring Data, 
 Spring Boot, 
 Spring Cloud, 
 Spring Security,
 … Reactor Kafka Extra add-ons
 dashboard, bus, codecs, more operations & schedulers… Reactor Redis Reactor Aeron
  • 78. Spring Web MVC @Controller, @RequestMapping Servlet API Servlet Container
  • 79. Spring Web MVC @Controller, @RequestMapping Servlet API Servlet Container Reactive Non-blocking …
  • 80. Spring Web MVC Spring Web Reactive @Controller, @RequestMapping Servlet API Servlet Container
  • 81. Spring Web MVC Spring Web Reactive @Controller, @RequestMapping Servlet API Servlet Container Reactive HTTP
  • 82. Spring Web MVC Spring Web Reactive @Controller, @RequestMapping Servlet API Servlet Container Reactive HTTP Servlet 3.1 Container
  • 83. Spring Web MVC Spring Web Reactive @Controller, @RequestMapping Servlet API Servlet Container Reactive HTTP Servlet 3.1 ContainerServlet 3.1, Netty
  • 84. Spring Web MVC Spring Web Reactive @Controller, @RequestMapping Servlet API Servlet Container Reactive HTTP Servlet 3.1 ContainerServlet 3.1, Netty, Undertow
  • 88. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 51 SpringBootApplication
 @EnableBinding(Processor.class)
 public class WordCountApplication {
 
 @StreamListener
 @Output("output")
 public Flux<WordCount> countWords(@Input("input") Flux<String> words) {
 return words.window(ofSeconds(5), ofSeconds(1))
 .flatMap(window -> window.groupBy(word -> word)
 .flatMap(group -> group.reduce(0, (counter, word) -> counter + 1)
 .map(count -> new WordCount(group.key(), count))));
 } } Spring Cloud Stream: 
 Stateful processors
  • 89. Boot Data Cloud IntegrationSecurity Reactive Efforts
  • 90. Unless otherwise indicated, these slides are © 2013-2016 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ @ProjectReactor http://github.com/reactor http://projectreactor.io Extra Slideware: www.slideshare.net/SpringCentral/imperative-to-reactive-web-applications www.slideshare.net/SpringCentral/designing-implementing-and-using-reactive-apis http://www.slideshare.net/RobHarrop/going-reactive-63425158