SlideShare una empresa de Scribd logo
1 de 60
Descargar para leer sin conexión
Spray / RxScala / ElasticSearch
Paris  Scala  User  Group  #43  
!
!
!
!
Email:                mourad.dachraoui@ebiznext.com  
TwiAer:          @ze_dach
Mourad  DACHRAOUI
Contexte
Mogobiz
http://www.jahia.com/home/products/ecommerce-factory.html
SPRAY ?
Ensemble  de            
bibliothèques    pour    
la  construc>on  
d’API  RESTful  basé  
sur  Akka
spray-http
spray-can
IO STACK
spray-routing
spray-routing
spray-routing
spray-routing
hAp://spray.io/blog/2012-­‐12-­‐13-­‐the-­‐magnet-­‐paAern  
Place au code
ObjecLf:      
• DSL  composé  de  la  foncLon  host  
• Masquer  la  complexité  de  host    
ObjecLf:      
• DSL  composé  de  la  foncLon  host  
• Masquer  la  complexité  de  host    
Notre  méthode  host  prend  comme  
paramètre  plusieurs  types  en  entré.
ObjecLf:      
• DSL  composé  de  la  foncLon  host  
• Masquer  la  complexité  de  host    
Notre  méthode  host  prend  comme  paramètre  
en  entrée  plusieurs  types  en  entré.
Il  faut  le  converLr  implicitement  
en  Int  (logique  applicaLve  pour  
notre  exemple)  
=>  l'evidence  ev
ObjecLf:      
• DSL  composé  de  la  foncLon  host  
• Masquer  la  complexité  de  host    
Notre  méthode  host  prend  comme  paramètre  
en  entrée  plusieurs  types  en  entré.
Il  faut  le  converLr  implicitement  
en  Int  (logique  applicaLve  pour  
notre  exemple)  
=>  l'evidence  ev
ObjecLf:      
• DSL  composé  de  la  foncLon  host  
• Masquer  la  complexité  de  host    
Notre  méthode  host  prend  comme  paramètre  
en  entrée  plusieurs  types  en  entré.
Il  faut  le  converLr  implicitement  
en  Int  (logique  applicaLve  pour  
notre  exemple)  
=>  l'evidence  ev
!
<console>:24:  error:  type  mismatch;  
  found      :  SprayTestsNoMagnet.Route  
  required:  String  =>  Int  
                      new  Route  {}  
                      ^
!
<console>:24:  error:  type  mismatch;  
  found      :  SprayTestsNoMagnet.Route  
  required:  String  =>  Int  
                      new  Route  {}  
                      ^
val  route  =  host("SprayTestsNoMagnet")  (  new  Route  {}  )  
=
val  route  =  host("SprayTestsNoMagnet")  (  new  Route  {}  )  
=
Solu>on  =>  Appel  intermédiaire
scala>  import  SprayTestsNoMagnet._  
import  SprayTestsNoMagnet._  
!
scala>  tmpHost  
res1:  SprayTestsNoMagnet.Route  =>  SprayTestsNoMagnet.Route  =  <funcLon1>  
!
tmpHost  (new  Route  {})  
res2:  SprayTestsNoMagnet.Route  =  $anon$1@6f5c0b7b  
!
host("SprayTestsNoMagnet")  (stringToInt)  (new  Route  {})  
res4:  SprayTestsNoMagnet.Route  =  $anon$1@521352d8
Nous  ne  pouvons  pas  nous  
contenter  de  ce/e  solu1on  si  nous  
é1ons  entrain  d'écrire  un  DSL
==>  Magnet  «  paMern  »  qui  résout  
entre  autre  ceMe  probléma>que
Nous  ne  pouvons  pas  nous  
contenter  de  ce/e  solu1on  si  nous  
é1ons  entrain  d'écrire  un  DSL
//  Notre  nouveau  Type  HostMagnet  est  bien  sensé  renvoyer  la  même  foncLon  Route  =>  Route
//  Notre  nouveau  Type  HostMagnet  est  bien  sensé  renvoyer  la  même  foncLon  Route  =>  Route
//  Le  premier  implicit  est  une  conversion  implicite  qui  nous  permet  d'obtenir  
//  une  instance  HostMagnet  à  parLr  d'une  string  ,  en  l'occurrence  "mogobiz.io"
//  Notre  nouveau  Type  HostMagnet  est  bien  sensé  renvoyer  la  même  foncLon  Route  =>  Route
//  Le  premier  implicit  est  une  conversion  implicite  qui  nous  permet  d'obtenir  
//  une  instance  HostMagnet  à  parLr  d'une  string  ,  en  l'occurrence  "mogobiz.io"
  //  host  prend  un  paramètre  de  type  HostMagnet  
  //  et  retourne  une  instance  de  HostMagnet
//  magnet.apply()
scala>  import  SprayTestsWithMagnet._  
import  SprayTestsWithMagnet._  
!
scala>  val  route  =  host("mogobiz.io")  {  
          |    new  Route  {}  
          |      }  
