les applications réactives, un nouveau paradigme pour relever les défis de l'économie...
DESCRIPTION
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.TRANSCRIPT
@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 ModelHypothèse, mesure
décision
Réaction
@fXzo @antoined#Reactive
@fXzo @antoined#Reactive
Measure faster
Funnel analysisCohort analysisNet promoter scoreSearch engine marketingPredictive monitoring
Lean startup est réactifBuild FasterUnit TestsUsability TestsContinuous IntegrationIncremental DeploymentFree & Open SourceCluster immune SystemJust in Time ScalabilityRefactoringDeveloper SandboxMinimum Viable Product
Learn fasterSplit tests
Customer developmentFive Why’s
Customer Advisory Board
Falsifiable hypothesesProduct ownerAccountability
Customer archetypesCross-functional teams
Smoke tests
Ideas
Measure
Learn
AppsData
Measure fasterSplit tests
Continuous deploymentUsability tests
Real-time monitoring & alertingCustomer liaison
Build
@fXzo @antoined#Reactive
Etre réactif pour mesurer
Asynchrones
Non bloquantes
SystématiquesAu 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 bloquanteLe serveur reçoit une requête :
Pour construire la réponse, il faut :rechercher l’utilisateur dans la base
de donnéesrécupérer les transactions via un
service webconstruire 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élisablesUne partie du temps côté serveur est
perdu à attendre desdonné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èlePlus de thread bloqué : le serveur réagit
aux évènementsqui surviennent
AvantagesAvantages
@fXzo @antoined#Reactive
Réagir de façon non bloquante
Exemple en ScalaScala 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 callbacksMais 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 JavaScriptAPI 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 bloquanteComment 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 APIScala : 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 digitaleMobileMobile SocialSocial
Big DataBig Data CloudCloud
TempsRé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 2013Calcul 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 2013Version 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énementsUne 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 JavaScriptbacon.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énementsFlux à 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 ?