MongoDB Mix Paris - Mars 2013 jeudi 14 mars 13
Agile Developer MongoDB User @karesti MongoDB Master Katia Aresti Freelance jeudi 14 mars 13
Faisons connaissance ... jeudi 14 mars 13
Faisons connaissance ... • Avant cette soirée, je ne connaissais que lui jeudi 14 mars 13
Faisons connaissance ... • Avant cette soirée, je ne connaissais que lui • J’en ai entendu un peu parler jeudi 14 mars 13
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
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
1ème partie Mongo jeudi 14 mars 13
Mini-introduction jeudi 14 mars 13
«MongoDB has the best features of key/value stores, document databases and relational databases in one.» John Nunemaker jeudi 14 mars 13
«MongoDB has the best features of key/value stores, document databases and relational databases in one.» John Nunemaker jeudi 14 mars 13
Orienté Document jeudi 14 mars 13
Orienté Document • Pas de jointures jeudi 14 mars 13
Orienté Document • Pas de jointures • Pas de transaction multi-documents jeudi 14 mars 13
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
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
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
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
La donnée normalisée Category • Name • Url Article User • Name Tag • Name • Slug • Name • Email Address • Publish date • Url • Text Comment • Comment • Date • Author © jeudi 14 mars 13
Une base de données document Article • Name • Slug • Publish date User • Text • Name • Author • Email Address Comment[] • Comment • Date • Author Tag[] • Value Category[] • Value © jeudi 14 mars 13
RDBMS Mongo Table,View ➜ Collection Row ➜ Document Index ➜ Index Join ➜ Embedded Document Foreign Key ➜ Reference Partition ➜ Shard jeudi 14 mars 13
Techniquement jeudi 14 mars 13
Techniquement • Ecrit en C++ jeudi 14 mars 13
Techniquement • Ecrit en C++ • Portable (presque) partout ! jeudi 14 mars 13
Techniquement • Ecrit en C++ • Portable (presque) partout ! • La donnée est sérialisée en BSON jeudi 14 mars 13
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
Haute-Disponibilité & Scalabilité jeudi 14 mars 13
Haute-Disponibilité & Scalabilité • Réplication de server avec failover du master automatique jeudi 14 mars 13
Haute-Disponibilité & Scalabilité • Réplication de server avec failover du master automatique • Sharding automatique jeudi 14 mars 13
Haute-Disponibilité & Scalabilité • Réplication de server avec failover du master automatique • Sharding automatique • Distribution des lectures sur les serveurs jeudi 14 mars 13
Haute-Disponibilité & Scalabilité • Réplication de server avec failover du master automatique • Sharding automatique • Distribution des lectures sur les serveurs jeudi 14 mars 13
Haute performance jeudi 14 mars 13
Haute performance • La plupart des opération sont faites en mémoire. jeudi 14 mars 13
Haute performance • La plupart des opération sont faites en mémoire. • Ecriture et Lecture très rapides. jeudi 14 mars 13
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
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
Qui utilise MongoDB ? jeudi 14 mars 13
2ème partie Mongo reloaded jeudi 14 mars 13
Il était une fois ... jeudi 14 mars 13
Il était une fois ... jeudi 14 mars 13
Mission jeudi 14 mars 13
Mission • Les négociations ont échoué... jeudi 14 mars 13
Mission • Les négociations ont échoué... • Il faut monter une équipe... jeudi 14 mars 13
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
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
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
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
Equipe POIx jeudi 14 mars 13
Architecture Emergente jeudi 14 mars 13
Architecture Emergente • Concept des méthodes agiles. jeudi 14 mars 13
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
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
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
Architecture Initiale Services Data REST ... Staging XML CSV SOAP ETL REST ... jeudi 14 mars 13
Architecture •Initiale Fort stockage Services Data REST ... Staging XML CSV SOAP ETL REST ... jeudi 14 mars 13
Architecture •Initiale Fort stockage • Rapidité de lecture Services Data REST ... Staging XML CSV SOAP ETL REST ... jeudi 14 mars 13
Architecture •Initiale Fort stockage • Rapidité de lecture • Recherche geospatiale Services Data REST ... Staging XML CSV SOAP ETL REST ... jeudi 14 mars 13
Architecture •Initiale Fort stockage • Rapidité de lecture • Recherche geospatiale • Recherche textuelle Services Data REST ... Staging XML CSV SOAP ETL REST ... jeudi 14 mars 13
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
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
Architecture Initiale Services Data REST ... Staging XML CSV SOAP ETL REST ... jeudi 14 mars 13
Architecture Initiale Services Data REST • Très fort stockage ... Staging XML CSV SOAP ETL REST ... jeudi 14 mars 13
Architecture Initiale Services Data REST • Très fort stockage • Ecriture bulk Staging ... XML CSV SOAP ETL REST ... jeudi 14 mars 13
Architecture Initiale Services Data REST • Très fort stockage • Ecriture bulk Staging ... • Requête simple XML CSV SOAP ETL REST ... jeudi 14 mars 13
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
Architecture Initiale Services Data REST ... Staging XML CSV SOAP ETL REST ... jeudi 14 mars 13
Architecture Initiale Services Data REST ? ... Staging XML CSV SOAP ETL REST ... jeudi 14 mars 13
1er choix banal mais serein. jeudi 14 mars 13
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
Nos besoins jeudi 14 mars 13
Nos besoins • Fort volume jeudi 14 mars 13
Nos besoins • Fort volume • Pas de jointure jeudi 14 mars 13
Nos besoins • Fort volume • Pas de jointure • Pas de transactions complexes jeudi 14 mars 13
Nos besoins • Fort volume • Pas de jointure • Pas de transactions complexes • Rapidité de lecture jeudi 14 mars 13
Nos besoins • Fort volume • Pas de jointure • Pas de transactions complexes • Rapidité de lecture • Scalabilité horizontale jeudi 14 mars 13
? jeudi 14 mars 13
Challenge jeudi 14 mars 13
Challenge • En 2 heures faire une lecture/écriture de géo-entité avec MongoDB. MySQL ça serait le temps nécessaire. jeudi 14 mars 13
Challenge • En 2 heures faire une lecture/écriture de géo-entité avec MongoDB. MySQL ça serait le temps nécessaire. jeudi 14 mars 13
Architecture Initiale Services Data REST ... Staging XML CSV SOAP ETL REST ... jeudi 14 mars 13
jeudi 14 mars 13
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
Architecture Initiale Services Data REST ... Staging XML CSV SOAP ETL REST ... jeudi 14 mars 13
Déploiement v0 Staging XML CSV ELB SOAP REST ... jeudi 14 mars 13
Version 1 • L'utilisateur d'UrbanDive est en mesure de créer des POI (POPI). jeudi 14 mars 13
Déploiement v1 Staging Replica Set Secondary ELB Arbiter Primary Secondary jeudi 14 mars 13
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
Architecture V2 Services Data REST ... Staging XML CSV SOAP ETL REST ... jeudi 14 mars 13
Version 3 • Nombreux contenus real-time jeudi 14 mars 13
Architecture V3 Services Data REST ... Staging XML CSV SOAP ETL REST ... jeudi 14 mars 13
Architecture V3 Services Data REST ... Staging XML CSV SOAP ETL REST ... jeudi 14 mars 13
Architecture V3 Services REST Data ... XML CSV SOAP ETL REST ... jeudi 14 mars 13
Conclusions jeudi 14 mars 13
Conclusions • Expérience très positive jeudi 14 mars 13
Conclusions • Expérience très positive • Prise en main très rapide jeudi 14 mars 13
Conclusions • Expérience très positive • Prise en main très rapide • Facilite la vie pour multiple use case jeudi 14 mars 13
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
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
3ème partie Mongo Revolution jeudi 14 mars 13
Mongo + Java = Jongo ODM pour Java jeudi 14 mars 13
Revenons à 2010 ... jeudi 14 mars 13
jeudi 14 mars 13
jeudi 14 mars 13
jeudi 14 mars 13
{mongo : "genial"} jeudi 14 mars 13
REST Web Services Search of POI-s jeudi 14 mars 13
API DBObject REST Web Services Search of POI-s jeudi 14 mars 13
API DBObject REST Web Services Search of POI-s {DBObject : "pas mal, mais ça peut être mieux" jeudi 14 mars 13
Back on 2010 ... jeudi 14 mars 13
Back on 2010 ... Morphia ? jeudi 14 mars 13
Morphia JPA-LIKE jeudi 14 mars 13
Donc ... • Morphia ce n’est pas mal, bon travail ! jeudi 14 mars 13
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
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
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
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
Fin 2011 ... jeudi 14 mars 13
@bguerout Jongo @amsellemyves • Qu’est-ce que c’est que Jongo ? jeudi 14 mars 13
@bguerout Jongo @amsellemyves • Qu’est-ce que c’est que Jongo ? • ODM sur le driver Javao jeudi 14 mars 13
@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
@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
@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
db.users.find({ $or : [ { age : {$gt:20,$lt:30} } , { age : {$gt:50,$lt:60} } ] }) FIND Driver Java : jeudi 14 mars 13
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
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
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
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
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
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
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
db.users.find({ $or : [ { age : {$gt:20,$lt:30} } , { age : {$gt:50,$lt:60} } ] }) FIND Jongo jeudi 14 mars 13
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
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
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
db.users.update({ name : 'Joe' } , { {$inc : {age : 1} }, true, true) Jongo update jeudi 14 mars 13
db.users.update({ name : 'Joe' } , { {$inc : {age : 1} }, true, true) Jongo update MongoCollection users = new Jongo(db).getCollection("users"); jeudi 14 mars 13
db.users.update({ name : 'Joe' } , { {$inc : {age : 1} }, true, true) Jongo update MongoCollection users = new Jongo(db).getCollection("users"); users.update("{name: 'Joe'}").upsert().multi().with("{$inc: {age: 1}}"); jeudi 14 mars 13
Templating MongoCollection collection = new Jongo(db).getCollection("users"); friends.find("{name: #, age: #}", "John", 18); {name: 'John', age: 18} jeudi 14 mars 13
Aggregation Fw MongoCollection collection = new Jongo(db).getCollection("emails"); collection.aggregate("{$project:{sender:1}}") .and("{$match:{tags:'read'}}") .and("{$limit:10}") .as(Email.class); jeudi 14 mars 13
Conclusion • Mongo Shell c’est un plaisir ; le driver java peut l’être aussi jeudi 14 mars 13
http://jongo.org/ https://github.com/bguerout/jongo @bguerout - Benoit Guérout @amsellemyves - Yves Amsellem jeudi 14 mars 13
jeudi 14 mars 13
Merci pour écouter !!! jeudi 14 mars 13

Mongo db devfestw

  • 1.
    MongoDB Mix Paris - Mars 2013 jeudi 14 mars 13
  • 2.
    Agile Developer MongoDB User @karesti MongoDB Master Katia Aresti Freelance jeudi 14 mars 13
  • 3.
  • 4.
    Faisons connaissance ... • Avant cette soirée, je ne connaissais que lui jeudi 14 mars 13
  • 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
  • 8.
    1ème partie Mongo jeudi 14 mars 13
  • 9.
  • 10.
    «MongoDB has thebest features of key/value stores, document databases and relational databases in one.» John Nunemaker jeudi 14 mars 13
  • 11.
    «MongoDB has thebest features of key/value stores, document databases and relational databases in one.» John Nunemaker jeudi 14 mars 13
  • 12.
  • 13.
    Orienté Document • Pas de jointures 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
  • 19.
    La donnée normalisée Category • Name • Url Article User • Name Tag • Name • Slug • Name • Email Address • Publish date • Url • Text Comment • Comment • Date • Author © jeudi 14 mars 13
  • 20.
    Une base dedonnées document Article • Name • Slug • Publish date User • Text • Name • Author • Email Address Comment[] • Comment • Date • Author Tag[] • Value Category[] • Value © jeudi 14 mars 13
  • 21.
    RDBMS Mongo Table,View ➜ Collection Row ➜ Document Index ➜ Index Join ➜ Embedded Document Foreign Key ➜ Reference Partition ➜ Shard jeudi 14 mars 13
  • 22.
  • 23.
    Techniquement • Ecrit en C++ 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
  • 27.
  • 28.
    Haute-Disponibilité & Scalabilité • Réplication de server avec failover du master automatique 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
  • 32.
  • 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
  • 37.
    Qui utilise MongoDB? jeudi 14 mars 13
  • 38.
    2ème partie Mongo reloaded jeudi 14 mars 13
  • 39.
    Il était unefois ... jeudi 14 mars 13
  • 40.
    Il était unefois ... jeudi 14 mars 13
  • 41.
  • 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
  • 48.
  • 49.
  • 50.
    Architecture Emergente • Concept des méthodes agiles. 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
  • 68.
    1er choix banalmais serein. 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
  • 70.
  • 71.
    Nos besoins • Fort volume jeudi 14 mars 13
  • 72.
    Nos besoins • Fort volume • Pas de jointure jeudi 14 mars 13
  • 73.
    Nos besoins • Fort volume • Pas de jointure • Pas de transactions complexes jeudi 14 mars 13
  • 74.
    Nos besoins • Fort volume • Pas de jointure • Pas de transactions complexes • Rapidité de lecture jeudi 14 mars 13
  • 75.
    Nos besoins • Fort volume • Pas de jointure • Pas de transactions complexes • Rapidité de lecture • Scalabilité horizontale jeudi 14 mars 13
  • 76.
  • 77.
  • 78.
    Challenge • En 2 heures faire une lecture/écriture de géo-entité avec MongoDB. MySQL ça serait le temps nécessaire. jeudi 14 mars 13
  • 79.
    Challenge • En 2 heures faire une lecture/écriture de géo-entité avec MongoDB. MySQL ça serait le temps nécessaire. jeudi 14 mars 13
  • 80.
    Architecture Initiale Services Data REST ... Staging XML CSV SOAP ETL REST ... jeudi 14 mars 13
  • 81.
  • 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
  • 93.
  • 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
  • 99.
    3ème partie Mongo Revolution jeudi 14 mars 13
  • 100.
    Mongo + Java= Jongo ODM pour Java jeudi 14 mars 13
  • 101.
    Revenons à 2010... jeudi 14 mars 13
  • 102.
  • 103.
  • 104.
  • 105.
  • 106.
    REST Web Services Search of POI-s jeudi 14 mars 13
  • 107.
    API DBObject REST Web Services Search of POI-s jeudi 14 mars 13
  • 108.
    API DBObject REST Web Services Search of POI-s {DBObject : "pas mal, mais ça peut être mieux" jeudi 14 mars 13
  • 109.
    Back on 2010... jeudi 14 mars 13
  • 110.
    Back on 2010... Morphia ? jeudi 14 mars 13
  • 111.
    Morphia JPA-LIKE 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
  • 117.
  • 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
  • 135.
    db.users.update({ name :'Joe' } , { {$inc : {age : 1} }, true, true) Jongo update jeudi 14 mars 13
  • 136.
    db.users.update({ name :'Joe' } , { {$inc : {age : 1} }, true, true) Jongo update MongoCollection users = new Jongo(db).getCollection("users"); jeudi 14 mars 13
  • 137.
    db.users.update({ name :'Joe' } , { {$inc : {age : 1} }, true, true) Jongo update MongoCollection users = new Jongo(db).getCollection("users"); users.update("{name: 'Joe'}").upsert().multi().with("{$inc: {age: 1}}"); jeudi 14 mars 13
  • 138.
    Templating MongoCollection collection = new Jongo(db).getCollection("users"); friends.find("{name: #, age: #}", "John", 18); {name: 'John', age: 18} jeudi 14 mars 13
  • 139.
    Aggregation Fw MongoCollection collection = new Jongo(db).getCollection("emails"); collection.aggregate("{$project:{sender:1}}") .and("{$match:{tags:'read'}}") .and("{$limit:10}") .as(Email.class); jeudi 14 mars 13
  • 140.
    Conclusion • Mongo Shell c’est un plaisir ; le driver java peut l’être aussi jeudi 14 mars 13
  • 141.
    http://jongo.org/ https://github.com/bguerout/jongo @bguerout - Benoit Guérout @amsellemyves - Yves Amsellem jeudi 14 mars 13
  • 142.
  • 143.
    Merci pour écouter!!! jeudi 14 mars 13