route:  SprayTestsWithMagnet.Route  =  $anon$1@51f347a  
!
scala>  val  x  =    host("mogobiz.io")  
x:  SprayTestsWithMagnet.Route  =>  SprayTestsWithMagnet.Route  =  
<function1>
• Finaliser  une  requête  HTTP  
• DSL  ==>  «  complete  »  
• Plusieurs  manière  de  finaliser  une  requête  
HTTP  ==>  Surcharger  «  complete  »
Type  erasure
LimitaLon  pour  les  types  paramètrés  
Nice,  but  
show  me…
…  some  Magnet  PaMern  in  Spray-­‐rou>ng  
CeAe  direcLve  est  uLlisée  au  sein  
d'une  val  route  qui  est  de  Type  
Route  (spray-­‐rouLng).
CeAe  direcLve  est  uLlisée  au  sein  
d'une  val  route  qui  est  de  Type  
Route  (spray-­‐rouLng).
?
pathPrefix  est  une  foncLon  qui  prend  en  paramètre  un  
PathMatcher  et  qui  nous  renvoi  un  objet  de  type  Directive.    
!
(cf.    spray-­‐rouLng/src/main/scala/spray/rouLng/direcLves/PathDirecLves.scala)
pathPrefix  est  une  foncLon  qui  prend  en  paramètre  un  
PathMatcher  et  qui  nous  renvoi  un  objet  de  type  Directive.    
!
(cf.    spray-­‐rouLng/src/main/scala/spray/rouLng/direcLves/PathDirecLves.scala)
PathMatcher  défini  un  implicite  qui  converL  un  String  en  
PathMatcher  (conversion  d’  "acount"  en  une  instance  de  
PathMatcher)  
(cf.    spray-­‐rouLng/src/main/scala/spray/rouLng/PathMatcher.scala)
pathPrefix  est  une  direcLve,  
qui  prend  en  paramètre  une  closure  
de  type  Route,  
Et  retourne  une  Route.
pathPrefix  est  une  direcLve,  
qui  prend  en  paramètre  une  closure  
de  type  Route,  
Et  retourne  une  Route.
==>  Conver1r  implicitement  la  
Directive  en  une  fonc1on  qui  
prend  un  paramètre  de  type  Route  
et  renvoi  un  résultat  de  Type  
Route    (Route  =>  Route)
(cf.  spray-­‐rouLng/src/main/scala/spray/rouLng/DirecLve.scala)
Il  prend  en  paramètre  une  DirecLve  ET  un  Converter  en  implicite.  
!
L’  ApplyConverter  en  implicite  est  un  type  paramétré,  donc  il  dépend  
du  type  de  DirecLve  en  entré.  
(cf.  spray-­‐rouLng/src/main/scala/spray/rouLng/DirecLve.scala)
(cf.  spray-­‐rouLng/src/main/scala/spray/rouLng/ApplyConverter.scala)
l'ApplyConverter  est  l'équivalent  de  notre  
évidence  de  l'exemple  précédant  qui  va  
converLr  la  DirecLve[L]  en  Route
(cf.  spray-­‐rouLng/src/main/scala/spray/rouLng/DirecLve.scala)
(cf.  spray-­‐rouLng/src/main/scala/spray/rouLng/ApplyConverter.scala)
ApplyConverter  va  renvoyer  un  In  qui  est  en  fait  une  Route.  Le  
pimpApply  renvoi  une  foncLon  hac.In  =>  Route    
!
=>  Nous  avons  donc  notre  Type  de  retour  Route  =>  Route
• Notre  Objet  Magnet  est  la  Directive  
• pathPrefix  est  exécuté  une  seule  fois;  lors  du  chargement  de  
l'applicaLon  (Spray)  transformé  en  Directive  
• La  Directive  est  transformée  en  une  foncLon  qui  prend  en  
paramètre;  la  Route  entre  accolade  
• Tout  ce  qui  produit  une  Directive  est  exécuté  au  chargement  de  
spray  (get,  path,  pathPrefix,  completed,  )  
• Spray  va  stocker  ceAe  informaLon  et  ne  va  pas  l'évaluer  à  chaque  fois.    
• Par  contre,  les  définiLons  des  closures  seront  chargés  mais  non  
exécuté.  
RxJava-Sclala
spray-client
spray-client
• non  adapté  dans  certain  cas  d’uLlisaLon  (Mogobiz)  
• Appel  de  plusieurs  Index  ElasLcSearch  en  parallèle    
• Appliquer  des  traitement  (Suppression  des  langues,  
calcul  du  prix)  
• ComposiLon  +  dépendance    des  Futures  
==>  Complexité  d’implémentaLon    
==>  Nous  perdons  la  simplicité  du  DSL  spray-­‐client  
RxJava
• ImplémentaLon  par  Nexlix  
du  Projet  Rx  (ReacLve  
Extensions)  hAp://
codeplex.com/  de  Microsoy    
• Bibliothèque  permeAant  de  
composer  des  programmes  
événemen>els  asynchrone,  
via  l’uLlisaLon  de  séquences  
observables.
RxJava
Resources
• Ben  Christensen.  “FuncLonal  ReacLve  Programming  
in  the  Nexlix  API.”  hAp://fr.slideshare.net/InfoQ/
funcLonal-­‐reacLve-­‐programming-­‐in-­‐the-­‐nexlix-­‐api    
• Mathias  Doenitz.  “Spray:  REST  on  Akka  (Scala  
Days).”  hAp://fr.slideshare.net/sirthias/spray-­‐rest-­‐
on-­‐akka-­‐12616908    
• “Spray  |  Blog »  The  Magnet  PaAern.”  hAp://spray.io/
blog/2012-­‐12-­‐13-­‐the-­‐magnet-­‐paAern/  
Resources
• “Spray  |  DocumentaLon.”  hAp://spray.io/
documentaLon/    
• “Implicit  Parameters  -­‐  Scala  DocumentaLon.”  
hAp://docs.scala-­‐lang.org/tutorials/tour/
implicit-­‐parameters.html    
• “Scala  IO  2013  =>  Spray :  REST  on  Akka  -­‐  
Blog.roddet.com.”  hAp://blog.roddet.com/
2013/10/scalaio-­‐2013-­‐spray-­‐rest-­‐on-­‐akka/
Medias
• “Sciences  Naturelles:  Horseshoe-­‐Magnet-­‐Red-­‐Silver-­‐Iron-­‐
Filings-­‐Highres-­‐.”hAp://mirror-­‐us-­‐ga1.gallery.hd.org/_c/
natural-­‐science/_more2008/_more12/horseshoe-­‐
magnet-­‐red-­‐silver-­‐iron-­‐filings-­‐highres-­‐AHD.jpg.html    
• “Willy  Wonka”  hAp://memegenerator.net/Willywonka/
capLon    
• “API  Safe  and  Easy  Aquarium  Spray”  hAp://
www.amazon.com/API-­‐Safe-­‐Aquarium-­‐Spray-­‐8-­‐Ounce/
dp/B001D728VI
Merci
Q&A

