SlideShare ist ein Scribd-Unternehmen logo
1 von 22
Downloaden Sie, um offline zu lesen
Patterns de développement
pour une application Web
réactive et concurrente
25/10/2013
Qui sommes-nous ?
@fXzo

@antoined
De quoi allons nous vous parler ?

•  Un concours : Typesafe Developer Contest
•  Une application : Car Race Dashboard
•  Quelques cas d’utilisation des Actors Akka
et des Iteratees
Des patterns pour...

•  Effectuer des traitements asynchrones
•  Gérer des états dans notre application
•  Travailler avec un stream d’événements
L’application
Environ 20 heures de travail sur une semaine

scala	
  
coffee	
  
html	
  

Nb	
  file	
   Nb	
  lines	
  Avg	
  lines	
  
9	
  
770	
  
86	
  
7	
  
343	
  
49	
  
4	
  
275	
  
68	
  
Le résultat
« Fabrice and Antoine have designed an app
that is simply awesome, and a very, very close
runner up to the winner. It’s far more than just a
sample… and the judge were truly wowed»
https://github.com/intechgrp/CarRaceDashboard
Démo
Architecture globale
Navigateur

Navigateur

Flux SSE

Track = List [TrackPoint]
RTevListener

RTevListener

Race
Akka.system.eventStream
Car

Car

Car

Car

Car
Stats

Stream.events: Enumerator
Simulation

Storage
Moteur

MongoDB
Architecture globale
Navigateur

Navigateur

Flux SSE

Track = List [TrackPoint]
RTevListener

RTevListener

Race
Akka.system.eventStream
Car

Car

Car

Car

Car
Stats

Stream.events: Enumerator
Simulation

Storage
Moteur

MongoDB
La course

case class Position(latitude: Double, longitude: Double)
case class TrackPoint(id: Int, position: Position)
type Track = List[TrackPoint]
Déplacement des voitures

//return new CheckPoint on the track at distance d from point
private def next(point: TrackPoint, d: Double): TrackPoint
La Simulation - CarActor

•  Un Acteur Akka par coureur
o 
o 

Gère l’état courant du coureur : sa position actuelle,
sa vitesse instantanée, la distance parcourue
Réagit à différents messages :
§  “move” : se déplace à la position suivante
§  “start” : début de la course, c.a.d. schedule
l’envoi de messages “move”
§  “getState” : retourne l’état courant
La Simulation - RaceActor

•  Un Acteur Akka pour gérer tous les coureurs
o 

Envoie le message “start” à tous les coureurs au
démarrage de la course : utilisation d’un
BroadcastRouter

router = context.actorOf(Props[CarActor].withRouter(akka.routing.BroadcastRouter(currentRace.get.carActors)))
/ Fire start event : broadcast the event to all CarActors
router ! "start"
Architecture globale
Navigateur

Navigateur

Flux SSE

Track = List [TrackPoint]
RTevListener

RTevListener

Race
Akka.system.eventStream
Car

Car

Car

Car

Car
Stats

Stream.events: Enumerator
Simulation

Storage
Moteur

MongoDB
La Simulation - RaceActor
o 

Produit le flux d’événements à partir des CarActor et
le lie au Moteur

// Connect the event stream to the storage actor
new Streams(currentRace.get).events(Iteratee.foreach[models.Events.Event] {
event => models.StorageActor.actor ! event
})

→ pour chaque événement produit par Streams, transmet l’événement au
Moteur (“StorageActor”)
Architecture globale
Navigateur

Navigateur

Flux SSE

Track = List [TrackPoint]
RTevListener

RTevListener

Race
Akka.system.eventStream
Car

Car

Car

Car

Car
Stats

Stream.events: Enumerator
Simulation

Storage
Moteur

MongoDB
Le moteur
•  Le moteur est un acteur Akka recevant tous les

• 

événements émis par tous les véhicules
Pour chaque événement reçu, l’acteur :
o  Publie l’événement sur le stream d’événements
Akka
o  Stocke l’événement dans une collection MongoDB
Le moteur

•  Un autre acteur (StatsActor) est planifié pour calculer
• 
• 

régulièrement des statistiques (vitesse moyenne, min,
max, …) par voiture
Cet acteur se base sur les données insérées dans
MongoDB
Pour chaque statistique calculée, l’actor publie un
message dans l’eventStream Akka
Architecture globale
Navigateur

Navigateur

Flux SSE

