Upgrade to Pro — share decks privately, control downloads, hide ads and more …

A lite Rx API for the JVM

A lite Rx API for the JVM

With Flux and Mono, Reactor Core 3.0 provides a lite Rx API for Java 8+. Try the Hands-on available at https://github.com/reactor/lite-rx-api-hands-on/.

Sébastien Deleuze

February 10, 2016
Tweet

More Decks by Sébastien Deleuze

Other Decks in Programming

Transcript

  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/
    Reactor Core 3.0
    A lite Rx API for the JVM
    Sébastien Deleuze - Stéphane Maldini
    @sdeleuze - @smaldlini

    View Slide

  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/
    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

    View Slide

  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/
    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
    +

    View Slide

  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/
    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

    View Slide

  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/
    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

    View Slide

  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/
    For reactive programming, we need tools :
    ☐ Reactive Streams
    ☐ Reactive APIs
    6

    View Slide

  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 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

    View Slide

  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 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

    View Slide

  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 is 4 interfaces (+ a TCK)
    9
    public interface Publisher {
    void subscribe(Subscriber super T> s);
    }
    public interface Subscriber {
    void onSubscribe(Subscription s);
    void onNext(T t);
    void onError(Throwable t);
    void onComplete();
    }
    public interface Subscription {
    void request(long n);
    void cancel();
    }
    public interface Processor extends Subscriber, Publisher {
    }

    View Slide

  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/
    10
    For reactive programming, we need tools :
    ☑ Reactive Streams
    ☐ Reactive APIs

    View Slide

  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/
    • 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

    View Slide

  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/
    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

    View Slide

  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/
    Reactor 3.0 ecosystem
    13

    View Slide

  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/
    Flux (0..N elements) with ReactiveX compliant API
    14

    View Slide

  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/
    Mono (0..1 element)
    15

    View Slide

  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/
    Reactor Web Console
    16

    View Slide

  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/
    Type comparaison
    17
    No value Single value Multiple values
    Blocking void T

    Future
    Iterable
    Collection
    Stream
    Non-
    blocking
    CompletableFuture CompletableFuture CompletableFuture>
    Reactive

    Streams
    Publisher Publisher Publisher
    RxJava Completable Single Observable
    Reactor Mono Mono Flux

    View Slide

  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/
    https://spring.io/blog/2016/04/19/understanding-reactive-types
    18

    View Slide

  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/
    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

    View Slide

  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/
    Well known Controller example
    20
    @RestController
    public class UserController {
    private BlockingRepository repository;
    @RequestMapping(path = "/save-capitalized", method = RequestMethod.POST)
    public void saveCapitalized(@RequestBody List users) {
    users.forEach(u -> u.setName(u.getName().toUpperCase()));
    repository.save(users);
    }
    }
    public interface BlockingRepository {
    void save(List elements);
    Iterable findAll();
    }

    View Slide

  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/
    Controller with Reactive types
    21
    @RestController
    public class UserController {
    private ReactiveRepository repository;
    @RequestMapping(path = "/save-capitalized", method = RequestMethod.POST)
    public Mono saveCapitalized(@RequestBody Flux users) {
    return repository.save(users.map(u -> new User(u.getName().toUpperCase()));
    }
    }
    public interface ReactiveRepository {
    Mono save(Publisher elements);
    Flux findAll();
    }

    View Slide

  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/
    Blocking vs Reactive: memory consumption
    22
    Memory consumption
    Time
    Blocking Reactive

    View Slide

  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/
    Blocking vs Reactive: streaming updates
    23
    Number of users saved
    in the database
    Time
    Blocking Reactive

    View Slide

  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/
    Controller with Reactive return values
    24
    @RestController
    public class UserController {
    private ReactiveRepository repository;
    @RequestMapping(path = "/", method = RequestMethod.GET)
    public Flux findAll() {
    return repository.findAll();
    }
    }
    • Optimized serialization when using Flux instead of List
    • Also perfectly suitable for Server-Sent Events

    View Slide

  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/
    Reactive HTTP client with Mono
    25
    import static org.springframework.web.client.reactive.HttpRequestBuilders.*;
    import static org.springframework.web.client.reactive.WebResponseExtractors.*;
    Mono result = webClient
    .perform(get("http://localhost:8080/person")
    .header("X-Test-Header", "testvalue")
    .accept(MediaType.APPLICATION_JSON))
    .extract(body(Person.class));

    View Slide

  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/
    Reactive HTTP client with Flux
    26
    import static org.springframework.web.client.reactive.HttpRequestBuilders.*;
    import static org.springframework.web.client.reactive.WebResponseExtractors.*;
    Flux 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))

    View Slide

  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/
    Perfect fit for Microservices
    27
    Can handle bidirectional stream processing

    View Slide

  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/
    Now let’s go to the code!
    28
    https://github.com/reactor/lite-rx-api-hands-on/

    View Slide