SlideShare a Scribd company logo
Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
(Rx + Reactive Streams + Spring) % Java 8 =
Reactor 2.5
Stéphane Maldini
@smaldlini
Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a

Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Stéphane Maldini
• Survive in London
• Reactive Engineering @
• Project Reactor lead
• Reactive Streams & 

Reactive Streams Commons contributor
• Works on Spring Framework 5

upcoming Reactive support
• @smaldini on Twitter
2
+
Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a

Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Do you need to be “reactive” ?
If you ask then you probably don’t.
3
Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a

Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
How much faster is it ?
It’s slower than your usual imperative system.
4
Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a

Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 5
Is it good at anything beyond pretending ?
Yes. It scales with the request volume.
Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a

Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 6
But remember it changes the way you think code. 

It’s definitely a michelin star lunch.
Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a

Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Swipe Right - it’s a match
• Mobile/IoT backend API
• Server-to-Server communications (HTTP…)
• Unreliable clients
• Big Data
• Mutualized Resources (Cloud…)
• User Interfaces
7
Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a

Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Reactive, what the sh*t?
8
More details on http://fr.slideshare.net/StphaneMaldini/intro-to-reactive-programming-52821416
• Reactive is used to broadly define event-driven systems
• Reactive Manifesto defines qualities of reactive systems
• Reactive programming: moving imperative logic to async, non-
blocking, functional-style code, in particular when interacting
with “time consuming” resources
Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a

Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
For reactive programming, we need tools :
☐ Reactive Streams
☐ Reactive APIs
9
Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a

Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Reactive Streams
• Reactive Streams is a protocol for asynchronous stream
processing with non-blocking backpressure
• De facto standard for interop between reactive libraries
• To be included in Java 9 as java.util.concurrent.Flow
10
Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a

Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Reactive Streams principle
11
Publisher SubscriberData
Demand
• Max(InflightData) <= demand
• No data sent without demand
• Demand can be unbounded
Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a

Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Reactive Streams is 3+1 interfaces (+ a TCK)
1215
onSubscribe
onNext*
(onError|onComplete)?
Publisher
Subscriber
Subscription
request(n)
cancel()
Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a

Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Reactive Streams offers Quality of Service for the JVM
Bounded hardware use and flow prioritization
13
Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a

Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Imperative vs Reactive Streams ?
14
User rickSanchez =
userRepository.findUser(“rick”);
Blocking, not
returning until done !
Might throw
exceptions
Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a

Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
If this blocks, and runs on a serving HTTP request ?
If the calling HTTP requests come from another “Microservice” ?
If that Microservice is also calling in a blocking way ?
If you solve scalability issues by scaling out ?
If you agreed to pay the scalability tax, how far can it help you ?
Thinking about the big picture
15
Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a

Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Imperative vs Reactive Streams ?
16
Publisher<User> rickSanchez =
userRepository.findUser(“rick”);
rickSanchez.subscribe(new Subscriber<User>(){ … });
Might send 0, 1 or N Users ! Non Blocking - on demand data emission
Callback for start, result, error or complete
Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a

Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
How practical is Publisher ?
17
Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a

Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Do you want to implement Publisher yourself ?
Probably not, usually.
18
Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a

Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
For reactive programming, we need tools :
☑ Reactive Streams
☐ Reactive APIs
19
Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a

Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
• Transform, Combine, Timebox, Aggregate, Consume…
• On the JVM:
• Reactor 2.5 is 4th generation* and based on Reactive Streams
• RxJava 1.x: 2nd generation* and most used implementation
• Akka Stream 2.x: Lightbend 3rd generation* Reactive API
• Also for other languages, for example RxJS, MostJS
Reactive APIs
20
* Based on http://akarnokd.blogspot.fr/2016/03/operator-fusion-part-1.html
Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a

Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Reactor 2.5 ecosystem
21
Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a

Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Reactor Core 2.5
• Cross collaboration with Dávid Karnok (RxJava) and some
Spring Framework committers
• Natively based on Reactive Streams, RSC* and Java 8+
• 2 new rich Publisher types : Flux & Mono
• Strong focus on efficiency
• Ever-improving debugging, logging, testing capabilities
* ReactiveStreamsCommons is a research effort about reactive flows
22
Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a

Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Flux (0..N elements) with ReactiveX compliant API
23
Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a

Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Mono (0..1 element)
24
Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a

Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Imperative vs Reactor ?
25
Mono<User> rickSanchez =
userRepository.findUser(“rick”);
rickSanchez.consume(this::userHandler,
this::errorHandler)
Single Typed Publisher !
Start the Mono and consume
its result or error.
Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a

Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Mono, a single-data-at-most API
26
Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a

Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Flux, classic Rx patterns for 0..N events
27
Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a

Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Visual (Marble) doc for Flux & Mono
28
Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a

Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Reactor Web Console (preview)
29
Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a

Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Concurrency Types Cheat Sheet
30
No value Single value Multiple values
Blocking void T

