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
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
5. • Cout mémoire et CPU (context switches)
• Contention
Limitations des threads
Server thread DatabaseClient
HTTP request
SQL request #1
SQL request #2
6. • Montée en charge et robustesse
• Exemples : Node.js, Vert.x, Redis, HAProxy
Modèle non bloquant
Event queueEvents
Event loop
HTTP requests
SQL responses
…
Few worker threads
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
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
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
30. • Supporter une forte charge
• Pour fiabiliser des applications très communicantes
• Microservices
• Applications sensibles à la contention
Cas d’usages