Track = List [TrackPoint]
RTevListener

RTevListener

Race
Akka.system.eventStream
Car

Car

Car

Car

Car
Stats

Stream.events: Enumerator
Simulation

Storage
Moteur

MongoDB
Flux SSE

•  Pour chaque navigateur accédant à l’application, un
• 
• 

acteur « RTEventListener » est créé
Cet acteur est à l’écoute de l’eventStream Akka
Pour chaque message sur ce stream, l’acteur envoie
dans le flux Server Sent Event une représentation
JSON du message
Interface

•  Au niveau de l’interface HTML5, le flux SSE est
• 

connecté avec l’objet JavaScript « EventSource »
Pour chaque message reçu sur ce flux, l’interface est
mise à jour en fonction du type d’événement :

• 
• 
• 

Nouvelle position : déplace la voiture concernée
Statistiques : met à jour le récapitulatif
Vitesse instantée / distance parcourue : met à jour le compteur
Merci !
Questions ?

Weitere ähnliche Inhalte

Andere mochten auch

Adultes seulement.cvg
Adultes seulement.cvgAdultes seulement.cvg
Adultes seulement.cvgAlbert Antebi
 
7533 Leerlauf des Erdenlebens ....
7533   Leerlauf des Erdenlebens ....7533   Leerlauf des Erdenlebens ....
7533 Leerlauf des Erdenlebens ....Marianne Zipf
 
7754 Umgestaltungswerk der Erde ....
7754   Umgestaltungswerk der Erde ....7754   Umgestaltungswerk der Erde ....
7754 Umgestaltungswerk der Erde ....Marianne Zipf
 
Crowd-Sourcing meets Gamification
Crowd-Sourcing meets Gamification Crowd-Sourcing meets Gamification
Crowd-Sourcing meets Gamification Stefan Berkenhoff
 
Richard Erbeznik, Digital Master resume, May 2016 (7)
Richard Erbeznik, Digital Master resume, May 2016 (7)Richard Erbeznik, Digital Master resume, May 2016 (7)
Richard Erbeznik, Digital Master resume, May 2016 (7)Richard Erbeznik
 
S.D. EVITA-WORKING CONTRADICTION
S.D. EVITA-WORKING CONTRADICTIONS.D. EVITA-WORKING CONTRADICTION
S.D. EVITA-WORKING CONTRADICTIONShannon Dwyer
 

Andere mochten auch (9)

Adultes seulement.cvg
Adultes seulement.cvgAdultes seulement.cvg
Adultes seulement.cvg
 
7533 Leerlauf des Erdenlebens ....
7533   Leerlauf des Erdenlebens ....7533   Leerlauf des Erdenlebens ....
7533 Leerlauf des Erdenlebens ....
 
7754 Umgestaltungswerk der Erde ....
7754   Umgestaltungswerk der Erde ....7754   Umgestaltungswerk der Erde ....
7754 Umgestaltungswerk der Erde ....
 
Crowd-Sourcing meets Gamification
Crowd-Sourcing meets Gamification Crowd-Sourcing meets Gamification
Crowd-Sourcing meets Gamification
 
Richard Erbeznik, Digital Master resume, May 2016 (7)
Richard Erbeznik, Digital Master resume, May 2016 (7)Richard Erbeznik, Digital Master resume, May 2016 (7)
Richard Erbeznik, Digital Master resume, May 2016 (7)
 
S.D. EVITA-WORKING CONTRADICTION
S.D. EVITA-WORKING CONTRADICTIONS.D. EVITA-WORKING CONTRADICTION
S.D. EVITA-WORKING CONTRADICTION
 
5 minutes suffisent
5 minutes suffisent5 minutes suffisent
5 minutes suffisent
 
La fréquentation des sites culturels et de loisirs & manifestations 2010-2011
La fréquentation des sites culturels et de loisirs & manifestations 2010-2011La fréquentation des sites culturels et de loisirs & manifestations 2010-2011
La fréquentation des sites culturels et de loisirs & manifestations 2010-2011
 
1407 loire chambord
1407 loire   chambord1407 loire   chambord
1407 loire chambord
 

Ähnlich wie Patterns de développement pour une application Web réactive et concurrente

Partie 2: Angular
Partie 2: AngularPartie 2: Angular
Partie 2: AngularHabib Ayad
 
