Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

Plan I. Présentation II. APPARTINFO : Problèmes et Solutions III. CQRS IV. CQRS avec Django sur APPARTINFO ? V. Conclusion samedi 15 septembre 2012

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

Présentation samedi 15 septembre 2012

Slide 5

Slide 5 text

Présentation Olivier Girardot @ogirardot samedi 15 septembre 2012

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

Retour dʼexpérience : APPARTINFO samedi 15 septembre 2012

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

En Image samedi 15 septembre 2012

Slide 16

Slide 16 text

En Image samedi 15 septembre 2012

Slide 17

Slide 17 text

Sur une adresse samedi 15 septembre 2012

Slide 18

Slide 18 text

Sur une adresse samedi 15 septembre 2012

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

Avis à proximité samedi 15 septembre 2012

Slide 24

Slide 24 text

Problématiques dʼAPPARTINFO samedi 15 septembre 2012

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

Et surtout - UX samedi 15 septembre 2012

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

Just kidding... samedi 15 septembre 2012

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

Et au sein même de Django samedi 15 septembre 2012

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

Exemple : SQL vs ORM samedi 15 septembre 2012

Slide 43

Slide 43 text

Exemple • Quartier Auteuil à Paris : samedi 15 septembre 2012

Slide 44

Slide 44 text

En somme, techniquement • APPARTINFO Cʼest : • Django/GeoDjango • PostgreSQL + PostGis • Apache Solr • RabbitMQ + Celery • Enfin Nginx + Gunicorn samedi 15 septembre 2012

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

Heavy... • Certains traitements sont lourds... • SQL/ORM avec 4 jointures • Calculs de distances Point <=> Polygon • Calculs dʼenveloppe convexe • ... samedi 15 septembre 2012

Slide 47

Slide 47 text

APPARTINFO v2 : Home samedi 15 septembre 2012

Slide 48

Slide 48 text

Pourquoi ? samedi 15 septembre 2012

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

J’adore cet appartement ! Immeuble bruyant Quartier génial Copropriété agréable Ca craint le soir ! Super gardien CQRS samedi 15 septembre 2012

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

CQRS : wut ? samedi 15 septembre 2012

Slide 54

Slide 54 text

CQRS : wut ? • CQRS cʼest : samedi 15 septembre 2012

Slide 55

Slide 55 text

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

Slide 56

Slide 56 text

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

Slide 57

Slide 57 text

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

Slide 58

Slide 58 text

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

Slide 59

Slide 59 text

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

Slide 60

Slide 60 text

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

Slide 61

Slide 61 text

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

Slide 62

Slide 62 text

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

Slide 63

Slide 63 text

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

Slide 64

Slide 64 text

En image samedi 15 septembre 2012

Slide 65

Slide 65 text

En image Query samedi 15 septembre 2012

Slide 66

Slide 66 text

En image Query Show me samedi 15 septembre 2012

Slide 67

Slide 67 text

En image Query Command Show me samedi 15 septembre 2012

Slide 68

Slide 68 text

En image Query Command Show me Do something samedi 15 septembre 2012

Slide 69

Slide 69 text

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

Slide 70

Slide 70 text

En image Query Command Event change Show me Do something Something changed samedi 15 septembre 2012

Slide 71

Slide 71 text

Ok, on fait comment ? samedi 15 septembre 2012

Slide 72

Slide 72 text

Ok, on fait comment ? • Django samedi 15 septembre 2012

Slide 73

Slide 73 text

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

Slide 74

Slide 74 text

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

Slide 75

Slide 75 text

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

Slide 76

Slide 76 text

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

Slide 77

Slide 77 text

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

Slide 78

Slide 78 text

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

Slide 79

Slide 79 text

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

Slide 80

Slide 80 text

Query samedi 15 septembre 2012

Slide 81

Slide 81 text

Query samedi 15 septembre 2012

Slide 82

Slide 82 text

Query samedi 15 septembre 2012

Slide 83

Slide 83 text

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

Slide 84

Slide 84 text

Event Change handling samedi 15 septembre 2012

Slide 85

Slide 85 text

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

Slide 86

Slide 86 text

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

Slide 87

Slide 87 text

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

Slide 88

Slide 88 text

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

Slide 89

Slide 89 text

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

Slide 90

Slide 90 text

Et la «UI Representation» ? samedi 15 septembre 2012

Slide 91

Slide 91 text

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

Slide 92

Slide 92 text

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

Slide 93

Slide 93 text

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

Slide 94

Slide 94 text

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

Slide 95

Slide 95 text

Et pour lʼintendance samedi 15 septembre 2012

Slide 96

Slide 96 text

Et pour lʼintendance samedi 15 septembre 2012

Slide 97

Slide 97 text

Et pour lʼintendance samedi 15 septembre 2012

Slide 98

Slide 98 text

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

Slide 99

Slide 99 text

Rappel : Home samedi 15 septembre 2012

Slide 100

Slide 100 text

Après samedi 15 septembre 2012

Slide 101

Slide 101 text

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

Slide 102

Slide 102 text

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

Slide 103

Slide 103 text

Questions ? [email protected] http://www.appartinfo.com samedi 15 septembre 2012