Más contenido relacionado

La actualidad más candente

Caching reboot: javax.cache & Ehcache 3
Caching reboot: javax.cache & Ehcache 3Caching reboot: javax.cache & Ehcache 3
Caching reboot: javax.cache & Ehcache 3Louis Jacomet
 
Introduction au langage Go
Introduction au langage GoIntroduction au langage Go
Introduction au langage GoSylvain Wallez
 
Laravel yet another framework
Laravel  yet another frameworkLaravel  yet another framework
Laravel yet another frameworkLAHAXE Arnaud
 
Realtime Web avec Akka, Kafka, Spark et Mesos - Devoxx Paris 2014
Realtime Web avec Akka, Kafka, Spark et Mesos - Devoxx Paris 2014Realtime Web avec Akka, Kafka, Spark et Mesos - Devoxx Paris 2014
Realtime Web avec Akka, Kafka, Spark et Mesos - Devoxx Paris 2014Ippon
 
Stockage et analyse temps réel d'événements avec Riak chez Booking.com
Stockage et analyse temps réel d'événements avec Riak chez Booking.comStockage et analyse temps réel d'événements avec Riak chez Booking.com
Stockage et analyse temps réel d'événements avec Riak chez Booking.comDamien Krotkine
 
Introduction à Laravel 4 @Dogstudio
Introduction à Laravel 4 @DogstudioIntroduction à Laravel 4 @Dogstudio
Introduction à Laravel 4 @DogstudioNicolas Widart
 
Enib cours c.a.i. web - séance #5 : scala play! framework
Enib   cours c.a.i. web - séance #5 : scala play! frameworkEnib   cours c.a.i. web - séance #5 : scala play! framework
Enib cours c.a.i. web - séance #5 : scala play! frameworkHoracio Gonzalez
 
Paris stormusergroup intrudocution
Paris stormusergroup intrudocutionParis stormusergroup intrudocution
Paris stormusergroup intrudocutionParis_Storm_UG
 
Node.js, le pavé dans la mare
Node.js, le pavé dans la mareNode.js, le pavé dans la mare
Node.js, le pavé dans la mareValtech
 
Apache flink - prise en main rapide
Apache flink - prise en main rapideApache flink - prise en main rapide
Apache flink - prise en main rapideBilal Baltagi
 
Performance serveur et apache
Performance serveur et apachePerformance serveur et apache
Performance serveur et apacheafup Paris
 
Démo Gatling au Performance User Group de Casablanca - 25 sept 2014
Démo Gatling au Performance User Group de Casablanca - 25 sept 2014Démo Gatling au Performance User Group de Casablanca - 25 sept 2014
Démo Gatling au Performance User Group de Casablanca - 25 sept 2014Benoît de CHATEAUVIEUX
 
Présentation (brève) de scala
Présentation (brève) de scalaPrésentation (brève) de scala
Présentation (brève) de scalaclem_simon
 
CocoaHeads Rennes #16: OHHTTPStubs
CocoaHeads Rennes #16: OHHTTPStubsCocoaHeads Rennes #16: OHHTTPStubs
CocoaHeads Rennes #16: OHHTTPStubsCocoaHeadsRNS
 

La actualidad más candente (20)

Caching reboot: javax.cache & Ehcache 3
Caching reboot: javax.cache & Ehcache 3Caching reboot: javax.cache & Ehcache 3
Caching reboot: javax.cache & Ehcache 3
 
Nouveautés de java 8
Nouveautés de java 8Nouveautés de java 8
Nouveautés de java 8
 
APACHE TOMCAT
APACHE TOMCATAPACHE TOMCAT
APACHE TOMCAT
 
Introduction au langage Go
Introduction au langage GoIntroduction au langage Go
Introduction au langage Go
 
Laravel yet another framework
Laravel  yet another frameworkLaravel  yet another framework
Laravel yet another framework
 
Realtime Web avec Akka, Kafka, Spark et Mesos - Devoxx Paris 2014
Realtime Web avec Akka, Kafka, Spark et Mesos - Devoxx Paris 2014Realtime Web avec Akka, Kafka, Spark et Mesos - Devoxx Paris 2014
Realtime Web avec Akka, Kafka, Spark et Mesos - Devoxx Paris 2014
 
Stockage et analyse temps réel d'événements avec Riak chez Booking.com
Stockage et analyse temps réel d'événements avec Riak chez Booking.comStockage et analyse temps réel d'événements avec Riak chez Booking.com
Stockage et analyse temps réel d'événements avec Riak chez Booking.com
 
Introduction à Laravel 4 @Dogstudio
Introduction à Laravel 4 @DogstudioIntroduction à Laravel 4 @Dogstudio
Introduction à Laravel 4 @Dogstudio
 
WebSocket avec Java EE 7
WebSocket avec Java EE 7WebSocket avec Java EE 7
WebSocket avec Java EE 7
 
