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.

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 • Centralien de Nantes (2009) : Informatique et Finance

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

    • Développeur Java/Scala/ Python Olivier Girardot @ogirardot samedi 15 septembre 2012
  6. 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
  7. 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
  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. 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
  10. 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
  11. 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
  12. Problématiques dʼAPPARTINFO • Pour chaque adresse de France : •

    Sélectionner les points dʼintérêts à proximité samedi 15 septembre 2012
  13. 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
  14. 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
  15. 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
  16. 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
  17. Just kidding... • Django : «Web framework for perfectionists with

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

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

    deadlines » • En Python • Depuis 2004 • Performant et avec un écosystème complet samedi 15 septembre 2012
  20. 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
  21. 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
  22. 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
  23. 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
  24. En somme, techniquement • APPARTINFO Cʼest : • Django/GeoDjango •

    PostgreSQL + PostGis • Apache Solr • RabbitMQ + Celery • Enfin Nginx + Gunicorn samedi 15 septembre 2012
  25. 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
  26. Heavy... • Certains traitements sont lourds... • SQL/ORM avec 4

    jointures • Calculs de distances Point <=> Polygon • Calculs dʼenveloppe convexe • ... samedi 15 septembre 2012
  27. 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
  28. J’adore cet appartement ! Immeuble bruyant Quartier génial Copropriété agréable

    Ca craint le soir ! Super gardien CQRS samedi 15 septembre 2012
  29. CQRS : wut ? • CQRS cʼest : • «Command

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

    and Query Response Segregation» • Un modèle dʼarchitecture orienté performance samedi 15 septembre 2012
  31. 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
  32. 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
  33. 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
  34. 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
  35. 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
  36. 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
  37. 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
  38. En image Query Command Event change Show me Do something

    Something changed samedi 15 septembre 2012
  39. Ok, on fait comment ? • Django • nʼa de

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

    notion de «UI Representation» • ni la notion de «Command»/«Query» samedi 15 septembre 2012
  41. 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
  42. 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
  43. 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
  44. 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
  45. 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
  46. 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
  47. 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
  48. 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
  49. 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
  50. 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
  51. 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
  52. Et la «UI Representation» ? • Quelque chose de «mieux»

    que faire des requêtes SQL à 3 jointures. samedi 15 septembre 2012
  53. 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
  54. 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
  55. 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
  56. 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
  57. 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
  58. 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