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

Preview:

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.

Citation preview

@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 ?