paris scala user group #43 - spray (magnet pattern) + rxscala / elasticsearch

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

Upload: mourad-dachraoui

Post on 30-Jun-2015

2.063 views

Category:

Technology


4 download

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

TRANSCRIPT

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