Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Reactor Core 3.0 A lite Rx API for the JVM Sébastien Deleuze - Stéphane Maldini @sdeleuze - @smaldlini
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Sébastien Deleuze • Live in Lyon • Remote worker @ Pivotal • Spring Framework and Reactor committer • Works on Spring Framework 5 upcoming Reactive support • Co-worker @ La Cordée • Mix-IT staff member • @sdeleuze on Twitter 2
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Stéphane Maldini • Survive in London • Social Engineering @ • Project Reactor lead • Reactive Streams & Reactive Streams Commons contributor • Works on Spring Framework 5 upcoming Reactive support • @smaldini on Twitter 3 +
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Why going reactive? • More for scalability and stability than for speed • Use cases: • Webapp calling remote web services • Lot of slow clients • Big Data • Serve more clients on the same hardware • Event based development (web, mobile) 4
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Reactive, what is it? 5 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 external resources
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 6
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Reactive Streams • Reactive Streams is a contract for asynchronous stream processing with non-blocking back pressure • De facto standard for interop between reactive libraries • To be included in Java 9 as java.util.concurrent.Flow 7
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Reactive Streams principle 8 Publisher Subscriber Data Demand • Max(InflightData) <= demand • No data sent without demand • Demand can be unbounded • The recipient controls how much data it will receive
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 10 For reactive programming, we need tools : ☑ Reactive Streams ☐ Reactive APIs
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ • Buffer, merge, concatenate, or apply a wide range of transformations to your data • On the JVM: • Reactor 3.0 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 11 * Based on http://akarnokd.blogspot.fr/2016/03/operator-fusion-part-1.html
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Reactor Core 3.0 • Built with major contributions from Dávid Karnok (RxJava lead) and from some Spring Framework committers • Natively based on Reactive Streams, RSC* and Java 8+ • Strong focus on efficiency • Powerful Mono API • Ever-improving debugging, logging, testing capabilities * ReactiveStreamsCommons is a research effort about reactive flows 12
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 14
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Type comparaison 17 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 Completable Single<T> Observable<T> Reactor Mono<Void> Mono<T> Flux<T>
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 18
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Reactive Spring 19 • Spring projects are going reactive • Reactor Core is the reactive foundation • RxJava adapters provided • 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
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Well known Controller example 20 @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(); }
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Blocking vs Reactive: memory consumption 22 Memory consumption Time Blocking Reactive
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Blocking vs Reactive: streaming updates 23 Number of users saved in the database Time Blocking Reactive
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Controller with Reactive return values 24 @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
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Perfect fit for Microservices 27 Can handle bidirectional stream processing
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Now let’s go to the code! 28 https://github.com/reactor/lite-rx-api-hands-on/