Enib cours c.a.i. web - séance #5 : scala play! framework
Enib   cours c.a.i. web - séance #5 : scala play! frameworkEnib   cours c.a.i. web - séance #5 : scala play! framework
Enib cours c.a.i. web - séance #5 : scala play! framework
 
JAVA8, créer votre future
JAVA8, créer votre futureJAVA8, créer votre future
JAVA8, créer votre future
 
Paris stormusergroup intrudocution
Paris stormusergroup intrudocutionParis stormusergroup intrudocution
Paris stormusergroup intrudocution
 
Python + ansible = ♥
Python + ansible = ♥Python + ansible = ♥
Python + ansible = ♥
 
Node.js, le pavé dans la mare
Node.js, le pavé dans la mareNode.js, le pavé dans la mare
Node.js, le pavé dans la mare
 
Apache flink - prise en main rapide
Apache flink - prise en main rapideApache flink - prise en main rapide
Apache flink - prise en main rapide
 
REX Storm Redis
REX Storm RedisREX Storm Redis
REX Storm Redis
 
Performance serveur et apache
Performance serveur et apachePerformance serveur et apache
Performance serveur et apache
 
Démo Gatling au Performance User Group de Casablanca - 25 sept 2014
Démo Gatling au Performance User Group de Casablanca - 25 sept 2014Démo Gatling au Performance User Group de Casablanca - 25 sept 2014
Démo Gatling au Performance User Group de Casablanca - 25 sept 2014
 
Présentation (brève) de scala
Présentation (brève) de scalaPrésentation (brève) de scala
Présentation (brève) de scala
 
CocoaHeads Rennes #16: OHHTTPStubs
CocoaHeads Rennes #16: OHHTTPStubsCocoaHeads Rennes #16: OHHTTPStubs
CocoaHeads Rennes #16: OHHTTPStubs
 

Destacado

PSUG #52 Dataflow and simplified reactive programming with Akka-streams
PSUG #52 Dataflow and simplified reactive programming with Akka-streamsPSUG #52 Dataflow and simplified reactive programming with Akka-streams
PSUG #52 Dataflow and simplified reactive programming with Akka-streamsStephane Manciot
 
Spark / Mesos Cluster Optimization
Spark / Mesos Cluster OptimizationSpark / Mesos Cluster Optimization
Spark / Mesos Cluster Optimizationebiznext
 
Machine Learning - Spark / MLlib
Machine Learning - Spark / MLlibMachine Learning - Spark / MLlib
Machine Learning - Spark / MLlibebiznext
 
Packaging et déploiement d'une application avec Docker et Ansible @DevoxxFR 2015
Packaging et déploiement d'une application avec Docker et Ansible @DevoxxFR 2015Packaging et déploiement d'une application avec Docker et Ansible @DevoxxFR 2015
Packaging et déploiement d'une application avec Docker et Ansible @DevoxxFR 2015Stephane Manciot
 
Des principes de la démarche DevOps à sa mise en oeuvre
Des principes de la démarche DevOps à sa mise en oeuvreDes principes de la démarche DevOps à sa mise en oeuvre
Des principes de la démarche DevOps à sa mise en oeuvreStephane Manciot
 
DevOps avec Ansible et Docker
DevOps avec Ansible et DockerDevOps avec Ansible et Docker
DevOps avec Ansible et DockerStephane Manciot
 
Machine learning
Machine learningMachine learning
Machine learningebiznext
 
De Maven à SBT ScalaIO 2013
De Maven à SBT ScalaIO 2013De Maven à SBT ScalaIO 2013
De Maven à SBT ScalaIO 2013Stephane Manciot
 
Scala io2013 : Our journey from UML/MDD to Scala macros
Scala io2013 : Our journey from UML/MDD to Scala macrosScala io2013 : Our journey from UML/MDD to Scala macros
Scala io2013 : Our journey from UML/MDD to Scala macrosebiznext
 
Les modèles NoSQL
Les modèles NoSQLLes modèles NoSQL
Les modèles NoSQLebiznext
 
Conflation Like chez Meetic par Arnaud Georgin (@arnaud_georgin - Meetic) et...
Conflation Like chez Meetic par Arnaud Georgin (@arnaud_georgin  - Meetic) et...Conflation Like chez Meetic par Arnaud Georgin (@arnaud_georgin  - Meetic) et...
Conflation Like chez Meetic par Arnaud Georgin (@arnaud_georgin - Meetic) et...Paris Scala User Group
 
Scala.io 2013 - M’enfin Scalac, où glandes-tu encore ?
Scala.io 2013 - M’enfin Scalac, où glandes-tu encore ?Scala.io 2013 - M’enfin Scalac, où glandes-tu encore ?
Scala.io 2013 - M’enfin Scalac, où glandes-tu encore ?RUDDER
 
11 tools for your PHP devops stack
11 tools for your PHP devops stack11 tools for your PHP devops stack
11 tools for your PHP devops stackKris Buytaert
 
CV - Vladimir Vyazmin - DevOps -2017
CV - Vladimir Vyazmin - DevOps -2017CV - Vladimir Vyazmin - DevOps -2017
CV - Vladimir Vyazmin - DevOps -2017kipialive
 
Cv ines ouaz
Cv ines ouazCv ines ouaz
Cv ines ouazInes Ouaz
 
DEVOPS - La synthèse
DEVOPS - La synthèseDEVOPS - La synthèse
DEVOPS - La synthèseCOMPETENSIS
 

Destacado (20)

PSUG #52 Dataflow and simplified reactive programming with Akka-streams
PSUG #52 Dataflow and simplified reactive programming with Akka-streamsPSUG #52 Dataflow and simplified reactive programming with Akka-streams
PSUG #52 Dataflow and simplified reactive programming with Akka-streams
 