NodeJS et SocketIO en mode scalable dans le Cloud - GAB 2015
NodeJS et SocketIO en mode scalable dans le Cloud - GAB 2015NodeJS et SocketIO en mode scalable dans le Cloud - GAB 2015
NodeJS et SocketIO en mode scalable dans le Cloud - GAB 2015Stéphane ESCANDELL
 
Morning tech #2 - Démarche performance slides
Morning tech #2 - Démarche performance slidesMorning tech #2 - Démarche performance slides
Morning tech #2 - Démarche performance slidesOxalide
 
Oxalide Morning tech #2 - démarche performance
Oxalide Morning tech #2 - démarche performanceOxalide Morning tech #2 - démarche performance
Oxalide Morning tech #2 - démarche performanceLudovic Piot
 
Angular développer des applications .pdf
Angular développer des applications .pdfAngular développer des applications .pdf
Angular développer des applications .pdfimenhamada17
 
Introduction aux RIA (Rich Internet Applications)
Introduction aux RIA (Rich Internet Applications)Introduction aux RIA (Rich Internet Applications)
Introduction aux RIA (Rich Internet Applications)Tugdual Grall
 
Symposium n°7 : Plateforme Meteor
Symposium n°7 : Plateforme MeteorSymposium n°7 : Plateforme Meteor
Symposium n°7 : Plateforme MeteorArthurMaroulier
 
Sql Saturday Paris 2016 - De StreamInsight à Azure Stream Analytics
Sql Saturday Paris 2016 - De StreamInsight à Azure Stream Analytics Sql Saturday Paris 2016 - De StreamInsight à Azure Stream Analytics
Sql Saturday Paris 2016 - De StreamInsight à Azure Stream Analytics Marius Zaharia
 
Ajax GTI780 & MTI780 ETS A09
Ajax  GTI780 & MTI780  ETS  A09Ajax  GTI780 & MTI780  ETS  A09
Ajax GTI780 & MTI780 ETS A09Claude Coulombe
 
Asp.net Présentation de L'application "Organizer"
Asp.net Présentation de L'application "Organizer"Asp.net Présentation de L'application "Organizer"
Asp.net Présentation de L'application "Organizer"Nazih Heni
 
Parisweb - javascript server side - par où commencer ?
Parisweb - javascript server side - par où commencer ?Parisweb - javascript server side - par où commencer ?
Parisweb - javascript server side - par où commencer ?Quentin Adam
 
Ajax en Java - GTI780 & MTI780 - ETS - A08
Ajax en Java - GTI780 & MTI780 - ETS - A08Ajax en Java - GTI780 & MTI780 - ETS - A08
Ajax en Java - GTI780 & MTI780 - ETS - A08Claude Coulombe
 
Monitoring applicatif : Pourquoi et comment ?
Monitoring applicatif : Pourquoi et comment ?Monitoring applicatif : Pourquoi et comment ?
Monitoring applicatif : Pourquoi et comment ?Kenny Dits
 
GtugDakar AppEngine, Gwt
GtugDakar AppEngine, GwtGtugDakar AppEngine, Gwt
GtugDakar AppEngine, Gwthkairi
 
[TechDays 2012] : Quoi de neuf dans ASP.NET 4.5
[TechDays 2012] : Quoi de neuf dans ASP.NET 4.5[TechDays 2012] : Quoi de neuf dans ASP.NET 4.5
[TechDays 2012] : Quoi de neuf dans ASP.NET 4.5Mohamed Nemili
 
Quoi de neuf dans ASP.NET 4.5
Quoi de neuf dans ASP.NET 4.5Quoi de neuf dans ASP.NET 4.5
Quoi de neuf dans ASP.NET 4.5Microsoft
 
IBM Bluemix Paris meetup - #PG4D - 20160914-3
IBM Bluemix Paris meetup - #PG4D -  20160914-3IBM Bluemix Paris meetup - #PG4D -  20160914-3
IBM Bluemix Paris meetup - #PG4D - 20160914-3IBM France Lab
 
Le Développement d’une Application Web
Le Développement d’une Application WebLe Développement d’une Application Web
Le Développement d’une Application WebMalick Mbaye
 

Ähnlich wie Patterns de développement pour une application Web réactive et concurrente (20)

Partie 2: Angular
Partie 2: AngularPartie 2: Angular
Partie 2: Angular
 
NodeJS et SocketIO en mode scalable dans le Cloud - GAB 2015
NodeJS et SocketIO en mode scalable dans le Cloud - GAB 2015NodeJS et SocketIO en mode scalable dans le Cloud - GAB 2015
NodeJS et SocketIO en mode scalable dans le Cloud - GAB 2015
 
