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

Programmation réactive avec Spring 5 et Reactor

Programmation réactive avec Spring 5 et Reactor

Introduction à la programmation réactive et exemples de mise en oeuvre avec Spring 5 et la librairie Reactor.

Florian Beaufumé

November 01, 2017
Tweet

More Decks by Florian Beaufumé

Other Decks in Programming

Transcript

  1. Programmation réactive
    avec Spring 5 et Reactor
    Florian Beaufumé
    @fbeaufume
    11/2017
    v1.1

    View Slide

  2. Florian Beaufumé
    • Architecte logiciel et expert Java
    • Freelance
    • Brown bag lunch
    • @fbeaufume

    View Slide

  3. • Montée en charge
    • C10K (= 10K connexions)
    • Comment supporter
    10000 connexions simultanées ?
    • Robustesse
    • Que faire si la base ou les systèmes tiers
    sont (très) lents ?
    Objectifs
    Server
    DB
    @fbeaufume

    View Slide

  4. • Modèle standard de nos serveurs
    • Est bloquant avec pool de thread :
    • En charge :
    • Multiplier les serveurs ?
    • Multiplier les threads ?
    Modèle « thread-per-request »
    Server
    Requests Threads pool
    @fbeaufume

    View Slide

  5. • Cout mémoire et CPU (context switches)
    • Contention
    Limitations des threads
    Server thread Database
    Client
    HTTP request
    SQL request #1
    SQL request #2
    @fbeaufume

    View Slide

  6. • Montée en charge et robustesse
    • Exemples : Node.js, Vert.x, Redis, HAProxy
    Modèle non bloquant
    Event queue
    Events
    Event loop
    HTTP requests
    SQL responses

    Few worker threads
    @fbeaufume

    View Slide

  7. Callback hell

    View Slide

  8. Exemple Spring 5

    View Slide

  9. Types réactifs
    Eléments Bloquant Réactif
    0..N Collection Flux
    0..1 Book Mono
    0 void Mono
    @fbeaufume

    View Slide

  10. WebClient
    @fbeaufume

    View Slide

  11. Spring Framework 5
    Spring Framework
    Tomcat Netty
    Reactor
    Spring Web MVC Spring WebFlux
    Bloquant Réactif
    Reactive
    Streams
    @fbeaufume

    View Slide

  12. Ecosystème Spring réactif
    Spring Framework 5
    Spring Boot 2
    Spring Data 2
    Spring Security 5
    Spring Integration 5
    Spring Cloud
    @fbeaufume

    View Slide

  13. Spring Data 2
    @fbeaufume

    View Slide

  14. • "Programming with asynchronous data streams"
    • Basé sur des étapes asynchrones et non bloquantes
    • API orientées callback et/ou déclaratives par composition de fonctions
    • Programmation réactive ≈ streams + CompletableFuture + backpressure
    • Bénéfices :
    • Montée en charge
    • Robustesse
    Programmation réactive
    @fbeaufume

    View Slide

  15. • Code
    • Logs
    Reactor
    @fbeaufume

    View Slide

  16. Construction
    @fbeaufume

    View Slide

  17. Opérateurs
    @fbeaufume

    View Slide

  18. Marble diagrams

    View Slide

  19. • Pour donner du contrôle au consommateur sur le producteur
    Backpressure
    Producer Consumer
    Data flow
    Data request
    @fbeaufume

    View Slide

  20. Conversions
    @fbeaufume

    View Slide

  21. • Cas simple
    • Manipulation de l’échelle de temps
    Tests avec reactor-test
    @fbeaufume

    View Slide

  22. • "Standard for asynchronous stream processing with non-blocking
    backpressure"
    • Implémentations : RxJava, Reactor, Akka Streams, etc.
    Reactive streams
    @fbeaufume

    View Slide

  23. Comparaison de performance
    VS
    Bloquant
    Réactif
    @fbeaufume

    View Slide

  24. Scénario
    Time
    Concurrent
    users
    2 min
    10 sec
    http://localhost:8080/pause/1000
    @fbeaufume

    View Slide

  25. Charge
    Bloquant Réactif
    300 users injectés => 189 req/s mesuré 3000 users injectés => 2664 req/s mesuré
    @fbeaufume

    View Slide

  26. Temps de réponse
    Bloquant Réactif
    Moyenne=1462, médiane=1579, σ=297 Moyenne=1036, médiane=1013, σ=59

    View Slide

  27. Threads
    Bloquant Réactif
    @fbeaufume

    View Slide

  28. • Syntaxe déroutante
    • Commencer par les streams Java 8 et la programmation fonctionnelle
    • API contaminante
    • Plus facile pour de nouvelles applications ou microservices
    Difficultés
    @fbeaufume

    View Slide

  29. • JDBC pas encore supporté
    • Mono.fromCallable(() -> { … }).subscribeOn(Schedulers.elastic())
    • Attendre JDK 10
    • ThreadLocal perdent leur intérêt (MDC logging par exemple)
    • Pas encore de scope request ou session
    • myFlux.subscriberContext(Context.of("key", "value"))…
    Limitations
    @fbeaufume

    View Slide

  30. • Supporter une forte charge
    • Pour fiabiliser des applications très communicantes
    • Microservices
    • Applications sensibles à la contention
    Cas d’usages
    @fbeaufume

    View Slide

  31. Merci
    @fbeaufume

    View Slide