60
Spray / RxScala / ElasticSearch Paris Scala User Group #43

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

Embed Size (px)

DESCRIPTION

Retour d'experience sur l'utilisation de spray dans le cadre de Mogobiz. Explication de la technique du "Magnet Pattern" et présentation des bénéfices de l'utilisation de Rx. http://j.mp/psug43Xebia

Citation preview

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

Spray / RxScala / ElasticSearch

Paris  Scala  User  Group  #43  !!!!

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

Email:                [email protected]  

TwiAer:          @ze_dach

Mourad  DACHRAOUI

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

Contexte

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

Mogobiz

http://www.jahia.com/home/products/ecommerce-factory.html

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

SPRAY ?

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

Ensemble  de            bibliothèques    pour    la  construc>on  

d’API  RESTful  basé  sur  Akka

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

spray-http

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

spray-can

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

IO STACK

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

spray-routing

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

spray-routing

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

spray-routing

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

spray-routing

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

hAp://spray.io/blog/2012-­‐12-­‐13-­‐the-­‐magnet-­‐paAern  

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

Place au code

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

ObjecLf:      • DSL  composé  de  la  foncLon  host  • Masquer  la  complexité  de  host    

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

ObjecLf:      • DSL  composé  de  la  foncLon  host  • Masquer  la  complexité  de  host    

Notre  méthode  host  prend  comme  

paramètre  plusieurs  types  en  entré.

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

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

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

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

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

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

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

!<console>:24:  error:  type  mismatch;    found      :  SprayTestsNoMagnet.Route    required:  String  =>  Int                        new  Route  {}                        ^

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

!<console>:24:  error:  type  mismatch;    found      :  SprayTestsNoMagnet.Route    required:  String  =>  Int                        new  Route  {}                        ^

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

val  route  =  host("SprayTestsNoMagnet")  (  new  Route  {}  )  =

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

val  route  =  host("SprayTestsNoMagnet")  (  new  Route  {}  )  =

Solu>on  =>  Appel  intermédiaire

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

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

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

Nous  ne  pouvons  pas  nous  contenter  de  ce/e  solu1on  si  nous  é1ons  entrain  d'écrire  un  DSL

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

==>  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

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

//  Notre  nouveau  Type  HostMagnet  est  bien  sensé  renvoyer  la  même  foncLon  Route  =>  Route

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

//  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"

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

//  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()

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

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>

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

• 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  

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

Nice,  but  show  me…

…  some  Magnet  PaMern  in  Spray-­‐rou>ng  

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

CeAe  direcLve  est  uLlisée  au  sein  d'une  val  route  qui  est  de  Type  Route  (spray-­‐rouLng).

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

CeAe  direcLve  est  uLlisée  au  sein  d'une  val  route  qui  est  de  Type  Route  (spray-­‐rouLng).

?

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

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)

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

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)

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

pathPrefix  est  une  direcLve,  qui  prend  en  paramètre  une  closure  de  type  Route,  Et  retourne  une  Route.

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

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)

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

(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é.  

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

(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

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

(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

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

• 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é.  

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

RxJava-Sclala

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

spray-client

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

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  

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

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.

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

RxJava

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

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/  

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

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/

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

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

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

Merci

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

Q&A