Morning tech #2 - Démarche performance slides
Morning tech #2 - Démarche performance slidesMorning tech #2 - Démarche performance slides
Morning tech #2 - Démarche performance slides
 
Oxalide Morning tech #2 - démarche performance
Oxalide Morning tech #2 - démarche performanceOxalide Morning tech #2 - démarche performance
Oxalide Morning tech #2 - démarche performance
 
Angular développer des applications .pdf
Angular développer des applications .pdfAngular développer des applications .pdf
Angular développer des applications .pdf
 
Introduction aux RIA (Rich Internet Applications)
Introduction aux RIA (Rich Internet Applications)Introduction aux RIA (Rich Internet Applications)
Introduction aux RIA (Rich Internet Applications)
 
Symposium n°7 : Plateforme Meteor
Symposium n°7 : Plateforme MeteorSymposium n°7 : Plateforme Meteor
Symposium n°7 : Plateforme Meteor
 
Angular retro
Angular retroAngular retro
Angular retro
 
Sql Saturday Paris 2016 - De StreamInsight à Azure Stream Analytics
Sql Saturday Paris 2016 - De StreamInsight à Azure Stream Analytics Sql Saturday Paris 2016 - De StreamInsight à Azure Stream Analytics
Sql Saturday Paris 2016 - De StreamInsight à Azure Stream Analytics
 
Ajax GTI780 & MTI780 ETS A09
Ajax  GTI780 & MTI780  ETS  A09Ajax  GTI780 & MTI780  ETS  A09
Ajax GTI780 & MTI780 ETS A09
 
Support de Cours JSF2 Première partie Intégration avec Spring
Support de Cours JSF2 Première partie Intégration avec SpringSupport de Cours JSF2 Première partie Intégration avec Spring
Support de Cours JSF2 Première partie Intégration avec Spring
 
Asp.net Présentation de L'application "Organizer"
Asp.net Présentation de L'application "Organizer"Asp.net Présentation de L'application "Organizer"
Asp.net Présentation de L'application "Organizer"
 
Parisweb - javascript server side - par où commencer ?
Parisweb - javascript server side - par où commencer ?Parisweb - javascript server side - par où commencer ?
Parisweb - javascript server side - par où commencer ?
 
Ajax en Java - GTI780 & MTI780 - ETS - A08
Ajax en Java - GTI780 & MTI780 - ETS - A08Ajax en Java - GTI780 & MTI780 - ETS - A08
Ajax en Java - GTI780 & MTI780 - ETS - A08
 
Monitoring applicatif : Pourquoi et comment ?
Monitoring applicatif : Pourquoi et comment ?Monitoring applicatif : Pourquoi et comment ?
Monitoring applicatif : Pourquoi et comment ?
 
GtugDakar AppEngine, Gwt
GtugDakar AppEngine, GwtGtugDakar AppEngine, Gwt
GtugDakar AppEngine, Gwt
 
[TechDays 2012] : Quoi de neuf dans ASP.NET 4.5
[TechDays 2012] : Quoi de neuf dans ASP.NET 4.5[TechDays 2012] : Quoi de neuf dans ASP.NET 4.5
[TechDays 2012] : Quoi de neuf dans ASP.NET 4.5
 
Quoi de neuf dans ASP.NET 4.5
Quoi de neuf dans ASP.NET 4.5Quoi de neuf dans ASP.NET 4.5
Quoi de neuf dans ASP.NET 4.5
 
IBM Bluemix Paris meetup - #PG4D - 20160914-3
IBM Bluemix Paris meetup - #PG4D -  20160914-3IBM Bluemix Paris meetup - #PG4D -  20160914-3
IBM Bluemix Paris meetup - #PG4D - 20160914-3
 
Le Développement d’une Application Web
Le Développement d’une Application WebLe Développement d’une Application Web
Le Développement d’une Application Web
 

