Par François WEMAERE et
Florent FREMONT, LeadDevs MAIF
avec Spring Webflux
La programmation réactive est un paradigme de programmation visant à appliquer des opérateurs sur une source de données.
Elle s'appuie sur le patron de conception Observateur. On résonne en terme de Streams.
La notion de Mono est assez proche de celle de Promise en Javascript.
Text
Un framework web spring basé sur la stack réactive reactor qui implémente notamment la norme réactive Streams
C'est une stack qui vient combler des lacunes de WebMVC sans totalement la remplacer.
Mono : 0..1 éléments
Ex: récupérer un objet "Véhicule" depuis un appel réseau Mono<Vehicule>.
On peut aussi faire Mono<List<Vehicule>> si l'API REST nous le permet
Flux: 0..N éléments
Ex: Faire de l'event sourcing pour l'exposer en REST
Ex: Interconnexion avec une fil de messages (Kafka,...)
Est un système qui permet de réguler la transmission des éléments.
Car une approche non bloquante peut démultiplier des appels et provoquer des erreurs en cascade.
Concrètement cela permet :
prévenir les défaillances systémiques
contrôler le volume des éléments (delay, request, ....)
gérer un tampon (buffer, ...)
perdre les éléments en "trop" (cancel, ...)
- map, flatMap, filter, doOnNext
- Mono zip, zipWith
- Mono switchIfEmpty
- Mono onErrorResume
- Flux collectList
Webflux permet une gestion du threading via les classes "Scheduler" et "Worker".
- `Schedulers.immediate()` : évite de changer de thread (exécute maintenant^^)
- `Schedulers.single()` : réutilise un seul thread (pour les traitements à faibles latences)
- `Schedulers.parallel()` : définit N Worker (fonction des coeurs, pour les traitements rapides et non bloquants)
- `Schedulers.elastic() / Schedulers.boundedElastic()` : génère des threads à la demande (long traitement bloquant)
en java
https://github.com/ffremont/start-with-webflux
resilience4j
WebClient