Future<T>
Iterable<T>
Collection<T>
Stream<T>
Non-
blocking
CompletableFuture<Void> CompletableFuture<T> CompletableFuture<List<T>>
Reactive

Streams
Publisher<Void> Publisher<T> Publisher<T>
RxJava Observable<Void>
Completable (1.1.1)
Observable<T>
Single<T> (1.0.13)
Observable<T>
Reactor Mono<Void> Mono<T> Flux<T>
Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a

Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
https://spring.io/blog/2016/04/19/understanding-reactive-types
31
Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a

Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Reactive Spring
32
• Spring projects are going reactive
• Reactor Core is the reactive foundation
• RxJava support provided out of the box
• You will be able to choose your web engine:

Tomcat, Jetty, Undertow or Netty
• Most impact on Web and Data support (IO intensive)
• Spring Reactive experiment
• Spring Reactive Playground sample application
Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a

Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Well known Controller example
33
@RestController	
public	class	UserController	{	
	 private	BlockingRepository<User>	repository;	
	 @RequestMapping(path	=	"/save-capitalized",	method	=	RequestMethod.POST)	
	 public	void	saveCapitalized(@RequestBody	List<User>	users)	{	
	 	 users.forEach(u	->	u.setName(u.getName().toUpperCase()));	
	 	 repository.save(users);	
	 }	
}
public	interface	BlockingRepository<T>	{	
	 void	save(List<T>	elements);	
	 Iterable<T>	findAll();	
}
Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a

Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Controller with Reactive types
34
@RestController	
public	class	UserController	{	
	 private	ReactiveRepository<User>	repository;	
	 @RequestMapping(path	=	"/save-capitalized",	method	=	RequestMethod.POST)	
	 public	Mono<Void>	saveCapitalized(@RequestBody	Flux<User>	users)	{	
	 	 return	repository.save(users.map(u	->	new	User(u.getName().toUpperCase()));	
	 }	
}	
public	interface	ReactiveRepository<T>	{	
	 Mono<Void>	save(Publisher<T>	elements);	
Flux<T>	findAll();	
}
Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a

Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Blocking vs Reactive: memory consumption
35
Memoryconsumption
Time
Blocking Reactive
Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a

Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Blocking vs Reactive: streaming updates
36
Numberofuserssaved
inthedatabase
Time
Blocking Reactive
Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a

Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Controller with Reactive return values
37
@RestController	
public	class	UserController	{	
	 private	ReactiveRepository<User>	repository;	
	 @RequestMapping(path	=	"/",	method	=	RequestMethod.GET)	
	 public	Flux<User>	findAll()	{	
	 	 return	repository.findAll();	
	 }	
}	
• Optimized serialization when using Flux instead of List
• Also perfectly suitable for Server-Sent Events
Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a

Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Reactive HTTP client with Mono
38
import	static	org.springframework.web.client.reactive.HttpRequestBuilders.*;	
import	static	org.springframework.web.client.reactive.WebResponseExtractors.*;	
Mono<Person>	result	=	webClient	
		.perform(get("http://localhost:8080/person")	
		.header("X-Test-Header",	"testvalue")	
		.accept(MediaType.APPLICATION_JSON))	
		.extract(body(Person.class));
Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a

Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Reactive HTTP client with Flux
39
import	static	org.springframework.web.client.reactive.HttpRequestBuilders.*;	
import	static	org.springframework.web.client.reactive.WebResponseExtractors.*;	
Flux<Person>	response	=	webClient	
		.perform(get("http://localhost:8080/persons")	
		.accept(MediaType.APPLICATION_JSON))	
		.extract(bodyStream(Person.class));
Works for:
• JSON array [{"foo":"bar"},{"foo":"baz"}]
• JSON Streaming {"foo":"bar"}{"foo":"baz"}
• SSE with something like .extract(sseStream(Person.class))
Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a

Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
Do you want to learn and play at the same time ?
Get Factorio on Steam for a few coins
40

More Related Content

What's hot (20)

PDF
To Microservices and Beyond
Matt Stine
 
PPTX
Core Spring + Reactive 김민석
VMware Tanzu Korea
 
PPTX
High Performance Cloud Native APIs Using Apache Geode
VMware Tanzu
 
PDF
You Want to Kubernetes? You MUST Know Containers!
VMware Tanzu
 
PPTX
Simplifying Apache Geode with Spring Data
VMware Tanzu
 
PDF
Automated Virtualized Testing (AVT) with Docker, Kubernetes, WireMock and Gat...
VMware Tanzu
 
PPTX
Microservices + Oracle: A Bright Future
Kelly Goetsch
 
PPTX
Running your Spring Apps in the Cloud Javaone 2014
cornelia davis
 
PDF
From Monolith to K8s - Spring One 2020
Mauricio (Salaboy) Salatino
 
PDF
Getting Groovy with JHipster and Micronaut
Zachary Klein
 
PDF
Under the Hood of Reactive Data Access (2/2)
VMware Tanzu
 
PDF
Micronaut: Changing the Micro Future
Zachary Klein
 
PDF
Kubernetes and lastminute.com: our course towards better scalability and proc...
Michele Orsi
 
PDF
Welcome to the Metrics
VMware Tanzu
 
PPTX
Improving Your Company’s Health with Middleware Takeout
VMware Tanzu
 
PPTX
Declarative Infrastructure with Cloud Foundry BOSH
cornelia davis
 
PDF
Grails 4: Upgrade your Game!
Zachary Klein
 
PPTX
DevOps and Continuous Delivery Reference Architectures - Volume 2
Sonatype
 
PDF
Under the Hood of Reactive Data Access (1/2)
VMware Tanzu
 
PDF
Implementing Microservices with Jakarta EE and MicroProfile
Kevin Sutter
 
To Microservices and Beyond
Matt Stine
 
Core Spring + Reactive 김민석
VMware Tanzu Korea
 
High Performance Cloud Native APIs Using Apache Geode
VMware Tanzu
 
You Want to Kubernetes? You MUST Know Containers!
VMware Tanzu
 
Simplifying Apache Geode with Spring Data
VMware Tanzu
 
Automated Virtualized Testing (AVT) with Docker, Kubernetes, WireMock and Gat...
VMware Tanzu
 
Microservices + Oracle: A Bright Future
Kelly Goetsch
 
Running your Spring Apps in the Cloud Javaone 2014
cornelia davis
 
From Monolith to K8s - Spring One 2020
Mauricio (Salaboy) Salatino
 
Getting Groovy with JHipster and Micronaut
Zachary Klein
 
Under the Hood of Reactive Data Access (2/2)
VMware Tanzu
 
Micronaut: Changing the Micro Future
Zachary Klein
 
Kubernetes and lastminute.com: our course towards better scalability and proc...
Michele Orsi
 
Welcome to the Metrics
VMware Tanzu
 
Improving Your Company’s Health with Middleware Takeout
VMware Tanzu
 
Declarative Infrastructure with Cloud Foundry BOSH
cornelia davis
 
Grails 4: Upgrade your Game!
Zachary Klein
 
DevOps and Continuous Delivery Reference Architectures - Volume 2
Sonatype
 
Under the Hood of Reactive Data Access (1/2)
VMware Tanzu
 
Implementing Microservices with Jakarta EE and MicroProfile
Kevin Sutter
 

Viewers also liked (8)

PDF
Reactor 3.0, a reactive foundation for java 8 and Spring
Stéphane Maldini
 
PDF
Designing for Distributed Systems with Reactor and Reactive Streams
Stéphane Maldini
 
PDF
An introduction to Reactive applications, Reactive Streams, and options for t...
Steve Pember
 
PDF
Going Reactive
Rob Harrop
 
PDF
Reactive Streams: Handling Data-Flow the Reactive Way
Roland Kuhn
 
PDF
The Java Microservice Library
Rick Hightower
 
PDF
Clouds & Containers: Hit the High Points and Give it to Me Straight, What's t...
Mark Heckler
 
PDF
Going Reactive with Spring 5 & Project Reactor
Mark Heckler
 
Reactor 3.0, a reactive foundation for java 8 and Spring
Stéphane Maldini
 
Designing for Distributed Systems with Reactor and Reactive Streams
Stéphane Maldini
 
An introduction to Reactive applications, Reactive Streams, and options for t...
Steve Pember
 
Going Reactive
Rob Harrop
 
Reactive Streams: Handling Data-Flow the Reactive Way
Roland Kuhn
 
The Java Microservice Library
Rick Hightower
 
Clouds & Containers: Hit the High Points and Give it to Me Straight, What's t...
Mark Heckler
 
Going Reactive with Spring 5 & Project Reactor
Mark Heckler
 
Ad

Similar to Introduction to Reactive Streams and Reactor 2.5 (20)

PDF
Intro to Reactive Programming
Stéphane Maldini
 
PPTX
Ratpack - SpringOne2GX 2015
Daniel Woods
 
PPTX
12 Factor, or Cloud Native Apps – What EXACTLY Does that Mean for Spring Deve...
cornelia davis
 
PDF
SpringOnePlatform2017 recap
minseok kim
 
PPTX
IO State In Distributed API Architecture
Owen Rubel
 
PPTX
Developing Real-Time Data Pipelines with Apache Kafka
Joe Stein
 
PPTX
Designing, Implementing, and Using Reactive APIs
VMware Tanzu
 
PDF
YugaByte DB—A Planet-Scale Database for Low Latency Transactional Apps
VMware Tanzu
 
PDF
P to V to C: The Value of Bringing “Everything” to Containers
VMware Tanzu
 
PDF
Migrating to Angular 5 for Spring Developers
Gunnar Hillert
 
PDF
Spring Cloud Gateway - Ryan Baxter
VMware Tanzu
 
PDF
Marcin Grzejszczak - Contract Tests in the Enterprise
SegFaultConf
 
PDF
Spring Cloud Gateway - Ryan Baxter
VMware Tanzu
 
PDF
Extending the Platform with Spring Boot and Cloud Foundry
Kenny Bastani
 
PDF
Migrating to Angular 4 for Spring Developers
VMware Tanzu
 
PDF
Cloud Native Java with Spring Cloud Services
VMware Tanzu
 
PDF
State of Securing Restful APIs s12gx2015
robwinch
 
PDF
Extending the Platform
VMware Tanzu
 
PDF
riffing on Knative - Scott Andrews
VMware Tanzu
 
PDF
Living on the Edge With Spring Cloud Gateway - Cora Iberkleid
VMware Tanzu
 
Intro to Reactive Programming
Stéphane Maldini
 
Ratpack - SpringOne2GX 2015
Daniel Woods
 
12 Factor, or Cloud Native Apps – What EXACTLY Does that Mean for Spring Deve...
cornelia davis
 
SpringOnePlatform2017 recap
minseok kim
 
IO State In Distributed API Architecture
Owen Rubel
 
Developing Real-Time Data Pipelines with Apache Kafka
Joe Stein
 
Designing, Implementing, and Using Reactive APIs
VMware Tanzu
 
YugaByte DB—A Planet-Scale Database for Low Latency Transactional Apps
VMware Tanzu
 
P to V to C: The Value of Bringing “Everything” to Containers
VMware Tanzu
 
Migrating to Angular 5 for Spring Developers
Gunnar Hillert
 
Spring Cloud Gateway - Ryan Baxter
VMware Tanzu
 
Marcin Grzejszczak - Contract Tests in the Enterprise
SegFaultConf
 
Spring Cloud Gateway - Ryan Baxter
VMware Tanzu
 
Extending the Platform with Spring Boot and Cloud Foundry
Kenny Bastani
 
Migrating to Angular 4 for Spring Developers
VMware Tanzu
 
Cloud Native Java with Spring Cloud Services
VMware Tanzu
 
State of Securing Restful APIs s12gx2015
robwinch
 
Extending the Platform
VMware Tanzu
 
riffing on Knative - Scott Andrews
VMware Tanzu
 
Living on the Edge With Spring Cloud Gateway - Cora Iberkleid
VMware Tanzu
 
Ad

More from Stéphane Maldini (13)

PDF
The value of reactive
Stéphane Maldini
 
PDF
Multi-service reactive streams using Spring, Reactor, RSocket
Stéphane Maldini
 
PDF
The Future of Reactive Architectures
Stéphane Maldini
 
PDF
Spring Cloud Gateway
Stéphane Maldini
 
PDF
What's new in Reactor Californium
Stéphane Maldini
 
PDF
Spring boot 2.0 reactive bits (June 2018)
Stéphane Maldini
 
PDF
Reactor, Reactive streams and MicroServices
Stéphane Maldini
 
PDF
Springone2gx 2014 Reactive Streams and Reactor
Stéphane Maldini
 
PDF
Reactor grails realtime web devoxx 2013
Stéphane Maldini
 
PDF
Groovy reactor grails realtime web devoxx 2013
Stéphane Maldini
 
ODP
Reactor spring one2gx_2013_0902-final
Stéphane Maldini
 
PDF
Eventsggx
Stéphane Maldini
 
The value of reactive
Stéphane Maldini
 
Multi-service reactive streams using Spring, Reactor, RSocket
Stéphane Maldini
 
The Future of Reactive Architectures
Stéphane Maldini
 
Spring Cloud Gateway
Stéphane Maldini
 
What's new in Reactor Californium
Stéphane Maldini
 
Spring boot 2.0 reactive bits (June 2018)
Stéphane Maldini
 
Reactor, Reactive streams and MicroServices
Stéphane Maldini
 
Springone2gx 2014 Reactive Streams and Reactor
Stéphane Maldini
 
Reactor grails realtime web devoxx 2013
Stéphane Maldini
 
Groovy reactor grails realtime web devoxx 2013
Stéphane Maldini
 
Reactor spring one2gx_2013_0902-final
Stéphane Maldini
 

Recently uploaded (20)

PDF
Printable Kinyarwanda Gospel Tract - Do Not Fear Death.pdf
Filipino Tracts and Literature Society Inc.
 
PPSX
Live to Love, Love to Give! (Slideshow by: Kal-el's Shows)
Kal-el's Shows
 
PPTX
ONE VERSE EVANGELISM POWERPOINT —ROMANS 6:23
Miki932909
 
PDF
Printable French (Canada) Gospel Tract - Do Not Fear Death.pdf
Filipino Tracts and Literature Society Inc.
 
PDF
Printable Hungarian Gospel Tract - Do Not Fear Death.pdf
Filipino Tracts and Literature Society Inc.
 
PPTX
Honesty is the best quality that all Christians need to.
DannideVera1
 
PDF
I Have Come Out to Oppose You
Dave546130
 
PDF
Printable Indonesian Gospel Tract - Do Not Fear Death.pdf
Filipino Tracts and Literature Society Inc.
 
PDF
The Odd Women of Seabreeze <3<3<3<3<3<3<3
ssuser83613b
 
PDF
Printable French Gospel Tract - Do Not Fear Death.pdf
Filipino Tracts and Literature Society Inc.
 
PDF
Printable Khmer Gospel Tract - Do Not Fear Death.pdf
Filipino Tracts and Literature Society Inc.
 
PPTX
Chaar Dham Temple in Vrindavan_ A Divine Journey.pptx
chaar dham
 
PDF
The essays of Proclus metaphysics of polytheism
SabatUmar
 
PDF
Printable Kurdish Northern Kurmanji Gospel Tract - Do Not Fear Death.pdf
Filipino Tracts and Literature Society Inc.
 
PDF
Printable Icelandic Gospel Tract - Do Not Fear Death.pdf
Filipino Tracts and Literature Society Inc.
 
PPTX
Sabbath School Lesson 1, 3rd Quarter 2025.pptx
DavidSyahputra4
 
PDF
Printable Konkani Gospel Tract - Do Not Fear Death.pdf
Filipino Tracts and Literature Society Inc.
 
PPTX
Life_of_Saint_Agnes_Presentationnnn.pptx
ChristerPastranaVill
 
PDF
Printable Lithuanian Gospel Tract - Do Not Fear Death.pdf
Filipino Tracts and Literature Society Inc.
 
PDF
NOTICE_OF_DEMAND_OF_ASSISTANCE_JC-DKR-07142025-03_signing_log.pdf
trungvo92
 
Printable Kinyarwanda Gospel Tract - Do Not Fear Death.pdf
Filipino Tracts and Literature Society Inc.
 
Live to Love, Love to Give! (Slideshow by: Kal-el's Shows)
Kal-el's Shows
 
ONE VERSE EVANGELISM POWERPOINT —ROMANS 6:23
Miki932909
 
Printable French (Canada) Gospel Tract - Do Not Fear Death.pdf
Filipino Tracts and Literature Society Inc.
 
Printable Hungarian Gospel Tract - Do Not Fear Death.pdf
Filipino Tracts and Literature Society Inc.
 
Honesty is the best quality that all Christians need to.
DannideVera1
 
I Have Come Out to Oppose You
Dave546130
 
Printable Indonesian Gospel Tract - Do Not Fear Death.pdf
Filipino Tracts and Literature Society Inc.
 
The Odd Women of Seabreeze <3<3<3<3<3<3<3
ssuser83613b
 
Printable French Gospel Tract - Do Not Fear Death.pdf
Filipino Tracts and Literature Society Inc.
 
Printable Khmer Gospel Tract - Do Not Fear Death.pdf
Filipino Tracts and Literature Society Inc.
 
Chaar Dham Temple in Vrindavan_ A Divine Journey.pptx
chaar dham
 
The essays of Proclus metaphysics of polytheism
SabatUmar
 
Printable Kurdish Northern Kurmanji Gospel Tract - Do Not Fear Death.pdf
Filipino Tracts and Literature Society Inc.
 
Printable Icelandic Gospel Tract - Do Not Fear Death.pdf
Filipino Tracts and Literature Society Inc.
 
Sabbath School Lesson 1, 3rd Quarter 2025.pptx
DavidSyahputra4
 
Printable Konkani Gospel Tract - Do Not Fear Death.pdf
Filipino Tracts and Literature Society Inc.
 
Life_of_Saint_Agnes_Presentationnnn.pptx
ChristerPastranaVill
 
Printable Lithuanian Gospel Tract - Do Not Fear Death.pdf
Filipino Tracts and Literature Society Inc.
 
NOTICE_OF_DEMAND_OF_ASSISTANCE_JC-DKR-07142025-03_signing_log.pdf
trungvo92
 

Introduction to Reactive Streams and Reactor 2.5

  • 1. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ (Rx + Reactive Streams + Spring) % Java 8 = Reactor 2.5 Stéphane Maldini @smaldlini
  • 2. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a
 Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Stéphane Maldini • Survive in London • Reactive Engineering @ • Project Reactor lead • Reactive Streams & 
 Reactive Streams Commons contributor • Works on Spring Framework 5
 upcoming Reactive support • @smaldini on Twitter 2 +
  • 3. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a
 Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Do you need to be “reactive” ? If you ask then you probably don’t. 3
  • 4. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a
 Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ How much faster is it ? It’s slower than your usual imperative system. 4
  • 5. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a
 Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 5 Is it good at anything beyond pretending ? Yes. It scales with the request volume.
  • 6. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a
 Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 6 But remember it changes the way you think code. 
 It’s definitely a michelin star lunch.
  • 7. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a
 Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Swipe Right - it’s a match • Mobile/IoT backend API • Server-to-Server communications (HTTP…) • Unreliable clients • Big Data • Mutualized Resources (Cloud…) • User Interfaces 7
  • 8. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a
 Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Reactive, what the sh*t? 8 More details on http://fr.slideshare.net/StphaneMaldini/intro-to-reactive-programming-52821416 • Reactive is used to broadly define event-driven systems • Reactive Manifesto defines qualities of reactive systems • Reactive programming: moving imperative logic to async, non- blocking, functional-style code, in particular when interacting with “time consuming” resources
  • 9. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a
 Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ For reactive programming, we need tools : ☐ Reactive Streams ☐ Reactive APIs 9
  • 10. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a
 Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Reactive Streams • Reactive Streams is a protocol for asynchronous stream processing with non-blocking backpressure • De facto standard for interop between reactive libraries • To be included in Java 9 as java.util.concurrent.Flow 10
  • 11. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a
 Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Reactive Streams principle 11 Publisher SubscriberData Demand • Max(InflightData) <= demand • No data sent without demand • Demand can be unbounded
  • 12. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a
 Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Reactive Streams is 3+1 interfaces (+ a TCK) 1215 onSubscribe onNext* (onError|onComplete)? Publisher Subscriber Subscription request(n) cancel()
  • 13. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a
 Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Reactive Streams offers Quality of Service for the JVM Bounded hardware use and flow prioritization 13
  • 14. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a
 Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Imperative vs Reactive Streams ? 14 User rickSanchez = userRepository.findUser(“rick”); Blocking, not returning until done ! Might throw exceptions
  • 15. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a
 Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ If this blocks, and runs on a serving HTTP request ? If the calling HTTP requests come from another “Microservice” ? If that Microservice is also calling in a blocking way ? If you solve scalability issues by scaling out ? If you agreed to pay the scalability tax, how far can it help you ? Thinking about the big picture 15
  • 16. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a
 Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Imperative vs Reactive Streams ? 16 Publisher<User> rickSanchez = userRepository.findUser(“rick”); rickSanchez.subscribe(new Subscriber<User>(){ … }); Might send 0, 1 or N Users ! Non Blocking - on demand data emission Callback for start, result, error or complete
  • 17. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a
 Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ How practical is Publisher ? 17
  • 18. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a
 Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Do you want to implement Publisher yourself ? Probably not, usually. 18
  • 19. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a
 Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ For reactive programming, we need tools : ☑ Reactive Streams ☐ Reactive APIs 19
  • 20. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a
 Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ • Transform, Combine, Timebox, Aggregate, Consume… • On the JVM: • Reactor 2.5 is 4th generation* and based on Reactive Streams • RxJava 1.x: 2nd generation* and most used implementation • Akka Stream 2.x: Lightbend 3rd generation* Reactive API • Also for other languages, for example RxJS, MostJS Reactive APIs 20 * Based on http://akarnokd.blogspot.fr/2016/03/operator-fusion-part-1.html
  • 21. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a
 Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Reactor 2.5 ecosystem 21
  • 22. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a
 Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Reactor Core 2.5 • Cross collaboration with Dávid Karnok (RxJava) and some Spring Framework committers • Natively based on Reactive Streams, RSC* and Java 8+ • 2 new rich Publisher types : Flux & Mono • Strong focus on efficiency • Ever-improving debugging, logging, testing capabilities * ReactiveStreamsCommons is a research effort about reactive flows 22
  • 23. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a
 Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Flux (0..N elements) with ReactiveX compliant API 23
  • 24. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a
 Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Mono (0..1 element) 24
  • 25. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a
 Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Imperative vs Reactor ? 25 Mono<User> rickSanchez = userRepository.findUser(“rick”); rickSanchez.consume(this::userHandler, this::errorHandler) Single Typed Publisher ! Start the Mono and consume its result or error.
  • 26. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a
 Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Mono, a single-data-at-most API 26
  • 27. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a
 Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Flux, classic Rx patterns for 0..N events 27
  • 28. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a
 Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Visual (Marble) doc for Flux & Mono 28
  • 29. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a
 Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Reactor Web Console (preview) 29
  • 30. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a
 Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Concurrency Types Cheat Sheet 30 No value Single value Multiple values Blocking void T
 Future<T> Iterable<T> Collection<T> Stream<T> Non- blocking CompletableFuture<Void> CompletableFuture<T> CompletableFuture<List<T>> Reactive
 Streams Publisher<Void> Publisher<T> Publisher<T> RxJava Observable<Void> Completable (1.1.1) Observable<T> Single<T> (1.0.13) Observable<T> Reactor Mono<Void> Mono<T> Flux<T>
  • 31. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a
 Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ https://spring.io/blog/2016/04/19/understanding-reactive-types 31
  • 32. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a
 Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Reactive Spring 32 • Spring projects are going reactive • Reactor Core is the reactive foundation • RxJava support provided out of the box • You will be able to choose your web engine:
 Tomcat, Jetty, Undertow or Netty • Most impact on Web and Data support (IO intensive) • Spring Reactive experiment • Spring Reactive Playground sample application
  • 33. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a
 Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Well known Controller example 33 @RestController public class UserController { private BlockingRepository<User> repository; @RequestMapping(path = "/save-capitalized", method = RequestMethod.POST) public void saveCapitalized(@RequestBody List<User> users) { users.forEach(u -> u.setName(u.getName().toUpperCase())); repository.save(users); } } public interface BlockingRepository<T> { void save(List<T> elements); Iterable<T> findAll(); }
  • 34. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a
 Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Controller with Reactive types 34 @RestController public class UserController { private ReactiveRepository<User> repository; @RequestMapping(path = "/save-capitalized", method = RequestMethod.POST) public Mono<Void> saveCapitalized(@RequestBody Flux<User> users) { return repository.save(users.map(u -> new User(u.getName().toUpperCase())); } } public interface ReactiveRepository<T> { Mono<Void> save(Publisher<T> elements); Flux<T> findAll(); }
  • 35. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a
 Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Blocking vs Reactive: memory consumption 35 Memoryconsumption Time Blocking Reactive
  • 36. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a
 Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Blocking vs Reactive: streaming updates 36 Numberofuserssaved inthedatabase Time Blocking Reactive
  • 37. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a
 Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Controller with Reactive return values 37 @RestController public class UserController { private ReactiveRepository<User> repository; @RequestMapping(path = "/", method = RequestMethod.GET) public Flux<User> findAll() { return repository.findAll(); } } • Optimized serialization when using Flux instead of List • Also perfectly suitable for Server-Sent Events
  • 38. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a
 Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Reactive HTTP client with Mono 38 import static org.springframework.web.client.reactive.HttpRequestBuilders.*; import static org.springframework.web.client.reactive.WebResponseExtractors.*; Mono<Person> result = webClient .perform(get("http://localhost:8080/person") .header("X-Test-Header", "testvalue") .accept(MediaType.APPLICATION_JSON)) .extract(body(Person.class));
  • 39. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a
 Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Reactive HTTP client with Flux 39 import static org.springframework.web.client.reactive.HttpRequestBuilders.*; import static org.springframework.web.client.reactive.WebResponseExtractors.*; Flux<Person> response = webClient .perform(get("http://localhost:8080/persons") .accept(MediaType.APPLICATION_JSON)) .extract(bodyStream(Person.class)); Works for: • JSON array [{"foo":"bar"},{"foo":"baz"}] • JSON Streaming {"foo":"bar"}{"foo":"baz"} • SSE with something like .extract(sseStream(Person.class))
  • 40. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a
 Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Do you want to learn and play at the same time ? Get Factorio on Steam for a few coins 40