A quels enjeux est confrontée une entreprise qui souhaite développer sa stratégie digitale ? Pourquoi les paradigmes de développement classiques ne sont pas adaptés pour développer les applications du futur ? Nous montrerons tout d'abord pourquoi au delà du buzz marketing, les Applications Réactives apportent une réponse aux défis que doivent relever les organisations. Nous décrirons ensuite les principes réactifs et en illustrerons la mise en oeuvre avec la Plate-forme Play/Akka en Scala.
3. @fXzo @antoined#Reactive
Qu’est ce qu’un système réactif ?
Un système qui répond à des
variations importantes de
paramètres prédéfinis sans
remettre en cause sa structure et
sans perturber son
fonctionnement nominal.
6. @fXzo @antoined#Reactive
Measure faster
Funnel analysis
Cohort analysis
Net promoter score
Search engine marketing
Predictive monitoring
Lean startup est réactif
Build Faster
Unit Tests
Usability Tests
Continuous Integration
Incremental Deployment
Free & Open Source
Cluster immune System
Just in Time Scalability
Refactoring
Developer Sandbox
Minimum Viable Product
Learn faster
Split tests
Customer development
Five Why’s
Customer Advisory
Board
Falsifiable hypotheses
Product owner
Accountability
Customer archetypes
Cross-functional teams
Smoke tests
Ideas
Measure
Learn
AppsData
Measure faster
Split tests
Continuous deployment
Usability tests
Real-time monitoring & alerting
Customer liaison
Build
7. @fXzo @antoined#Reactive
Etre réactif pour mesurer
Asynchrones
Non bloquantes
Systématiques
Au fil de l’eau
Cas nominaux et cas d’erreur
Les mesures doivent être :
10. @fXzo @antoined#Reactive
Réagir de façon non bloquante
Le serveur reçoit une requête :
Pour construire la réponse, il faut :
rechercher l’utilisateur dans la base
de données
récupérer les transactions via un
service web
construire un objet JSON de retour
GET /user/1234GET /user/1234
12. @fXzo @antoined#Reactive
Réagir de façon non bloquante
Les tâches sont parallélisables
Une partie du temps côté serveur est
perdu à attendre des
données
ProblèmesProblèmes
13. @fXzo @antoined#Reactive
Réagir de façon non bloquante
• Lance en parallèle les requêtes vers la base de données et le service web
• Définit une fonction qui sera exécutée quand les données seront disponibles
• Une fois les données disponibles, construit la réponse et l’envoie au client
Modèle non-bloquant
15. @fXzo @antoined#Reactive
Réagir de façon non bloquante
Traitements en parallèle
Plus de thread bloqué : le serveur réagit
aux évènements
qui surviennent
AvantagesAvantages
17. @fXzo @antoined#Reactive
Réagir de façon non bloquante
• Types natifs du langage : Future[T] représente un traitement asynchrone
qui peut éventuellement retourner une instance de T
• Parallélisable : possibilité d’exécuter une liste de Future et d’enregistrer un
callback une fois tous les traitements terminés
• Composable : enchaînement de Future : « exécute X et ensuite exécute Y »
19. @fXzo @antoined#Reactive
Réagir de façon non bloquante
•2 états : « complété » et « non complété »
•Permet de :
• Définir des fonctions (« callbacks ») qui seront exécutées lorsque la Future
sera complétée (onSuccess, …)
• D’appliquer une fonction sur la donnée quand la Future sera complétée (map)
• De composer (enchaîner) les Futures (flatMap) pour en obtenir une nouvelle
20. @fXzo @antoined#Reactive
Réagir de façon non bloquante
Une Future peut avoir plusieurs callbacks
Mais ne peut être complétée qu’une seule
fois
Le type Future est utilisé en « lecture »
(récupérer sa valeur)Alors comment compléter une Future ?
Utilisation du type Promise !
Alors comment compléter une Future ?
Utilisation du type Promise !
23. @fXzo @antoined#Reactive
Réagir de façon non bloquante
L’objet Promise est utilisé pour construire
une Future
Il permet de compléter cette Future « plus
tard »
… mais une seule fois !Une Future est en « lecture seule »
Promise permet d’écrire une valeur
dans une Future
Une Future est en « lecture seule »
Promise permet d’écrire une valeur
dans une Future
24. @fXzo @antoined#Reactive
Réagir de façon non bloquante
Comment gérer les erreurs dans un contexte asynchrone ?
• Une Future complétée peut avoir deux états : Success ou Failure
• Des callbacks dédiés pour ces différents résultats :
onSuccess / onFailure
26. @fXzo @antoined#Reactive
Réagir de façon non bloquante
• En Scala, map , flatMap, … ne vont s’exécuter que pour les cas de succès
• Il est possible de « récupérer » d’une Future en erreur, via les méthodes
recover, recoverWith
29. @fXzo @antoined#Reactive
Les 4 piliers de la transformation
digitale
MobileMobile SocialSocial
Big DataBig Data CloudCloud
Temps
Réel
30. @fXzo @antoined#Reactive
Qu’est ce qu’une application
réactive ?
Une application qui répond à des
variations importantes du nombre
de connexions simultanées sans
remettre en cause sa structure et
sans perturber son fonctionnement
nominal.
31. @fXzo @antoined#Reactive
Caractéristiques d’une appli
réactive
ParalléliserParalléliser
Limiter et ne pas
bloquer les IO
Limiter et ne pas
bloquer les IO
Gérer les erreurs
comme les cas
nominaux
Gérer les erreurs
comme les cas
nominaux
Nombre de connexions
simultanées
Nombre de connexions
simultanées
Comment ?
Orientée évènements
Scalable Résiliente Prédictible
32. @fXzo @antoined#Reactive
Un exemple: Code Story 2013
Calcul d’un planning de voyage optimal pour 50.000 trajet (4Mo de JSON) en moins
de 30s de temps vu de l’utilisateur.
TR1 TR2 TR50000…
ServeurServeur
TR1 TR2 TR50000…
HTTP
SortedSetSortedSet
OptimisationOptimisation
TR91 TR34 TR21…
TR1 TR2 TR50000
TR34
33. @fXzo @antoined#Reactive
Un exemple: Code Story 2013
Version réactive
TR1 TR2 TR50000…
ServeurServeur
SortedSetSortedSet
OptimisationOptimisation
TR91 TR34 TR21…
TR34
HTTP
IterateeIteratee
TR1 TR2 TR50000
36. @fXzo @antoined#Reactive
Réagir aux événements
• Producteurs / consommateurs d’événements
• Faible couplage entre les composants
• Meilleure utilisation des ressources
• Travailler avec des flux d’événements, potentiellement infinis
• Par exemple : événements de géolocalisation, flux de transactions, …
• Besoin de filtrer les événements, les modifier, agréger différents flux
38. @fXzo @antoined#Reactive
Réagir aux événements
Une application souhaite logger toutes
les actions effectuées par les
utilisateurs
Doit être fait de façon non intrusive
(pas de dégradation des performances
du service)
Différentes sources et types
d’événements
40. @fXzo @antoined#Reactive
Réagir aux événements
bacon.js est une librairie :
• Pour produire et travailler avec des flux d’événements en JavaScript
• Qui offre un pattern de type « Observable »
• Permettant également d’utiliser des patterns de la programmation fonctionnelle