Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Architecture CQRS et performance avec Django

Architecture CQRS et performance avec Django

Concilier performance et consistence des données dans une application web n'est pas une tache aisée, les solutions NoSQL sont présentées comme la martingale pour gérer la forte charge/grosse volumétrie. Seulement, on perd plus qu'un paradigme à abandonner les bases de données relationnelles. Cette présentation va montrer comment implémenter une archi CQRS avec Django via l'exemple APPARTINFO.com.

Def754b0d38c0f7e7a282c47ac6ce85e?s=128

Olivier Girardot

September 16, 2012
Tweet

More Decks by Olivier Girardot

Other Decks in Programming

Transcript

  1. J’adore cet appartement ! Immeuble bruyant Quartier génial Copropriété agréable

    Ca craint le soir ! Super gardien Architecture CQRS et performance avec Django samedi 15 septembre 2012
  2. Plan I. Présentation II. APPARTINFO : Problèmes et Solutions III.

    CQRS IV. CQRS avec Django sur APPARTINFO ? V. Conclusion samedi 15 septembre 2012
  3. J’adore cet appartement ! Immeuble bruyant Quartier génial Copropriété agréable

    Ca craint le soir ! Super gardien Présentation samedi 15 septembre 2012
  4. Présentation samedi 15 septembre 2012

  5. Présentation Olivier Girardot @ogirardot samedi 15 septembre 2012

  6. Présentation • Centralien de Nantes (2009) : Informatique et Finance

    Olivier Girardot @ogirardot samedi 15 septembre 2012
  7. Présentation • Centralien de Nantes (2009) : Informatique et Finance

    • Développeur Java/Scala/ Python Olivier Girardot @ogirardot samedi 15 septembre 2012
  8. Présentation • Centralien de Nantes (2009) : Informatique et Finance

    • Développeur Java/Scala/ Python • 2 ans en Finance de Marché au Luxembourg et en France Olivier Girardot @ogirardot samedi 15 septembre 2012
  9. Présentation • Centralien de Nantes (2009) : Informatique et Finance

    • Développeur Java/Scala/ Python • 2 ans en Finance de Marché au Luxembourg et en France Olivier Girardot @ogirardot samedi 15 septembre 2012
  10. Présentation • Centralien de Nantes (2009) : Informatique et Finance

    • Développeur Java/Scala/ Python • 2 ans en Finance de Marché au Luxembourg et en France Olivier Girardot @ogirardot samedi 15 septembre 2012
  11. Retour dʼexpérience : APPARTINFO samedi 15 septembre 2012

  12. Retour dʼexpérience : APPARTINFO Premier portail dʼavis dʼhabitants sur immeubles

    et quartiers en France. Une fiche dʼidentité unique pour chaque adresse, qui rassemble : samedi 15 septembre 2012
  13. Retour dʼexpérience : APPARTINFO Premier portail dʼavis dʼhabitants sur immeubles

    et quartiers en France. Une fiche dʼidentité unique pour chaque adresse, qui rassemble : • Les avis des habitants (locataires ou propriétaires, actuels ou anciens) samedi 15 septembre 2012
  14. Retour dʼexpérience : APPARTINFO Premier portail dʼavis dʼhabitants sur immeubles

    et quartiers en France. Une fiche dʼidentité unique pour chaque adresse, qui rassemble : • Les avis des habitants (locataires ou propriétaires, actuels ou anciens) • Des informations de proximité Transports, POIs (parcs, écoles, ...), risques naturels, antennes-relais, ... samedi 15 septembre 2012
  15. En Image samedi 15 septembre 2012

  16. En Image samedi 15 septembre 2012

  17. Sur une adresse samedi 15 septembre 2012

  18. Sur une adresse samedi 15 septembre 2012

  19. Les points dʼintérêts samedi 15 septembre 2012

  20. Les points dʼintérêts samedi 15 septembre 2012

  21. Les points dʼintérêts samedi 15 septembre 2012

  22. Les points dʼintérêts samedi 15 septembre 2012

  23. Avis à proximité samedi 15 septembre 2012

  24. Problématiques dʼAPPARTINFO samedi 15 septembre 2012

  25. Problématiques dʼAPPARTINFO • Pour chaque adresse de France : samedi

    15 septembre 2012
  26. Problématiques dʼAPPARTINFO • Pour chaque adresse de France : •

    Sélectionner les points dʼintérêts à proximité samedi 15 septembre 2012
  27. Problématiques dʼAPPARTINFO • Pour chaque adresse de France : •

    Sélectionner les points dʼintérêts à proximité • Calculer leur distance samedi 15 septembre 2012
  28. Problématiques dʼAPPARTINFO • Pour chaque adresse de France : •

    Sélectionner les points dʼintérêts à proximité • Calculer leur distance • Afficher une carte de proximité pour les adresses samedi 15 septembre 2012
  29. Problématiques dʼAPPARTINFO • Pour chaque adresse de France : •

    Sélectionner les points dʼintérêts à proximité • Calculer leur distance • Afficher une carte de proximité pour les adresses • Avoir les avis à proximité quand ils sont pertinents samedi 15 septembre 2012
  30. Et surtout - UX samedi 15 septembre 2012

  31. J’adore cet appartement ! Immeuble bruyant Quartier génial Copropriété agréable

    Ca craint le soir ! Super gardien The right tool for the job samedi 15 septembre 2012
  32. Just kidding... samedi 15 septembre 2012

  33. Just kidding... • Django : «Web framework for perfectionists with

    deadlines » samedi 15 septembre 2012
  34. Just kidding... • Django : «Web framework for perfectionists with

    deadlines » • En Python samedi 15 septembre 2012
  35. Just kidding... • Django : «Web framework for perfectionists with

    deadlines » • En Python • Depuis 2004 samedi 15 septembre 2012
  36. Just kidding... • Django : «Web framework for perfectionists with

    deadlines » • En Python • Depuis 2004 • Performant et avec un écosystème complet samedi 15 septembre 2012
  37. Just kidding... • Django : «Web framework for perfectionists with

    deadlines » • En Python • Depuis 2004 • Performant et avec un écosystème complet • Nombreux exemples de sociétés : samedi 15 septembre 2012
  38. Just kidding... • Django : «Web framework for perfectionists with

    deadlines » • En Python • Depuis 2004 • Performant et avec un écosystème complet • Nombreux exemples de sociétés : • Disqus : 250 Millions de visiteurs (Août 2010) samedi 15 septembre 2012
  39. Just kidding... • Django : «Web framework for perfectionists with

    deadlines » • En Python • Depuis 2004 • Performant et avec un écosystème complet • Nombreux exemples de sociétés : • Disqus : 250 Millions de visiteurs (Août 2010) • récemment Instagram (vendu 1$ Milliard à Facebook) samedi 15 septembre 2012
  40. Et au sein même de Django samedi 15 septembre 2012

  41. Geodjango • Geodjango permet : • une intégration fine avec

    PostGis, Spatialite, MysqlSpatial... • De profiter des librairies de manipulations géographiques GEOS et GDAL • En somme de faire des calculs géographiques lourds - simplement. samedi 15 septembre 2012
  42. Exemple : SQL vs ORM samedi 15 septembre 2012

  43. Exemple • Quartier Auteuil à Paris : samedi 15 septembre

    2012
  44. En somme, techniquement • APPARTINFO Cʼest : • Django/GeoDjango •

    PostgreSQL + PostGis • Apache Solr • RabbitMQ + Celery • Enfin Nginx + Gunicorn samedi 15 septembre 2012
  45. J’adore cet appartement ! Immeuble bruyant Quartier génial Copropriété agréable

    Ca craint le soir ! Super gardien Problèmes usuels samedi 15 septembre 2012
  46. Heavy... • Certains traitements sont lourds... • SQL/ORM avec 4

    jointures • Calculs de distances Point <=> Polygon • Calculs dʼenveloppe convexe • ... samedi 15 septembre 2012
  47. APPARTINFO v2 : Home samedi 15 septembre 2012

  48. Pourquoi ? samedi 15 septembre 2012

  49. Solutions «usuelles» • Optimiser les requêtes SQL • User et

    abuser de cache avec «memcached» • ou encore, utiliser un chargement javascript asynchrone des données lourdes samedi 15 septembre 2012
  50. J’adore cet appartement ! Immeuble bruyant Quartier génial Copropriété agréable

    Ca craint le soir ! Super gardien CQRS samedi 15 septembre 2012
  51. CQRS, did you mean «CARS» ? samedi 15 septembre 2012

  52. CQRS, did you mean «CARS» ? samedi 15 septembre 2012

  53. CQRS : wut ? samedi 15 septembre 2012

  54. CQRS : wut ? • CQRS cʼest : samedi 15

    septembre 2012
  55. CQRS : wut ? • CQRS cʼest : • «Command

    and Query Response Segregation» samedi 15 septembre 2012
  56. CQRS : wut ? • CQRS cʼest : • «Command

    and Query Response Segregation» • Un modèle dʼarchitecture orienté performance samedi 15 septembre 2012
  57. CQRS : wut ? • CQRS cʼest : • «Command

    and Query Response Segregation» • Un modèle dʼarchitecture orienté performance • CQRS nʼest pas : samedi 15 septembre 2012
  58. CQRS : wut ? • CQRS cʼest : • «Command

    and Query Response Segregation» • Un modèle dʼarchitecture orienté performance • CQRS nʼest pas : • Une technologie ! samedi 15 septembre 2012
  59. CQRS : wut ? • CQRS cʼest : • «Command

    and Query Response Segregation» • Un modèle dʼarchitecture orienté performance • CQRS nʼest pas : • Une technologie ! • Un produit de la société ACME ! samedi 15 septembre 2012
  60. CQRS : wut ? • CQRS cʼest : • «Command

    and Query Response Segregation» • Un modèle dʼarchitecture orienté performance • CQRS nʼest pas : • Une technologie ! • Un produit de la société ACME ! samedi 15 septembre 2012
  61. CQRS : wut ? • CQRS cʼest : • «Command

    and Query Response Segregation» • Un modèle dʼarchitecture orienté performance • CQRS nʼest pas : • Une technologie ! • Un produit de la société ACME ! samedi 15 septembre 2012
  62. CQRS : wut ? • CQRS cʼest : • «Command

    and Query Response Segregation» • Un modèle dʼarchitecture orienté performance • CQRS nʼest pas : • Une technologie ! • Un produit de la société ACME ! • Une architecture quʼil aurait fallu avoir depuis le début ! samedi 15 septembre 2012
  63. CQRS • Basé sur la notion de CQS : Command

    Query Separation • Introduit par Bertrand Meyer avec le langage de programmation Eiffel • Résumé simplement : • Command = Modifications, Query = Lecture seule • Détacher lʼimplémentation dʼun domaine de ses impératifs de représentation; samedi 15 septembre 2012
  64. En image samedi 15 septembre 2012

  65. En image Query samedi 15 septembre 2012

  66. En image Query Show me samedi 15 septembre 2012

  67. En image Query Command Show me samedi 15 septembre 2012

  68. En image Query Command Show me Do something samedi 15

    septembre 2012
  69. En image Query Command Event change Show me Do something

    samedi 15 septembre 2012
  70. En image Query Command Event change Show me Do something

    Something changed samedi 15 septembre 2012
  71. Ok, on fait comment ? samedi 15 septembre 2012

  72. Ok, on fait comment ? • Django samedi 15 septembre

    2012
  73. Ok, on fait comment ? • Django • nʼa de

    notion de «UI Representation» samedi 15 septembre 2012
  74. Ok, on fait comment ? • Django • nʼa de

    notion de «UI Representation» • ni la notion de «Command»/«Query» samedi 15 septembre 2012
  75. Ok, on fait comment ? • Django • nʼa de

    notion de «UI Representation» • ni la notion de «Command»/«Query» • Mais Django a deux outils pour sʼen sortir samedi 15 septembre 2012
  76. Ok, on fait comment ? • Django • nʼa de

    notion de «UI Representation» • ni la notion de «Command»/«Query» • Mais Django a deux outils pour sʼen sortir • Signals samedi 15 septembre 2012
  77. Ok, on fait comment ? • Django • nʼa de

    notion de «UI Representation» • ni la notion de «Command»/«Query» • Mais Django a deux outils pour sʼen sortir • Signals • Django-Celery samedi 15 septembre 2012
  78. Celery : Distributed Task Queue • «Celery is an asynchronous

    task queue/job queue based on distributed message passing. It is focused on real-time operation, but supports scheduling as well.» • On va sʼappuyer sur Celery + RabbitMQ samedi 15 septembre 2012
  79. Query • On utilise une «view» normal. • Mais les

    requêtes de lecture sont simplifiées : • On nʼutilise plus lʼORM directement • On évite les jointures • On utilise directement la «UI Representation» qui contient que ce dont on a besoin. samedi 15 septembre 2012
  80. Query samedi 15 septembre 2012

  81. Query samedi 15 septembre 2012

  82. Query samedi 15 septembre 2012

  83. Command • Les modifications sont simplifiées, • On garde lʼORM

    mais on ne récupère que les objets dont on a besoin; • Plus de jointures; • Rien ne change vraiment profondément. samedi 15 septembre 2012
  84. Event Change handling samedi 15 septembre 2012

  85. Event Change handling • Avec les Signals on écoute les

    évènements du système et on enregistre nos receveurs dans models.py : samedi 15 septembre 2012
  86. Event Change handling • Avec les Signals on écoute les

    évènements du système et on enregistre nos receveurs dans models.py : samedi 15 septembre 2012
  87. Event Change handling • Avec les Signals on écoute les

    évènements du système et on enregistre nos receveurs dans models.py : samedi 15 septembre 2012
  88. Event Change handling • Avec les Signals on écoute les

    évènements du système et on enregistre nos receveurs dans models.py : • Avec Celery on délègue à des workers asynchrone les traitements lourds samedi 15 septembre 2012
  89. Event Change handling • Avec les Signals on écoute les

    évènements du système et on enregistre nos receveurs dans models.py : • Avec Celery on délègue à des workers asynchrone les traitements lourds samedi 15 septembre 2012
  90. Et la «UI Representation» ? samedi 15 septembre 2012

  91. Et la «UI Representation» ? • Quelque chose de «mieux»

    que faire des requêtes SQL à 3 jointures. samedi 15 septembre 2012
  92. Et la «UI Representation» ? • Quelque chose de «mieux»

    que faire des requêtes SQL à 3 jointures. • On pourrait utiliser : • une Vue PosgreSQL; • MongoDB; • CouchDB; • Ici on va utiliser Redis samedi 15 septembre 2012
  93. Et la «UI Representation» ? • Quelque chose de «mieux»

    que faire des requêtes SQL à 3 jointures. • On pourrait utiliser : • une Vue PosgreSQL; • MongoDB; • CouchDB; • Ici on va utiliser Redis • Redis est très rapide et très simple : clé = valeur samedi 15 septembre 2012
  94. En somme pour une query • On va rajouter une

    couche de DAO : « get_avis_populaires » • Et gérer la sérialisation/déserialisation avec cPickle/pickle samedi 15 septembre 2012
  95. Et pour lʼintendance samedi 15 septembre 2012

  96. Et pour lʼintendance samedi 15 septembre 2012

  97. Et pour lʼintendance samedi 15 septembre 2012

  98. J’adore cet appartement ! Immeuble bruyant Quartier génial Copropriété agréable

    Ca craint le soir ! Super gardien Mais ça marche ? samedi 15 septembre 2012
  99. Rappel : Home samedi 15 septembre 2012

  100. Après samedi 15 septembre 2012

  101. En conclusion • On délègue les traitements lourds à des

    workers celery • On sérialise/désérialise directement les objets Django en utilisant pickle (voire cPickle) • Pour les lectures, on récupère les objets depuis Redis • Pour les écritures, on ne récupère que les objets à modifier. samedi 15 septembre 2012
  102. Pour aller plus loin • Définir des queues prioritaires pour

    les traitements «critiques»/temps réel • CQRS + Event Sourcing • DDD : Domain Driven Design samedi 15 septembre 2012
  103. Questions ? ogirardot@appartinfo.com http://www.appartinfo.com samedi 15 septembre 2012