Mathieu ANCELIN 
Alexandre DELEGUE
Mathieu ANCELIN 
• Développeur @SERLI 
• Scala, Java, web & OSS 
• ReactiveCouchbase, Weld-OSGi, Weld, etc ... 
• Poitou-C...
Alexandre DELEGUE 
• Développeur @ SERLI 
• Java 
• Scala 
• Web 
• spring, play, … 
• @chanksleroux
SERLI 
• Société de conseil et d’ingénierie du SI 
• 75 personnes 
• 80% de business Java 
• Contribution à des projets OS...
Les technologies présentées sont inspirées de 
technologies réelles! 
Les applications qui en découlent sont fictives! 
To...
ALEX
www.amazing.com
Mobile infrastructure
Mobile infrastructure 
Raspberry pi 
x 7 
Routeur wifi 
Switch
Demo
Résister à la charge
Résister aux pannes
Absorber une hausse de trafic
Approche classique
Monolithique 
bouquetin 
faisan 
hornbill 
???
Latence
Bloquant
Charge
Scalabilité
Reactive Manifesto
Reactive Manifesto
Reactive manifesto 
• react to event : the event-driven nature enables the following 
qualities 
• react to load : focus o...
Scalable / React to load
Overview 
Frontend 
Cart 
Identity 
Backend
Datas
Mini / Micro Services 
• Une application par domaine fonctionnel 
• store-frontend : présentation du contenu 
• store-iden...
Stateless 
• Chaque application est stateless 
• aucune donnée n’est stockée dans l’application (pas de cache, pas de 
fic...
Frontend 
}- 100 % html 
- Indexation par les 
moteurs de recherche 
- stateless 
- une url == un contenu
Limiter la charge
Cache 
Frontend 
Cache 
Browser 
CDN 
nginx/http 
varnish
Optimisations 
Base de données ? 
Cache 
+ 
recherche full text
Modèle de données 
{ 
id: "04abe480-2521-11e4-acde-f7b0d99b8321", 
label: "Product number 1", 
description: "A description...
Recherche 
GET /products?q=some%20text Frontend Search 
some text 
- Concat fragments 
- Include into main 
template
Créer / mettre à jour 
UpdateProduct ProductUpdated Frontend EventSource 
Backend 
ProductUpdated
Resilient / react to failure
Infrastructure 
Frontend 
Identity Identity 
Backend 
Cart 
Frontend 
Cart 
Backend 
Identity
Infrastructure 
Frontend 
Identity Identity 
Backend 
Cart 
Frontend 
Cart 
Backend 
Identity
Infrastructure 
Frontend 
Identity Identity 
Backend 
Cart 
Frontend 
Cart 
Backend 
Identity
Infrastructure 
Frontend 
Identity Identity 
Backend 
Cart 
Frontend 
Cart 
Backend 
Identity
Demo 
! 
Let It Crash !!!
Event-driven / react to event
Akka 
• Akka 
• Modèle acteur 
• Un acteur = Une entité statefull 
• Communication entre acteurs par messages (même à dist...
Akka 
Actor 
Actor 
Fils Actor 
Fils messages Actor 
Actor 
Actor 
Fils 
Fils 
Fils 
Actor 
Fils 
Server 1 
Server 2 
mess...
Akka messages 
import akka.actor.{Props, ActorSystem, ActorLogging, Actor} 
case class Greeting(who: String) 
class Greeti...
Play 2 
• Framework web 
• java or scala 
• Support pour les websocket et le server sent event 
• Asynchrone 
• pré-requis...
Play async 
case class ListProductsQuery() 
class ProductView extends Actor { 
override def receive: Receive = { 
case Lis...
Messages 
Frontend 
Cart 
Identity 
Backend 
CheckAuth 
UpdateProduct 
OrderCart 
ProductUpdated 
AddProductToCart 
Produc...
Cluster 
• Utilisation de Akka-cluster 
• Librairie permettant de former un cluster de systèmes d’acteurs 
• simple servic...
Cluster services 
• Librairie de découverte de services distribués 
• Exposition descripteurs de services (URL, protocole,...
Cluster services 
Client 
spécifique 
Client 
Générique Monitoring 
Load balancer 
+ 
retry 
Service 
instance 1 
Service ...
Cluster services 
Client 
spécifique 
Client 
Générique Monitoring 
Load balancer 
+ 
retry 
Service 
instance 1 
Service ...
Cluster services 
Client 
spécifique 
Client 
Générique Monitoring 
Load balancer 
+ 
retry 
Service 
instance 1 
Service ...
CQRS & EventSourcing 
• Command Query Responsibility Segregation 
• Command : Enregistrement 
• Query : Lecture 
• 2 modèl...
Persistence 
command event event event 
Event source Journal 
processor 
View 1 
View 2 
View 3
Exemple 
AddProductToCart 
ProductAddedToCart ProductAddedToCart ProductAddedToCart 
Journal 
WebSocket 
Actor 
Products 
...
Responsive
Frontend réactif
Demo 
! 
Realtime web!
Et les perfs dans tout ca ?
Les chiffres 
367 998 456 756
Les chiffres 
367 998 456 756 €
200 clients
400 clients
Metrics everywhere !!!
Les problèmes 
rencontrés
Nginx / mongo …
Cassandra
Bench web socket
Configuration akka-cluster
Conclusion
scala
This is the end ...
I don't always write reactive application but when I do, it run on raspberry pi
I don't always write reactive application but when I do, it run on raspberry pi
I don't always write reactive application but when I do, it run on raspberry pi
I don't always write reactive application but when I do, it run on raspberry pi
I don't always write reactive application but when I do, it run on raspberry pi
I don't always write reactive application but when I do, it run on raspberry pi
Prochain SlideShare
Chargement dans…5
×

I don't always write reactive application but when I do, it run on raspberry pi

805 vues

Publié le

This talk show how we made a reactive application on thta run on raspberry pi.

Publié dans : Périphériques & matériel
0 commentaire
0 j’aime
Statistiques
Remarques
  • Soyez le premier à commenter

  • Soyez le premier à aimer ceci

Aucun téléchargement
Vues
Nombre de vues
805
Sur SlideShare
0
Issues des intégrations
0
Intégrations
3
Actions
Partages
0
Téléchargements
8
Commentaires
0
J’aime
0
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive

I don't always write reactive application but when I do, it run on raspberry pi

  1. 1. Mathieu ANCELIN Alexandre DELEGUE
  2. 2. Mathieu ANCELIN • Développeur @SERLI • Scala, Java, web & OSS • ReactiveCouchbase, Weld-OSGi, Weld, etc ... • Poitou-Charentes JUG • Membre de l’expert group CDI 1.1 (JSR-346) • Membre de l’expert group OSGi Enterprise • @TrevorReznik
  3. 3. Alexandre DELEGUE • Développeur @ SERLI • Java • Scala • Web • spring, play, … • @chanksleroux
  4. 4. SERLI • Société de conseil et d’ingénierie du SI • 75 personnes • 80% de business Java • Contribution à des projets OSS • 10% de la force de travail sur l’OSS • Membre de l’EG JSR-346 • Membre de l’OSGi Alliance • www.serli.com @SerliFr
  5. 5. Les technologies présentées sont inspirées de technologies réelles! Les applications qui en découlent sont fictives! Toute ressemblance avec des applications existantes n’est que fortuite!
  6. 6. ALEX
  7. 7. www.amazing.com
  8. 8. Mobile infrastructure
  9. 9. Mobile infrastructure Raspberry pi x 7 Routeur wifi Switch
  10. 10. Demo
  11. 11. Résister à la charge
  12. 12. Résister aux pannes
  13. 13. Absorber une hausse de trafic
  14. 14. Approche classique
  15. 15. Monolithique bouquetin faisan hornbill ???
  16. 16. Latence
  17. 17. Bloquant
  18. 18. Charge
  19. 19. Scalabilité
  20. 20. Reactive Manifesto
  21. 21. Reactive Manifesto
  22. 22. Reactive manifesto • react to event : the event-driven nature enables the following qualities • react to load : focus on scalability by avoiding contention on shared resources • react to failure : build resilient systems with the ability to recover at all levels • react to user : honor response time guarantees regardless of load
  23. 23. Scalable / React to load
  24. 24. Overview Frontend Cart Identity Backend
  25. 25. Datas
  26. 26. Mini / Micro Services • Une application par domaine fonctionnel • store-frontend : présentation du contenu • store-identity : authentification / gestion de compte • store-cart : panier • store-backend : administration du site
  27. 27. Stateless • Chaque application est stateless • aucune donnée n’est stockée dans l’application (pas de cache, pas de fichier …) • Chaque application peut être clonée Session
  28. 28. Frontend }- 100 % html - Indexation par les moteurs de recherche - stateless - une url == un contenu
  29. 29. Limiter la charge
  30. 30. Cache Frontend Cache Browser CDN nginx/http varnish
  31. 31. Optimisations Base de données ? Cache + recherche full text
  32. 32. Modèle de données { id: "04abe480-2521-11e4-acde-f7b0d99b8321", label: "Product number 1", description: "A description …", image: "image.jpeg", price: 1.5, fragments: [{ type: "search", html: " <div >...</div>" },{ type: "cart", html: " <tr >...</tr>" } ] } }} Données indexées pour la recherche HTML pré-généré
  33. 33. Recherche GET /products?q=some%20text Frontend Search some text - Concat fragments - Include into main template
  34. 34. Créer / mettre à jour UpdateProduct ProductUpdated Frontend EventSource Backend ProductUpdated
  35. 35. Resilient / react to failure
  36. 36. Infrastructure Frontend Identity Identity Backend Cart Frontend Cart Backend Identity
  37. 37. Infrastructure Frontend Identity Identity Backend Cart Frontend Cart Backend Identity
  38. 38. Infrastructure Frontend Identity Identity Backend Cart Frontend Cart Backend Identity
  39. 39. Infrastructure Frontend Identity Identity Backend Cart Frontend Cart Backend Identity
  40. 40. Demo ! Let It Crash !!!
  41. 41. Event-driven / react to event
  42. 42. Akka • Akka • Modèle acteur • Un acteur = Une entité statefull • Communication entre acteurs par messages (même à distance) • Un acteur peut créer/détruire des enfants • Un acteur peut surveiller d’autres acteurs • Plus de problèmes de concurrence, asynchrone par nature • Résistant aux pannes • Java or Scala
  43. 43. Akka Actor Actor Fils Actor Fils messages Actor Actor Actor Fils Fils Fils Actor Fils Server 1 Server 2 messages
  44. 44. Akka messages import akka.actor.{Props, ActorSystem, ActorLogging, Actor} case class Greeting(who: String) class GreetingActor extends Actor with ActorLogging { def receive = { case Greeting(who) ⇒ log.info("Hello " + who) } } val system = ActorSystem("MySystem") val greeter = system.actorOf(Props[GreetingActor], name = "greeter") greeter ! Greeting("Charlie Parker")
  45. 45. Play 2 • Framework web • java or scala • Support pour les websocket et le server sent event • Asynchrone • pré-requis pour une application orientée événements
  46. 46. Play async case class ListProductsQuery() class ProductView extends Actor { override def receive: Receive = { case ListProductsQuery() => models.Product.list() pipeTo sender() } } ! class ProductsController extends Controller { private def listProducts(): Future[List[models.Product]] = { (Actors.productView() ? ListProductsQuery()).mapTo[List[models.Product]] } def index() = Action.async { listProducts().map(products => Ok(views.html.index(products))) } }
  47. 47. Messages Frontend Cart Identity Backend CheckAuth UpdateProduct OrderCart ProductUpdated AddProductToCart ProductAddedToCart WebSocket Messages Akka Server sent event
  48. 48. Cluster • Utilisation de Akka-cluster • Librairie permettant de former un cluster de systèmes d’acteurs • simple service d’adhésion • tolérant aux pannes • décentralisé (P2P, gossip) • pas de SPOF • pas de SPOB • détection des pannes
  49. 49. Cluster services • Librairie de découverte de services distribués • Exposition descripteurs de services (URL, protocole, version, nom) • Repose sur les memberships du cluster Akka • Clients de services • HTTP, Akka, Thrift, Memcached … • Petits plus • Monitoring • Load balancing (pas très intelligent) • Retry with exponential back off
  50. 50. Cluster services Client spécifique Client Générique Monitoring Load balancer + retry Service instance 1 Service instance 1 Service instance 1
  51. 51. Cluster services Client spécifique Client Générique Monitoring Load balancer + retry Service instance 1 Service instance 1 Service instance 1
  52. 52. Cluster services Client spécifique Client Générique Monitoring Load balancer + retry Service instance 1 Service instance 1 Service instance 1
  53. 53. CQRS & EventSourcing • Command Query Responsibility Segregation • Command : Enregistrement • Query : Lecture • 2 modèles distincts • Séparation des services • Event sourcing • Stockage des événements
  54. 54. Persistence command event event event Event source Journal processor View 1 View 2 View 3
  55. 55. Exemple AddProductToCart ProductAddedToCart ProductAddedToCart ProductAddedToCart Journal WebSocket Actor Products Views Products Processor
  56. 56. Responsive
  57. 57. Frontend réactif
  58. 58. Demo ! Realtime web!
  59. 59. Et les perfs dans tout ca ?
  60. 60. Les chiffres 367 998 456 756
  61. 61. Les chiffres 367 998 456 756 €
  62. 62. 200 clients
  63. 63. 400 clients
  64. 64. Metrics everywhere !!!
  65. 65. Les problèmes rencontrés
  66. 66. Nginx / mongo …
  67. 67. Cassandra
  68. 68. Bench web socket
  69. 69. Configuration akka-cluster
  70. 70. Conclusion
  71. 71. scala
  72. 72. This is the end ...

×