@fXzo @antoined#Reactive
Les Applications Réactives: un nouveau
paradigme pour relever les défis de
l’économie numérique !
http://www.intech.lu
@fXzo @antoined#Reactive
ou
Comment expliquer à son patron qu’il
serait utile de développer en utilisant
les patterns réactifs !
@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.
@fXzo @antoined#Reactive
Etre réactif au niveau business
Découverte Validation
Business Model
Hypothèse, mesure
décision
Réaction
@fXzo @antoined#Reactive
@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
@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 :
@fXzo @antoined#Reactive
Réagir de façon non bloquante
@fXzo @antoined#Reactive
Réagir de façon non bloquante
Cas d’utilisation
@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
@fXzo @antoined#Reactive
{user: …,
transactions: […]}
{user: …,
transactions: […]}
Réagir de façon non bloquante
getUser
getTransactions
GET /user/1234GET /user/1234
@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
@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
@fXzo @antoined#Reactive
{user: …,
transactions: […]}
{user: …,
transactions: […]}
Réagir de façon non bloquante
getTransactions
GET /user/1234GET /user/1234
getUser
@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
@fXzo @antoined#Reactive
Réagir de façon non bloquante
Exemple en Scala
Scala 2.10
Future/Promise
@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 »
@fXzo @antoined#Reactive
Réagir de façon non bloquante
@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
@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 !
@fXzo @antoined#Reactive
Réagir de façon non bloquante
Exemple en
JavaScript
API JQuery
Deferred
@fXzo @antoined#Reactive
@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
@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
@fXzo @antoined#Reactive
Scala : Future
API
Scala : Future
API
JavaScript :
JQuery
JavaScript :
JQuery
@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
@fXzo @antoined#Reactive
Réagir de façon non bloquante
@fXzo @antoined#Reactive
Pourquoi être réactif à l’ère de
l’économie digitale ?
@fXzo @antoined#Reactive
Les 4 piliers de la transformation
digitale
MobileMobile SocialSocial
Big DataBig Data CloudCloud
Temps
Réel
@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.
@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
@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
@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
@fXzo @antoined#Reactive
Le code réactif
@fXzo @antoined#Reactive
Réagir aux événements
@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
@fXzo @antoined#Reactive
Réagir aux événements
Cas d’utilisation
@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
@fXzo @antoined#Reactive
Réagir aux événements
Exemple en
JavaScript
bacon.js
@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
@fXzo @antoined#Reactive
@fXzo @antoined#Reactive
@fXzo @antoined#Reactive
@fXzo @antoined#Reactive
Réagir aux événements
map(...)map(...) onValue(...)onValue(...)merge(...)merge(...)
keyupkeyup
unloadunload
clickclick
{type: …}{type: …}
@fXzo @antoined#Reactive
Réagir aux événements
Flux à partir d’événements « externes » :
• Du navigateur : click, keyup, unload
• Résultats d’appels asynchrones (AJAX)
Ou événements créés avec bacon :
• Fonctionnement en mode « push »
@fXzo @antoined#Reactive
Conclusion
@fXzo @antoined#Reactive
Quelques librairies Reactives
RxJava
@fXzo @antoined#Reactive
Questions ?

Les applications réactives, un nouveau paradigme pour relever les défis de l'économie numérique

  • 1.
    @fXzo @antoined#Reactive Les ApplicationsRéactives: un nouveau paradigme pour relever les défis de l’économie numérique ! http://www.intech.lu
  • 2.
    @fXzo @antoined#Reactive ou Comment expliquerà son patron qu’il serait utile de développer en utilisant les patterns réactifs !
  • 3.
    @fXzo @antoined#Reactive Qu’est cequ’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.
  • 4.
    @fXzo @antoined#Reactive Etre réactifau niveau business Découverte Validation Business Model Hypothèse, mesure décision Réaction
  • 5.
  • 6.
    @fXzo @antoined#Reactive Measure faster Funnelanalysis 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éactifpour mesurer Asynchrones Non bloquantes Systématiques Au fil de l’eau Cas nominaux et cas d’erreur Les mesures doivent être :
  • 8.
  • 9.
    @fXzo @antoined#Reactive Réagir defaçon non bloquante Cas d’utilisation
  • 10.
    @fXzo @antoined#Reactive Réagir defaç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
  • 11.
    @fXzo @antoined#Reactive {user: …, transactions:[…]} {user: …, transactions: […]} Réagir de façon non bloquante getUser getTransactions GET /user/1234GET /user/1234
  • 12.
    @fXzo @antoined#Reactive Réagir defaç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 defaç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
  • 14.
    @fXzo @antoined#Reactive {user: …, transactions:[…]} {user: …, transactions: […]} Réagir de façon non bloquante getTransactions GET /user/1234GET /user/1234 getUser
  • 15.
    @fXzo @antoined#Reactive Réagir defaçon non bloquante Traitements en parallèle Plus de thread bloqué : le serveur réagit aux évènements qui surviennent AvantagesAvantages
  • 16.
    @fXzo @antoined#Reactive Réagir defaçon non bloquante Exemple en Scala Scala 2.10 Future/Promise
  • 17.
    @fXzo @antoined#Reactive Réagir defaç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 »
  • 18.
  • 19.
    @fXzo @antoined#Reactive Réagir defaç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 defaç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 !
  • 21.
    @fXzo @antoined#Reactive Réagir defaçon non bloquante Exemple en JavaScript API JQuery Deferred
  • 22.
  • 23.
    @fXzo @antoined#Reactive Réagir defaç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 defaç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
  • 25.
    @fXzo @antoined#Reactive Scala :Future API Scala : Future API JavaScript : JQuery JavaScript : JQuery
  • 26.
    @fXzo @antoined#Reactive Réagir defaç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
  • 27.
  • 28.
    @fXzo @antoined#Reactive Pourquoi êtreréactif à l’ère de l’économie digitale ?
  • 29.
    @fXzo @antoined#Reactive Les 4piliers de la transformation digitale MobileMobile SocialSocial Big DataBig Data CloudCloud Temps Réel
  • 30.
    @fXzo @antoined#Reactive Qu’est cequ’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’uneappli 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
  • 34.
  • 35.
  • 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
  • 37.
    @fXzo @antoined#Reactive Réagir auxévénements Cas d’utilisation
  • 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
  • 39.
    @fXzo @antoined#Reactive Réagir auxévénements Exemple en JavaScript bacon.js
  • 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
  • 41.
  • 42.
  • 43.
  • 44.
    @fXzo @antoined#Reactive Réagir auxévénements map(...)map(...) onValue(...)onValue(...)merge(...)merge(...) keyupkeyup unloadunload clickclick {type: …}{type: …}
  • 45.
    @fXzo @antoined#Reactive Réagir auxévénements Flux à partir d’événements « externes » : • Du navigateur : click, keyup, unload • Résultats d’appels asynchrones (AJAX) Ou événements créés avec bacon : • Fonctionnement en mode « push »
  • 46.
  • 47.
  • 48.