Spark / Mesos Cluster Optimization
Spark / Mesos Cluster OptimizationSpark / Mesos Cluster Optimization
Spark / Mesos Cluster Optimization
 
Machine Learning - Spark / MLlib
Machine Learning - Spark / MLlibMachine Learning - Spark / MLlib
Machine Learning - Spark / MLlib
 
Packaging et déploiement d'une application avec Docker et Ansible @DevoxxFR 2015
Packaging et déploiement d'une application avec Docker et Ansible @DevoxxFR 2015Packaging et déploiement d'une application avec Docker et Ansible @DevoxxFR 2015
Packaging et déploiement d'une application avec Docker et Ansible @DevoxxFR 2015
 
Des principes de la démarche DevOps à sa mise en oeuvre
Des principes de la démarche DevOps à sa mise en oeuvreDes principes de la démarche DevOps à sa mise en oeuvre
Des principes de la démarche DevOps à sa mise en oeuvre
 
DevOps avec Ansible et Docker
DevOps avec Ansible et DockerDevOps avec Ansible et Docker
DevOps avec Ansible et Docker
 
Machine learning
Machine learningMachine learning
Machine learning
 
De Maven à SBT ScalaIO 2013
De Maven à SBT ScalaIO 2013De Maven à SBT ScalaIO 2013
De Maven à SBT ScalaIO 2013
 
Scala io2013 : Our journey from UML/MDD to Scala macros
Scala io2013 : Our journey from UML/MDD to Scala macrosScala io2013 : Our journey from UML/MDD to Scala macros
Scala io2013 : Our journey from UML/MDD to Scala macros
 
Les modèles NoSQL
Les modèles NoSQLLes modèles NoSQL
Les modèles NoSQL
 
Usine Logicielle 2013
Usine Logicielle 2013Usine Logicielle 2013
Usine Logicielle 2013
 
Play Live Coding
Play Live CodingPlay Live Coding
Play Live Coding
 
Event-sourcing avancé avec Scala
Event-sourcing avancé avec ScalaEvent-sourcing avancé avec Scala
Event-sourcing avancé avec Scala
 
Conflation Like chez Meetic par Arnaud Georgin (@arnaud_georgin - Meetic) et...
Conflation Like chez Meetic par Arnaud Georgin (@arnaud_georgin  - Meetic) et...Conflation Like chez Meetic par Arnaud Georgin (@arnaud_georgin  - Meetic) et...
Conflation Like chez Meetic par Arnaud Georgin (@arnaud_georgin - Meetic) et...
 
Scala.io 2013 - M’enfin Scalac, où glandes-tu encore ?
Scala.io 2013 - M’enfin Scalac, où glandes-tu encore ?Scala.io 2013 - M’enfin Scalac, où glandes-tu encore ?
Scala.io 2013 - M’enfin Scalac, où glandes-tu encore ?
 
Play with Elm!
Play with Elm!Play with Elm!
Play with Elm!
 
11 tools for your PHP devops stack
11 tools for your PHP devops stack11 tools for your PHP devops stack
11 tools for your PHP devops stack
 
CV - Vladimir Vyazmin - DevOps -2017
CV - Vladimir Vyazmin - DevOps -2017CV - Vladimir Vyazmin - DevOps -2017
CV - Vladimir Vyazmin - DevOps -2017
 
Cv ines ouaz
Cv ines ouazCv ines ouaz
Cv ines ouaz
 
DEVOPS - La synthèse
DEVOPS - La synthèseDEVOPS - La synthèse
DEVOPS - La synthèse
 

Similar a Paris Scala User Group #43 - Spray (Magnet Pattern) + RxScala / ElasticSearch

Présentation Javascript à l'ESI (Alger)
Présentation Javascript à l'ESI (Alger)Présentation Javascript à l'ESI (Alger)
Présentation Javascript à l'ESI (Alger)Dr Samir A. ROUABHI
 
Eric Moreau: AOP in .Net sing PostSharp
Eric Moreau: AOP in .Net sing PostSharpEric Moreau: AOP in .Net sing PostSharp
Eric Moreau: AOP in .Net sing PostSharpMSDEVMTL
 
Développer sereinement avec Node.js
Développer sereinement avec Node.jsDévelopper sereinement avec Node.js
Développer sereinement avec Node.jsJulien Giovaresco
 
Cassandra Java Driver : vers Cassandra 1.2 et au-delà
Cassandra Java Driver : vers Cassandra 1.2 et au-delàCassandra Java Driver : vers Cassandra 1.2 et au-delà
Cassandra Java Driver : vers Cassandra 1.2 et au-delàIppon
 
GWT : under the hood
GWT : under the hoodGWT : under the hood
GWT : under the hoodsvuillet
 
Présentation de WAMP.ws, le protocole pour faire du PUB/SUB et RPC over Webso...
Présentation de WAMP.ws, le protocole pour faire du PUB/SUB et RPC over Webso...Présentation de WAMP.ws, le protocole pour faire du PUB/SUB et RPC over Webso...
Présentation de WAMP.ws, le protocole pour faire du PUB/SUB et RPC over Webso...sametmax
 
Java Database Connectivity
Java Database ConnectivityJava Database Connectivity
Java Database ConnectivityKorteby Farouk
 
2013 01-08-php-maturite
2013 01-08-php-maturite2013 01-08-php-maturite
2013 01-08-php-maturiteRémi Alvado
 
Communications Réseaux et HTTP avec PHP
Communications Réseaux et HTTP avec PHPCommunications Réseaux et HTTP avec PHP
Communications Réseaux et HTTP avec PHPjulien pauli
 
