280 likes | 477 Views
REX utilisation de MongoDB chez Joe Mobile. Paris MongoDB User Group 26/02/2014 Extrait de la présentation de Sylvain Bugat. 1. Utilisation principale de MongoDB. 2. Développer avec MongoDB. 3. Problèmes rencontrés. 4. Autres utilisations et conclusion. 1.
E N D
REX utilisation de MongoDB chez Joe Mobile Paris MongoDB User Group 26/02/2014 Extrait de la présentation de Sylvain Bugat
1 Utilisation principale de MongoDB 2 Développer avec MongoDB 3 Problèmes rencontrés 4 Autres utilisations et conclusion
1 Utilisation principale de MongoDB 2 Développer avec MongoDB 3 Problèmes rencontrés 4 Autres utilisations et conclusion
Joe Mobile Présentation • MVNO développé en interne par SFR • Technologies: • Java SE 7, Spring (MVC, Core, Security, Mobile), JPA2/Hibernate, Apache CXF • Spring Batch pour le back office • Serveur d’application Tomcat 7 • Base de données: • MySQL • MongoDB
Joe Mobile Architecture mise en place
Joe Mobile Cas des CDR (1) • Besoin: stocker les usages des clients de Joe Mobile : • Structure partiellement hiérarchisée • Accès à tous les CDR d’une ligne • En moyenne 34/CDR par jour et par ligne active • Insertion uniquement • Croissance proportionnelle en fonction du nombre de lignes actives • Une année d’historique • La consultation doit être immédiate • Clés de recherches intégrées dans le champ « _id » • Clé retenue: 06 XX XXXXXX YYYY MM DD • Seul l’accès via la clé est utilisé • Temps de réponse: 0,2s (100 CDR) à 1s (6500 CDR) • L’insertion est assez rapide • Effectué au fil de l’eau • 230 insertions/s avec dédoublonnage
Joe Mobile Cas des CDR (2) • Exemple de structure de CDR stockés:
Joe Mobile Cas des CDR (3)
Joe Mobile Architecture mise en place • MongoDB en production: • 3 serveurs en réplica-set (1 primary et 2 secondary) • Pas de sharding • Pas de Mongod • MongoDB en développement/qualification: • Solution SAAS via MongoHQ/Cloudbees • Ajouts/suppressions de bases rapides • Pas de maintenance à effectuer • Peut aussi être installé sur un serveur dédié • Solution utilisée en développement au début
1 Utilisation principale de MongoDB 2 Développer avec MongoDB 3 Problèmes rencontrés 4 Autres utilisations et conclusion
Joe Mobile Développement avec MongoDB (1) • Dépendance MavenMongoDB: <dependency> <groupId>org.mongodb</groupId> <artifactId>mongo-java-driver</artifactId> <version>2.11.4</version> </dependency>
Joe Mobile Développement avec MongoDB - configuration Spring(2) <bean id="mongo" class="com.mongodb.Mongo“> <constructor-arg> <list> <refbean="mongoSrv1"/> <refbean="mongoSrv2"/> <refbean="mongoSrv3"/> </list> </constructor-arg><property name="writeConcern“><util:constant static-field="com.mongodb.WriteConcern.SAFE“/></property> </bean> <bean id="mongoSrv1" class="com.mongodb.ServerAddress“> <constructor-arg index="0" value="${mongo.host1}"/> <constructor-arg index="1" value="${mongo.port1}"/> </bean> <bean id="mongoFactory" class="com.snbl.service.tools.MongoFactory" abstract="true“> <property name="username" value="${mongo.userName}"/> <propertyname="passwd" value="${mongo.passwd}"/> </bean> <bean id="cdrMongoFactory" parent="mongoFactory“> <propertyname="dbName" value="${mongo.cdr.dbName}"/> <property name="collectionName" value="${mongo.cdr.collectionName}"/> </bean>
Joe Mobile Développement avec MongoDB - MongoFactory(3) @Service("mongoFactory") public class MongoFactory { @Autowired @Qualifier("mongo") private Mongo mongo; private DB db; private DBCollectioncollection; @Setter private String dbName; @Setter private String collectionName; @PostConstruct public void initCollection() throws IOException { db = mongo.getDB(dbName); collection = db.getCollection(collectionName); }
Joe Mobile Développement avec MongoDB - CdrService(3) @Autowired @Qualifier("cdrMongoFactory") private MongoFactorymongoFactory; private List<DBObject> getDBObjet(String msisdn, String dateDeb, String dateFin) { List<DBObject> listObj = new ArrayList<>(); BasicDBObject query = new BasicDBObject(); query.put( ATTR__ID, new BasicDBObject( "$lte", msisdn+dateFin ) .append( "$gte", msisdn+dateDeb ) ); DBCursor cursor = mongoFactory.getCollection().find(query); try { while(cursor.hasNext()) { listObj.add( cursor.next() ); } } finally { cursor.close(); }
Joe Mobile Développement avec MongoDB - Cdr(4) @Getter @Setter public class Cdr { private String msisdn; private String type; private String id; private String plateforme; private String pta; private String codeOperation; private String dateDeb; … private String categorieC; private String adresse; private String adresseTraduite; private String pays; private String ncv; private String categorieD; private List<CdrCompteur> compteurs; }
Joe Mobile Développement avec MongoDB - DBObject -> Cdr(5) private List<Cdr> dbObjectToCdr( final DBObjectobjDate ) { final List<Cdr> listCdrs = new ArrayList<>(); final List<DBObject> cdrs = ( List<DBObject> ) objDate.get( ATTR_CDRS ); for( final DBObjectobj : cdrs ) { Cdr cdr = new Cdr(); cdr.setMsisdn((String)objDate.get(ATTR_MSISDN)); cdr.setType((String)obj.get(ATTR_TYPE)); cdr.setId((String)obj.get(ATTR_ID_TICKET)); cdr.setPlateforme((String)obj.get(ATTR_PF)); … List<DBObject> objCpts = (List<DBObject>)obj.get(ATTR_COMPTEURS); if ( objCpts != null ) { List<CdrCompteur> compteurs = dbObjectToCompteurs(objCpts); cdr.setCompteurs(compteurs); } listCdrs.add(cdr); } return listCdrs; }
1 Utilisation principale de MongoDB 2 Développer avec MongoDB 3 Problèmes rencontrés 4 Autres utilisations et conclusion
Joe Mobile Évolution du Stockage • Espace utilisé en croissance
Joe Mobile Compression des CDR • Forte croissance de la base • La consultation étant focalisé que sur les dernières semaines • les anciens CDR ont été compressés • Compression de l’ordre de 75% • L’algorithme de récupération des données à adapter • Réorganisation régulière du stockage nécessaire • Reconstruction complète de chaque nœud • Procédure longue: 1h30-1h45/nœud • Taille utilisée divisée par 2
Joe Mobile Évolution du Stockage • Après compressions et reconstructions du stockage
1 Utilisation principale de MongoDB 2 Développer avec MongoDB 3 Problèmes rencontrés 4 Autres utilisations et conclusion
Joe Mobile Cas des actes clients et des reçus de paiements • Utilisation de MongoDB concluante sur les CDR • Extension à d’autres cas: • Reçus de paiements • Timeline des actes clients • Reçus de paiements: • Stockage binaire (HTML compressé de 2,16Ko) • Accès unitaire • 1,4 reçu de paiement en moyenne par mois et par ligne active • Insertion uniquement • Croissance proportionnelle en fonction du nombre de lignes actives • Identifiant: • Date (YY MM DD HH MI SS) • Séquence (5 chiffres) • Récupération directe d’un reçu de paiement
Joe Mobile Cas des reçus de paiements
Joe Mobile Cas des actes clients • Timeline des actes clients : • Structure variable en fonction des types d’actes • Accès à tous les actes du clients • 4/actes insérés moyenne par client et par mois • Insertion uniquement, jamais aucune mise à jour • Croissance proportionnelle en fonction du nombre de lignes actives • Identifiant: • Identifiant client (10 chiffres) • Date (YYYY MM DD HH MI SS) • Identifiant de l’acte (2 chiffres) • Récupération directes de tous les actes d’un client
Joe Mobile Cas des actes clients
MongoDB Conclusion et points forts/faibles • Utilisation très satisfaisante chez Joe Mobile! • Points forts : • Utilisation simple en développement (SAAS) • Moteur rapide • Stable en production • Monitoring intégré par 10gen • Pour les bases de production/pré-production • Points faibles: • Fragmentation du stockage • Stockage moyennement efficace (espace)
Bibliographie • Les bases de données NoSQL par Rudi BruchezÉditions Eyrolles • MongoDB in action par Kyle BankerEditions Manning