Patterns de développement pour une application Web réactive et concurrente

  • 1. Patterns de développement pour une application Web réactive et concurrente 25/10/2013
  • 3. De quoi allons nous vous parler ? •  Un concours : Typesafe Developer Contest •  Une application : Car Race Dashboard •  Quelques cas d’utilisation des Actors Akka et des Iteratees
  • 4. Des patterns pour... •  Effectuer des traitements asynchrones •  Gérer des états dans notre application •  Travailler avec un stream d’événements
  • 5. L’application Environ 20 heures de travail sur une semaine scala   coffee   html   Nb  file   Nb  lines  Avg  lines   9   770   86   7   343   49   4   275   68  
  • 6. Le résultat « Fabrice and Antoine have designed an app that is simply awesome, and a very, very close runner up to the winner. It’s far more than just a sample… and the judge were truly wowed» https://github.com/intechgrp/CarRaceDashboard
  • 8. Architecture globale Navigateur Navigateur Flux SSE Track = List [TrackPoint] RTevListener RTevListener Race Akka.system.eventStream Car Car Car Car Car Stats Stream.events: Enumerator Simulation Storage Moteur MongoDB
  • 9. Architecture globale Navigateur Navigateur Flux SSE Track = List [TrackPoint] RTevListener RTevListener Race Akka.system.eventStream Car Car Car Car Car Stats Stream.events: Enumerator Simulation Storage Moteur MongoDB
  • 10. La course case class Position(latitude: Double, longitude: Double) case class TrackPoint(id: Int, position: Position) type Track = List[TrackPoint]
  • 11. Déplacement des voitures //return new CheckPoint on the track at distance d from point private def next(point: TrackPoint, d: Double): TrackPoint
  • 12. La Simulation - CarActor •  Un Acteur Akka par coureur o  o  Gère l’état courant du coureur : sa position actuelle, sa vitesse instantanée, la distance parcourue Réagit à différents messages : §  “move” : se déplace à la position suivante §  “start” : début de la course, c.a.d. schedule l’envoi de messages “move” §  “getState” : retourne l’état courant
  • 13. La Simulation - RaceActor •  Un Acteur Akka pour gérer tous les coureurs o  Envoie le message “start” à tous les coureurs au démarrage de la course : utilisation d’un BroadcastRouter router = context.actorOf(Props[CarActor].withRouter(akka.routing.BroadcastRouter(currentRace.get.carActors))) / Fire start event : broadcast the event to all CarActors router ! "start"
  • 14. Architecture globale Navigateur Navigateur Flux SSE Track = List [TrackPoint] RTevListener RTevListener Race Akka.system.eventStream Car Car Car Car Car Stats Stream.events: Enumerator Simulation Storage Moteur MongoDB
  • 15. La Simulation - RaceActor o  Produit le flux d’événements à partir des CarActor et le lie au Moteur // Connect the event stream to the storage actor new Streams(currentRace.get).events(Iteratee.foreach[models.Events.Event] { event => models.StorageActor.actor ! event }) → pour chaque événement produit par Streams, transmet l’événement au Moteur (“StorageActor”)
  • 16. Architecture globale Navigateur Navigateur Flux SSE Track = List [TrackPoint] RTevListener RTevListener Race Akka.system.eventStream Car Car Car Car Car Stats Stream.events: Enumerator Simulation Storage Moteur MongoDB
  • 17. Le moteur •  Le moteur est un acteur Akka recevant tous les •  événements émis par tous les véhicules Pour chaque événement reçu, l’acteur : o  Publie l’événement sur le stream d’événements Akka o  Stocke l’événement dans une collection MongoDB
  • 18. Le moteur •  Un autre acteur (StatsActor) est planifié pour calculer •  •  régulièrement des statistiques (vitesse moyenne, min, max, …) par voiture Cet acteur se base sur les données insérées dans MongoDB Pour chaque statistique calculée, l’actor publie un message dans l’eventStream Akka
  • 19. Architecture globale Navigateur Navigateur Flux SSE Track = List [TrackPoint] RTevListener RTevListener Race Akka.system.eventStream Car Car Car Car Car Stats Stream.events: Enumerator Simulation Storage Moteur MongoDB
  • 20. Flux SSE •  Pour chaque navigateur accédant à l’application, un •  •  acteur « RTEventListener » est créé Cet acteur est à l’écoute de l’eventStream Akka Pour chaque message sur ce stream, l’acteur envoie dans le flux Server Sent Event une représentation JSON du message
  • 21. Interface •  Au niveau de l’interface HTML5, le flux SSE est •  connecté avec l’objet JavaScript « EventSource » Pour chaque message reçu sur ce flux, l’interface est mise à jour en fonction du type d’événement : •  •  •  Nouvelle position : déplace la voiture concernée Statistiques : met à jour le récapitulatif Vitesse instantée / distance parcourue : met à jour le compteur