Developpement web dynamique_Base de donnees.pdf
Developpement web dynamique_Base de donnees.pdfDeveloppement web dynamique_Base de donnees.pdf
Developpement web dynamique_Base de donnees.pdfrachidimstapha
 
Javascript ne se limite pas à jquery
Javascript ne se limite pas à jqueryJavascript ne se limite pas à jquery
Javascript ne se limite pas à jqueryneuros
 
Cours php -partie 1.pdf
Cours php -partie 1.pdfCours php -partie 1.pdf
Cours php -partie 1.pdfssuserc46a93
 
Cours Programmation web en PHP Cours Programmation web en PHP
Cours Programmation web en PHP Cours Programmation web en PHPCours Programmation web en PHP Cours Programmation web en PHP
Cours Programmation web en PHP Cours Programmation web en PHPBassim ELKHATTABY
 
Introduction à AngularJS
Introduction à AngularJSIntroduction à AngularJS
Introduction à AngularJSAbdoulaye Dieng
 
AMQP: interopérabilité et découplage de systèmes hétérogènes avec RabbitMQ
AMQP: interopérabilité et découplage de systèmes hétérogènes avec RabbitMQAMQP: interopérabilité et découplage de systèmes hétérogènes avec RabbitMQ
AMQP: interopérabilité et découplage de systèmes hétérogènes avec RabbitMQMicrosoft
 

Similar a Paris Scala User Group #43 - Spray (Magnet Pattern) + RxScala / ElasticSearch (20)

Présentation Javascript à l'ESI (Alger)
Présentation Javascript à l'ESI (Alger)Présentation Javascript à l'ESI (Alger)
Présentation Javascript à l'ESI (Alger)
 
Vert.x 3
Vert.x 3Vert.x 3
Vert.x 3
 
Eric Moreau: AOP in .Net sing PostSharp
Eric Moreau: AOP in .Net sing PostSharpEric Moreau: AOP in .Net sing PostSharp
Eric Moreau: AOP in .Net sing PostSharp
 
Le Réseau et Java
Le Réseau et JavaLe Réseau et Java
Le Réseau et Java
 
Cours php
Cours phpCours php
Cours php
 
Développer sereinement avec Node.js
Développer sereinement avec Node.jsDévelopper sereinement avec Node.js
Développer sereinement avec Node.js
 
Cassandra Java Driver : vers Cassandra 1.2 et au-delà
Cassandra Java Driver : vers Cassandra 1.2 et au-delàCassandra Java Driver : vers Cassandra 1.2 et au-delà
Cassandra Java Driver : vers Cassandra 1.2 et au-delà
 
GWT : under the hood
GWT : under the hoodGWT : under the hood
GWT : under the hood
 
Présentation de WAMP.ws, le protocole pour faire du PUB/SUB et RPC over Webso...
Présentation de WAMP.ws, le protocole pour faire du PUB/SUB et RPC over Webso...Présentation de WAMP.ws, le protocole pour faire du PUB/SUB et RPC over Webso...
Présentation de WAMP.ws, le protocole pour faire du PUB/SUB et RPC over Webso...
 
Atelier gwt
Atelier gwtAtelier gwt
Atelier gwt
 
Les Servlets et JSP
Les Servlets et JSPLes Servlets et JSP
Les Servlets et JSP
 
Java Database Connectivity
Java Database ConnectivityJava Database Connectivity
Java Database Connectivity
 
2013 01-08-php-maturite
2013 01-08-php-maturite2013 01-08-php-maturite
2013 01-08-php-maturite
 
Communications Réseaux et HTTP avec PHP
Communications Réseaux et HTTP avec PHPCommunications Réseaux et HTTP avec PHP
Communications Réseaux et HTTP avec PHP
 
Developpement web dynamique_Base de donnees.pdf
Developpement web dynamique_Base de donnees.pdfDeveloppement web dynamique_Base de donnees.pdf
Developpement web dynamique_Base de donnees.pdf
 
Javascript ne se limite pas à jquery
Javascript ne se limite pas à jqueryJavascript ne se limite pas à jquery
Javascript ne se limite pas à jquery
 
Cours php -partie 1.pdf
Cours php -partie 1.pdfCours php -partie 1.pdf
Cours php -partie 1.pdf
 
Cours Programmation web en PHP Cours Programmation web en PHP
Cours Programmation web en PHP Cours Programmation web en PHPCours Programmation web en PHP Cours Programmation web en PHP
Cours Programmation web en PHP Cours Programmation web en PHP
 
Introduction à AngularJS
Introduction à AngularJSIntroduction à AngularJS
Introduction à AngularJS
 
AMQP: interopérabilité et découplage de systèmes hétérogènes avec RabbitMQ
AMQP: interopérabilité et découplage de systèmes hétérogènes avec RabbitMQAMQP: interopérabilité et découplage de systèmes hétérogènes avec RabbitMQ
AMQP: interopérabilité et découplage de systèmes hétérogènes avec RabbitMQ
 

