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. • 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
  2. • 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
  3. • Cout mémoire et CPU (context switches) • Contention Limitations

    des threads Server thread Database Client HTTP request SQL request #1 SQL request #2 @fbeaufume
  4. • 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
  5. Spring Framework 5 Spring Framework Tomcat Netty Reactor Spring Web

    MVC Spring WebFlux Bloquant Réactif Reactive Streams @fbeaufume
  6. Ecosystème Spring réactif Spring Framework 5 Spring Boot 2 Spring

    Data 2 Spring Security 5 Spring Integration 5 Spring Cloud @fbeaufume
  7. • "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
  8. • Pour donner du contrôle au consommateur sur le producteur

    Backpressure Producer Consumer Data flow Data request @fbeaufume
  9. • "Standard for asynchronous stream processing with non-blocking backpressure" •

    Implémentations : RxJava, Reactor, Akka Streams, etc. Reactive streams @fbeaufume
  10. Charge Bloquant Réactif 300 users injectés => 189 req/s mesuré

    3000 users injectés => 2664 req/s mesuré @fbeaufume
  11. • 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
  12. • 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
  13. • Supporter une forte charge • Pour fiabiliser des applications

    très communicantes • Microservices • Applications sensibles à la contention Cas d’usages @fbeaufume