REX utilisation de MongoDB chez Joe Mobile
280 likes | 485 Vues
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.
REX utilisation de MongoDB chez Joe Mobile
E N D
Presentation Transcript
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