Paris Scala User Group #43 - Spray (Magnet Pattern) + RxScala / ElasticSearch

  • 1. Spray / RxScala / ElasticSearch Paris  Scala  User  Group  #43   ! ! ! !
  • 2. Email:                mourad.dachraoui@ebiznext.com   TwiAer:          @ze_dach Mourad  DACHRAOUI
  • 6. Ensemble  de             bibliothèques    pour     la  construc>on   d’API  RESTful  basé   sur  Akka
  • 14.
  • 17.
  • 18. ObjecLf:       • DSL  composé  de  la  foncLon  host   • Masquer  la  complexité  de  host    
  • 19. ObjecLf:       • DSL  composé  de  la  foncLon  host   • Masquer  la  complexité  de  host     Notre  méthode  host  prend  comme   paramètre  plusieurs  types  en  entré.
  • 20. ObjecLf:       • DSL  composé  de  la  foncLon  host   • Masquer  la  complexité  de  host     Notre  méthode  host  prend  comme  paramètre   en  entrée  plusieurs  types  en  entré. Il  faut  le  converLr  implicitement   en  Int  (logique  applicaLve  pour   notre  exemple)   =>  l'evidence  ev
  • 21. ObjecLf:       • DSL  composé  de  la  foncLon  host   • Masquer  la  complexité  de  host     Notre  méthode  host  prend  comme  paramètre   en  entrée  plusieurs  types  en  entré. Il  faut  le  converLr  implicitement   en  Int  (logique  applicaLve  pour   notre  exemple)   =>  l'evidence  ev
  • 22. ObjecLf:       • DSL  composé  de  la  foncLon  host   • Masquer  la  complexité  de  host     Notre  méthode  host  prend  comme  paramètre   en  entrée  plusieurs  types  en  entré. Il  faut  le  converLr  implicitement   en  Int  (logique  applicaLve  pour   notre  exemple)   =>  l'evidence  ev
  • 23. ! <console>:24:  error:  type  mismatch;    found      :  SprayTestsNoMagnet.Route    required:  String  =>  Int                        new  Route  {}                        ^
  • 24. ! <console>:24:  error:  type  mismatch;    found      :  SprayTestsNoMagnet.Route    required:  String  =>  Int                        new  Route  {}                        ^
  • 25. val  route  =  host("SprayTestsNoMagnet")  (  new  Route  {}  )   =
  • 26. val  route  =  host("SprayTestsNoMagnet")  (  new  Route  {}  )   = Solu>on  =>  Appel  intermédiaire
  • 27.
  • 28. scala>  import  SprayTestsNoMagnet._   import  SprayTestsNoMagnet._   ! scala>  tmpHost   res1:  SprayTestsNoMagnet.Route  =>  SprayTestsNoMagnet.Route  =  <funcLon1>   ! tmpHost  (new  Route  {})   res2:  SprayTestsNoMagnet.Route  =  $anon$1@6f5c0b7b   ! host("SprayTestsNoMagnet")  (stringToInt)  (new  Route  {})   res4:  SprayTestsNoMagnet.Route  =  $anon$1@521352d8
  • 29. Nous  ne  pouvons  pas  nous   contenter  de  ce/e  solu1on  si  nous   é1ons  entrain  d'écrire  un  DSL
  • 30. ==>  Magnet  «  paMern  »  qui  résout   entre  autre  ceMe  probléma>que Nous  ne  pouvons  pas  nous   contenter  de  ce/e  solu1on  si  nous   é1ons  entrain  d'écrire  un  DSL
  • 31.
  • 32. //  Notre  nouveau  Type  HostMagnet  est  bien  sensé  renvoyer  la  même  foncLon  Route  =>  Route
  • 33. //  Notre  nouveau  Type  HostMagnet  est  bien  sensé  renvoyer  la  même  foncLon  Route  =>  Route //  Le  premier  implicit  est  une  conversion  implicite  qui  nous  permet  d'obtenir   //  une  instance  HostMagnet  à  parLr  d'une  string  ,  en  l'occurrence  "mogobiz.io"
  • 34. //  Notre  nouveau  Type  HostMagnet  est  bien  sensé  renvoyer  la  même  foncLon  Route  =>  Route //  Le  premier  implicit  est  une  conversion  implicite  qui  nous  permet  d'obtenir   //  une  instance  HostMagnet  à  parLr  d'une  string  ,  en  l'occurrence  "mogobiz.io"  //  host  prend  un  paramètre  de  type  HostMagnet    //  et  retourne  une  instance  de  HostMagnet //  magnet.apply()
  • 35. scala>  import  SprayTestsWithMagnet._   import  SprayTestsWithMagnet._   ! scala>  val  route  =  host("mogobiz.io")  {            |    new  Route  {}            |      }   route:  SprayTestsWithMagnet.Route  =  $anon$1@51f347a   ! scala>  val  x  =    host("mogobiz.io")   x:  SprayTestsWithMagnet.Route  =>  SprayTestsWithMagnet.Route  =   <function1>
  • 36. • Finaliser  une  requête  HTTP   • DSL  ==>  «  complete  »   • Plusieurs  manière  de  finaliser  une  requête   HTTP  ==>  Surcharger  «  complete  » Type  erasure LimitaLon  pour  les  types  paramètrés  
  • 37.
  • 38. Nice,  but   show  me… …  some  Magnet  PaMern  in  Spray-­‐rou>ng  
  • 39.
  • 40. CeAe  direcLve  est  uLlisée  au  sein   d'une  val  route  qui  est  de  Type   Route  (spray-­‐rouLng).
  • 41. CeAe  direcLve  est  uLlisée  au  sein   d'une  val  route  qui  est  de  Type   Route  (spray-­‐rouLng). ?
  • 42. pathPrefix  est  une  foncLon  qui  prend  en  paramètre  un   PathMatcher  et  qui  nous  renvoi  un  objet  de  type  Directive.     ! (cf.    spray-­‐rouLng/src/main/scala/spray/rouLng/direcLves/PathDirecLves.scala)
  • 43. pathPrefix  est  une  foncLon  qui  prend  en  paramètre  un   PathMatcher  et  qui  nous  renvoi  un  objet  de  type  Directive.     ! (cf.    spray-­‐rouLng/src/main/scala/spray/rouLng/direcLves/PathDirecLves.scala) PathMatcher  défini  un  implicite  qui  converL  un  String  en   PathMatcher  (conversion  d’  "acount"  en  une  instance  de   PathMatcher)   (cf.    spray-­‐rouLng/src/main/scala/spray/rouLng/PathMatcher.scala)
  • 44. pathPrefix  est  une  direcLve,   qui  prend  en  paramètre  une  closure   de  type  Route,   Et  retourne  une  Route.
  • 45. pathPrefix  est  une  direcLve,   qui  prend  en  paramètre  une  closure   de  type  Route,   Et  retourne  une  Route. ==>  Conver1r  implicitement  la   Directive  en  une  fonc1on  qui   prend  un  paramètre  de  type  Route   et  renvoi  un  résultat  de  Type   Route    (Route  =>  Route)
  • 46. (cf.  spray-­‐rouLng/src/main/scala/spray/rouLng/DirecLve.scala) Il  prend  en  paramètre  une  DirecLve  ET  un  Converter  en  implicite.   ! L’  ApplyConverter  en  implicite  est  un  type  paramétré,  donc  il  dépend   du  type  de  DirecLve  en  entré.  
  • 47. (cf.  spray-­‐rouLng/src/main/scala/spray/rouLng/DirecLve.scala) (cf.  spray-­‐rouLng/src/main/scala/spray/rouLng/ApplyConverter.scala) l'ApplyConverter  est  l'équivalent  de  notre   évidence  de  l'exemple  précédant  qui  va   converLr  la  DirecLve[L]  en  Route
  • 48. (cf.  spray-­‐rouLng/src/main/scala/spray/rouLng/DirecLve.scala) (cf.  spray-­‐rouLng/src/main/scala/spray/rouLng/ApplyConverter.scala) ApplyConverter  va  renvoyer  un  In  qui  est  en  fait  une  Route.  Le   pimpApply  renvoi  une  foncLon  hac.In  =>  Route     ! =>  Nous  avons  donc  notre  Type  de  retour  Route  =>  Route
  • 49. • Notre  Objet  Magnet  est  la  Directive   • pathPrefix  est  exécuté  une  seule  fois;  lors  du  chargement  de   l'applicaLon  (Spray)  transformé  en  Directive   • La  Directive  est  transformée  en  une  foncLon  qui  prend  en   paramètre;  la  Route  entre  accolade   • Tout  ce  qui  produit  une  Directive  est  exécuté  au  chargement  de   spray  (get,  path,  pathPrefix,  completed,  )   • Spray  va  stocker  ceAe  informaLon  et  ne  va  pas  l'évaluer  à  chaque  fois.     • Par  contre,  les  définiLons  des  closures  seront  chargés  mais  non   exécuté.  
  • 52.
  • 53. spray-client • non  adapté  dans  certain  cas  d’uLlisaLon  (Mogobiz)   • Appel  de  plusieurs  Index  ElasLcSearch  en  parallèle     • Appliquer  des  traitement  (Suppression  des  langues,   calcul  du  prix)   • ComposiLon  +  dépendance    des  Futures   ==>  Complexité  d’implémentaLon     ==>  Nous  perdons  la  simplicité  du  DSL  spray-­‐client  
  • 54. RxJava • ImplémentaLon  par  Nexlix   du  Projet  Rx  (ReacLve   Extensions)  hAp:// codeplex.com/  de  Microsoy     • Bibliothèque  permeAant  de   composer  des  programmes   événemen>els  asynchrone,   via  l’uLlisaLon  de  séquences   observables.
  • 56. Resources • Ben  Christensen.  “FuncLonal  ReacLve  Programming   in  the  Nexlix  API.”  hAp://fr.slideshare.net/InfoQ/ funcLonal-­‐reacLve-­‐programming-­‐in-­‐the-­‐nexlix-­‐api     • Mathias  Doenitz.  “Spray:  REST  on  Akka  (Scala   Days).”  hAp://fr.slideshare.net/sirthias/spray-­‐rest-­‐ on-­‐akka-­‐12616908     • “Spray  |  Blog »  The  Magnet  PaAern.”  hAp://spray.io/ blog/2012-­‐12-­‐13-­‐the-­‐magnet-­‐paAern/  
  • 57. Resources • “Spray  |  DocumentaLon.”  hAp://spray.io/ documentaLon/     • “Implicit  Parameters  -­‐  Scala  DocumentaLon.”   hAp://docs.scala-­‐lang.org/tutorials/tour/ implicit-­‐parameters.html     • “Scala  IO  2013  =>  Spray :  REST  on  Akka  -­‐   Blog.roddet.com.”  hAp://blog.roddet.com/ 2013/10/scalaio-­‐2013-­‐spray-­‐rest-­‐on-­‐akka/
  • 58. Medias • “Sciences  Naturelles:  Horseshoe-­‐Magnet-­‐Red-­‐Silver-­‐Iron-­‐ Filings-­‐Highres-­‐.”hAp://mirror-­‐us-­‐ga1.gallery.hd.org/_c/ natural-­‐science/_more2008/_more12/horseshoe-­‐ magnet-­‐red-­‐silver-­‐iron-­‐filings-­‐highres-­‐AHD.jpg.html     • “Willy  Wonka”  hAp://memegenerator.net/Willywonka/ capLon     • “API  Safe  and  Easy  Aquarium  Spray”  hAp:// www.amazon.com/API-­‐Safe-­‐Aquarium-­‐Spray-­‐8-­‐Ounce/ dp/B001D728VI
  • 59. Merci
  • 60. Q&A