5. Faisons connaissance ...
• Avant cette soirée, je ne connaissais que lui
• J’en ai entendu un peu parler
jeudi 14 mars 13
6. Faisons connaissance ...
• Avant cette soirée, je ne connaissais que lui
• J’en ai entendu un peu parler
• J’ai déjà utilisé MongoDB à la maison
jeudi 14 mars 13
7. Faisons connaissance ...
• Avant cette soirée, je ne connaissais que lui
• J’en ai entendu un peu parler
• J’ai déjà utilisé MongoDB à la maison
• J’utilise MongoDB chez mon client
jeudi 14 mars 13
14. Orienté Document
• Pas de jointures
• Pas de transaction multi-documents
jeudi 14 mars 13
15. Orienté Document
• Pas de jointures
• Pas de transaction multi-documents
• Les documents inclus et les tableaux limitent les
besoins de jointures
jeudi 14 mars 13
16. Orienté Document
• Pas de jointures
• Pas de transaction multi-documents
• Les documents inclus et les tableaux limitent les
besoins de jointures
• Sans schéma
jeudi 14 mars 13
17. Orienté Document
• Pas de jointures
• Pas de transaction multi-documents
• Les documents inclus et les tableaux limitent les
besoins de jointures
• Sans schéma
• Système de requêtes très évolué
jeudi 14 mars 13
18. Orienté Document
• Pas de jointures
• Pas de transaction multi-documents
• Les documents inclus et les tableaux limitent les
besoins de jointures
• Sans schéma
• Système de requêtes très évolué
jeudi 14 mars 13
24. Techniquement
• Ecrit en C++
• Portable (presque) partout !
jeudi 14 mars 13
25. Techniquement
• Ecrit en C++
• Portable (presque) partout !
• La donnée est sérialisée en BSON
jeudi 14 mars 13
26. Techniquement
• Ecrit en C++
• Portable (presque) partout !
• La donnée est sérialisée en BSON
• Utilisation massive de la mémoire
jeudi 14 mars 13
29. Haute-Disponibilité & Scalabilité
• Réplication de server avec failover du master
automatique
• Sharding automatique
jeudi 14 mars 13
30. Haute-Disponibilité & Scalabilité
• Réplication de server avec failover du master
automatique
• Sharding automatique
• Distribution des lectures sur les serveurs
jeudi 14 mars 13
31. Haute-Disponibilité & Scalabilité
• Réplication de server avec failover du master
automatique
• Sharding automatique
• Distribution des lectures sur les serveurs
jeudi 14 mars 13
33. Haute performance
• La plupart des opération sont faites en
mémoire.
jeudi 14 mars 13
34. Haute performance
• La plupart des opération sont faites en
mémoire.
• Ecriture et Lecture très rapides.
jeudi 14 mars 13
35. Haute performance
• La plupart des opération sont faites en
mémoire.
• Ecriture et Lecture très rapides.
• Indexation de n'importe quel champs ou sous-
documents
jeudi 14 mars 13
36. Haute performance
• La plupart des opération sont faites en
mémoire.
• Ecriture et Lecture très rapides.
• Indexation de n'importe quel champs ou sous-
documents
• Ecritures asynchrones si besoin
jeudi 14 mars 13
42. Mission
• Les négociations ont échoué...
jeudi 14 mars 13
43. Mission
• Les négociations ont échoué...
• Il faut monter une équipe...
jeudi 14 mars 13
44. Mission
• Les négociations ont échoué...
• Il faut monter une équipe...
• Proposer des services qui affichent 100k
points d'intérêts...
jeudi 14 mars 13
45. Mission
• Les négociations ont échoué...
• Il faut monter une équipe...
• Proposer des services qui affichent 100k
points d'intérêts...
• Et les enrichir avec une 10 de partenaires...
jeudi 14 mars 13
46. Mission
• Les négociations ont échoué...
• Il faut monter une équipe...
• Proposer des services qui affichent 100k
points d'intérêts...
• Et les enrichir avec une 10 de partenaires...
• ...en 2 mois...
jeudi 14 mars 13
47. Mission
• Les négociations ont échoué...
• Il faut monter une équipe...
• Proposer des services qui affichent 100k
points d'intérêts...
• Et les enrichir avec une 10 de partenaires...
• ...en 2 mois...
jeudi 14 mars 13
51. Architecture Emergente
• Concept des méthodes agiles.
• Retarder au plus tard les
décisions d'architectures
lourdes, afin de décider avec
le plus d'éléments possibles.
jeudi 14 mars 13
52. Architecture Emergente
• Concept des méthodes agiles.
• Retarder au plus tard les
décisions d'architectures
lourdes, afin de décider avec
le plus d'éléments possibles.
• N'est possible qu'en écrivant
du code de façon incremental.
jeudi 14 mars 13
53. Architecture Emergente
• Concept des méthodes agiles.
• Retarder au plus tard les
décisions d'architectures
lourdes, afin de décider avec
le plus d'éléments possibles.
• N'est possible qu'en écrivant
du code de façon incremental.
• Suite de tests unitaires et
fonctionnels très importantes.
jeudi 14 mars 13
54. Architecture Initiale
Services Data
REST
...
Staging
XML
CSV
SOAP
ETL
REST
...
jeudi 14 mars 13
55. Architecture •Initiale
Fort stockage
Services Data
REST
...
Staging
XML
CSV
SOAP
ETL
REST
...
jeudi 14 mars 13
56. Architecture •Initiale
Fort stockage
• Rapidité de lecture
Services Data
REST
...
Staging
XML
CSV
SOAP
ETL
REST
...
jeudi 14 mars 13
57. Architecture •Initiale
Fort stockage
• Rapidité de lecture
• Recherche geospatiale
Services Data
REST
...
Staging
XML
CSV
SOAP
ETL
REST
...
jeudi 14 mars 13
58. Architecture •Initiale
Fort stockage
• Rapidité de lecture
• Recherche geospatiale
• Recherche textuelle
Services Data
REST
...
Staging
XML
CSV
SOAP
ETL
REST
...
jeudi 14 mars 13
59. Architecture •Initiale
Fort stockage
• Rapidité de lecture
• Recherche geospatiale
• Recherche textuelle
Services Data • Requêtes complexes
REST
...
Staging
XML
CSV
SOAP
ETL
REST
...
jeudi 14 mars 13
60. Architecture •Initiale
Fort stockage
• Rapidité de lecture
• Recherche geospatiale
• Recherche textuelle
Services Data • Requêtes complexes
REST • Aucune écriture
...
Staging
XML
CSV
SOAP
ETL
REST
...
jeudi 14 mars 13
61. Architecture Initiale
Services Data
REST
...
Staging
XML
CSV
SOAP
ETL
REST
...
jeudi 14 mars 13
62. Architecture Initiale
Services Data
REST
• Très fort stockage
...
Staging
XML
CSV
SOAP
ETL
REST
...
jeudi 14 mars 13
63. Architecture Initiale
Services Data
REST
• Très fort stockage
• Ecriture bulk
Staging
...
XML
CSV
SOAP
ETL
REST
...
jeudi 14 mars 13
64. Architecture Initiale
Services Data
REST
• Très fort stockage
• Ecriture bulk
Staging
...
• Requête simple
XML
CSV
SOAP
ETL
REST
...
jeudi 14 mars 13
65. Architecture Initiale
Services Data
REST
• Très fort stockage
• Ecriture bulk
Staging
...
• Requête simple
XML
•
CSV
Historise la donnée SOAP
ETL
REST
...
jeudi 14 mars 13
66. Architecture Initiale
Services Data
REST
...
Staging
XML
CSV
SOAP
ETL
REST
...
jeudi 14 mars 13
67. Architecture Initiale
Services Data
REST
? ...
Staging
XML
CSV
SOAP
ETL
REST
...
jeudi 14 mars 13
69. Modélisation de données
Table GéoEntités
Nom Lat Lng
Arc de Triomphe 48.873383 2.294463
Notre-Dame 48.898734 2.302374
0,n Table Films
Film Durée Année
Persepolis 2H30 2007
Rosario 1h30 2011
jeudi 14 mars 13
82. Remise en question
Fort volume de stockage Fort volume de stockage
Windows + MS SQL Server Linux
Recherche GéoSpatiale Recherche Géospatiale
Recherche sur mot clé (*) Recherche sur mot clé (*)
Réplication Réplication + Sharding
Temps de requêtes moyen Temps de requête moyen
150-300ms 40-100ms
jeudi 14 mars 13
83. Architecture Initiale
Services Data
REST
...
Staging
XML
CSV
SOAP
ETL
REST
...
jeudi 14 mars 13
84. Déploiement v0
Staging XML
CSV
ELB SOAP
REST
...
jeudi 14 mars 13
85. Version 1
• L'utilisateur d'UrbanDive est en mesure de
créer des POI (POPI).
jeudi 14 mars 13
86. Déploiement v1 Staging
Replica Set
Secondary
ELB
Arbiter
Primary
Secondary
jeudi 14 mars 13
87. Version 2
• Le marketing des POIs veut faire une
recherche full-text et du scoring.
• Nous voulons créer et rechercher des
évènements
jeudi 14 mars 13
88. Architecture V2
Services Data
REST
...
Staging
XML
CSV
SOAP
ETL
REST
...
jeudi 14 mars 13
89. Version 3
• Nombreux contenus real-time
jeudi 14 mars 13
90. Architecture V3
Services Data
REST
...
Staging
XML
CSV
SOAP
ETL
REST
...
jeudi 14 mars 13
91. Architecture V3
Services Data
REST
...
Staging
XML
CSV
SOAP
ETL
REST
...
jeudi 14 mars 13
92. Architecture V3
Services
REST
Data
...
XML
CSV
SOAP
ETL
REST
...
jeudi 14 mars 13
94. Conclusions
• Expérience très positive
jeudi 14 mars 13
95. Conclusions
• Expérience très positive
• Prise en main très rapide
jeudi 14 mars 13
96. Conclusions
• Expérience très positive
• Prise en main très rapide
• Facilite la vie pour multiple use case
jeudi 14 mars 13
97. Conclusions
• Expérience très positive
• Prise en main très rapide
• Facilite la vie pour multiple use case
• Support gratuit et commercial
jeudi 14 mars 13
98. Conclusions
• Expérience très positive
• Prise en main très rapide
• Facilite la vie pour multiple use case
• Support gratuit et commercial
• Produit s'améliore en continue, point critique la suivi
en production
jeudi 14 mars 13
112. Donc ...
• Morphia ce n’est pas mal, bon travail !
jeudi 14 mars 13
113. Donc ...
• Morphia ce n’est pas mal, bon travail !
• Mais : Nous avons besoin d’apprendre une nouvelle API
Need => Mongo, Driver Java, Morphia
jeudi 14 mars 13
114. Donc ...
• Morphia ce n’est pas mal, bon travail !
• Mais : Nous avons besoin d’apprendre une nouvelle API
Need => Mongo, Driver Java, Morphia
• Mais : JPA Like -> Le paradigm de Mongo ce n’est pas du
JPA ou Hibernate
jeudi 14 mars 13
115. Donc ...
• Morphia ce n’est pas mal, bon travail !
• Mais : Nous avons besoin d’apprendre une nouvelle API
Need => Mongo, Driver Java, Morphia
• Mais : JPA Like -> Le paradigm de Mongo ce n’est pas du
JPA ou Hibernate
• Morphia arrive au driver java ?
jeudi 14 mars 13
116. Donc ...
• Morphia ce n’est pas mal, bon travail !
• Mais : Nous avons besoin d’apprendre une nouvelle API
Need => Mongo, Driver Java, Morphia
• Mais : JPA Like -> Le paradigm de Mongo ce n’est pas du
JPA ou Hibernate
• Morphia arrive au driver java ?
• Notre choix : Morphia pour mapper les objets et le
Driver Java pour tout le reste.
jeudi 14 mars 13
118. @bguerout
Jongo
@amsellemyves
• Qu’est-ce que c’est que Jongo ?
jeudi 14 mars 13
119. @bguerout
Jongo
@amsellemyves
• Qu’est-ce que c’est que Jongo ?
• ODM sur le driver Javao
jeudi 14 mars 13
120. @bguerout
Jongo
@amsellemyves
• Qu’est-ce que c’est que Jongo ?
• ODM sur le driver Javao
• Jackson and BSON4Jackson pour (Un)marshalling
jeudi 14 mars 13
121. @bguerout
Jongo
@amsellemyves
• Qu’est-ce que c’est que Jongo ?
• ODM sur le driver Javao
• Jackson and BSON4Jackson pour (Un)marshalling
• Pas de JPA / Hibernate
jeudi 14 mars 13
122. @bguerout
Jongo
@amsellemyves
• Qu’est-ce que c’est que Jongo ?
• ODM sur le driver Javao
• Jackson and BSON4Jackson pour (Un)marshalling
• Pas de JPA / Hibernate
• Requête Mongo comme dans le shell
jeudi 14 mars 13
123. db.users.find({ $or : [ { age : {$gt:20,$lt:30} } ,
{ age : {$gt:50,$lt:60} } ] })
FIND Driver Java :
jeudi 14 mars 13
124. db.users.find({ $or : [ { age : {$gt:20,$lt:30} } ,
{ age : {$gt:50,$lt:60} } ] })
FIND Driver Java :
DB db = mongo.getDB("users");
jeudi 14 mars 13
125. db.users.find({ $or : [ { age : {$gt:20,$lt:30} } ,
{ age : {$gt:50,$lt:60} } ] })
FIND Driver Java :
DB db = mongo.getDB("users");
DBCollection users = db.getCollection("users");
jeudi 14 mars 13
126. db.users.find({ $or : [ { age : {$gt:20,$lt:30} } ,
{ age : {$gt:50,$lt:60} } ] })
FIND Driver Java :
DB db = mongo.getDB("users");
DBCollection users = db.getCollection("users");
DBObject firstQuery = QueryBuilder.start("age").greaterThan(20).lessThan(30).get();
jeudi 14 mars 13
127. db.users.find({ $or : [ { age : {$gt:20,$lt:30} } ,
{ age : {$gt:50,$lt:60} } ] })
FIND Driver Java :
DB db = mongo.getDB("users");
DBCollection users = db.getCollection("users");
DBObject firstQuery = QueryBuilder.start("age").greaterThan(20).lessThan(30).get();
DBObject secondQuery = QueryBuilder.start("age").greaterThan(50).lessThan(60).get();
jeudi 14 mars 13
128. db.users.find({ $or : [ { age : {$gt:20,$lt:30} } ,
{ age : {$gt:50,$lt:60} } ] })
FIND Driver Java :
DB db = mongo.getDB("users");
DBCollection users = db.getCollection("users");
DBObject firstQuery = QueryBuilder.start("age").greaterThan(20).lessThan(30).get();
DBObject secondQuery = QueryBuilder.start("age").greaterThan(50).lessThan(60).get();
DBObject query = QueryBuilder.start().or(firstQuery,secondQuery).get();
jeudi 14 mars 13
129. db.users.find({ $or : [ { age : {$gt:20,$lt:30} } ,
{ age : {$gt:50,$lt:60} } ] })
FIND Driver Java :
DB db = mongo.getDB("users");
DBCollection users = db.getCollection("users");
DBObject firstQuery = QueryBuilder.start("age").greaterThan(20).lessThan(30).get();
DBObject secondQuery = QueryBuilder.start("age").greaterThan(50).lessThan(60).get();
DBObject query = QueryBuilder.start().or(firstQuery,secondQuery).get();
DBCursor results = collection.find(query);
jeudi 14 mars 13
130. db.users.find({ $or : [ { age : {$gt:20,$lt:30} } ,
{ age : {$gt:50,$lt:60} } ] })
FIND Driver Java :
DB db = mongo.getDB("users");
DBCollection users = db.getCollection("users");
DBObject firstQuery = QueryBuilder.start("age").greaterThan(20).lessThan(30).get();
DBObject secondQuery = QueryBuilder.start("age").greaterThan(50).lessThan(60).get();
DBObject query = QueryBuilder.start().or(firstQuery,secondQuery).get();
DBCursor results = collection.find(query);
List<User> users = new ArrayList<User>();
for (DBObject result : results) {
User user = new User();
user.setUsername((String) result.get("username"));
user.setAge((Integer) result.get("age"));
users.add(user);
}
jeudi 14 mars 13
131. db.users.find({ $or : [ { age : {$gt:20,$lt:30} } ,
{ age : {$gt:50,$lt:60} } ] })
FIND Jongo
jeudi 14 mars 13
132. db.users.find({ $or : [ { age : {$gt:20,$lt:30} } ,
{ age : {$gt:50,$lt:60} } ] })
FIND Jongo
MongoCollection collection = new Jongo(db).getCollection("users");
jeudi 14 mars 13
133. db.users.find({ $or : [ { age : {$gt:20,$lt:30} } ,
{ age : {$gt:50,$lt:60} } ] })
FIND Jongo
MongoCollection collection = new Jongo(db).getCollection("users");
Iterable<User> users = collection.find("{ $or : [ { age : {$gt:20,$lt:30} } , { age :
{$gt:50,$lt:60} } ] }").as(User.class);
jeudi 14 mars 13
134. DB db = mongo.getDB("users");
DBCollection collection = db.getCollection("users");
DBObject firstQuery = QueryBuilder.start("age").greaterThan(20).lessThan(30).get();
DBObject secondQuery = QueryBuilder.start("age").greaterThan(50).lessThan(60).get();
DBObject query = QueryBuilder.start().or(firstQuery,secondQuery).get();
DBCursor results = collection.find(query);
List<User> users = new ArrayList<User>();
for (DBObject result : results) {
User user = new User();
user.setUsername((String) result.get("username"));
user.setAge((Integer) result.get("age"));
users.add(user);
}
MongoCollection collection = new Jongo(db).getCollection("users");
Iterable<User> users = collection.find("{ $or : [ { age : {$gt:20,$lt:30} } , { age : {$gt:
50,$lt:60} } ] }").as(User.class);
jeudi 14 mars 13