Une fois n'est pas coutume, le billet du jour va traiter d'une base NoSQL: MongoDB.
Il s'agit d'un petit résumé de ma journée à la conférence MongoFR à la Cantine. La conférence proposait de nombreuses présentations réparties dans deux parcours différents.
Accueil
Une belle journée qui commence avec un petit déjeuner permettant déjà d'échanger un peu. Ce dernier est suivi par une présentation rapide des sponsors 10gen (10gen est la boîte qui développe MongoDB) et AF83.
Et c'est parti ...
Construire votre première application avec MongoDB de Antoine Girbal, Software Engineer, 10gen
Le titre était un peu trompeur, cette session présentait les solutions NoSQL en général et MongoDB.
SQL et ses limites
Le speaker a d'abord présenté les limites des BD relationnels:
Ces bases de données sont souvent associées à des systèmes de cache comme Memcached pour pallier à certains problèmes.
D'autre part, pour le BI, les BD montrent aussi leurs limites et il faut souvent passer à d'autres structures (comme OLAP).
Le NoSQL veut résoudre ces problématiques. NDM: Rien que ça ...
NoSQL
Les bases NoSQL:
- n'ont pas de dépendance, pas de relation entre les données
- sont axées sur les performances et la scalability
- facilitent la modélisation des données
- offre une alternative à la syntaxe SQL (pour ceux qui n'apprécient pas)
- proposent des schémas flexibles (les documents n'ont pas forcément la même structure)
Cependant, les bases NoSQL, ne proposent pas:
- de jointures
- de système de transaction complexe (pour permettre la scalabity horizontal)
A savoir:
- scalabity horizontal: faire faire le boulot par plusieurs machines.
- scalabity vertical: faire faire le boulot par une machine plus puissante.
MongoDB
Les documents manipulés sont au format JSON et stocké en BSON (où le B signifie binaire). Le BSON permet d'accélérer les accès.
Ces principales features:
- Shell avancé (JS)
- Système de requêtes complexes
- Update atomique
- Indexation des données
- Aggrégation et Map/Reduce
- Stockage sur un système de fichier non limité en taille et non limité en nombre de fichier (GridFS)
MongoDB propose simplement de mettre en place un système de réplication avec un maître en écriture et plusieurs esclaves en lecture (qui élisent le maître).
MongoDB permet nativement le sharding. NDM: On en reparle après.
MongoDB met à disposition beaucoup de drivers pour différents languages. La documentation est bien fournie (mais un peu fouillie).
Schema Design: Data as Documents de Nosh Petigara, Director of Product Strategy, 10gen
Cette présentation dans la langue de shakespeare donnait quelques pistes pour stocker ses données dans MongoDB.
Dans les bases SQL, la dénormalisation est souvent présente pour des raisons de performance (ou simplement par erreur !).
MongoDB permet:
- de stocker des documents riches
- de faire des recherches avec un système de requêtre proche de SQL
- de faire des mises à jour atomiques
L'application pilote le schéma et non l'inverse.
Il est important de penser:
- à l'indexation du schéma
- de dénormaliser judicieusement ("documents stockés dans des collections différentes" versus "documents embarqués au sein d'autres documents"
- à faire des jointures applicatives
Encore quelques conseils en vrac:
- Quand on dénormalise, avoir en tête la durée de vie des données. Un utilisateur change rarement de nom par exemple.
- Utiliser des attributs supplémentaires dans les documents pour optimiser les recherches.
- Ne pas stocker dans une même collection des documents trop hétérogènes
- Eviter de créer/supprimer les documents pour les mettre à jour
- Eviter d'avoir des documents qui changent beaucoup de taille
MongoDB et Java en pratique de Katia Aresti
Cette présentation était un retour d'expérience sur l'utilisation de MongoDB sur un site web développé en Java.
En résumé:
- simple et ludique
- rapide montée en compétence
- adapation naturelle à la philosophie (stockage des objets/documents)
- les tests unitaires sont plus simples à écrire qu'avec un SGBDR classique
- fonctionne bien avec Java (le driver officiel devrait bientôt voir des évolutions notables suite à un rapprochement avec un autre projet)
- les fonctions de géolocalisations sont utiles et efficaces (mais pourraient être plus poussées)
Avancées dans la boîte à outils Ruby de Yann Klis
J'avais le choix entre Drupal et Ruby. J'ai opté pour Ruby !
Cette présentation était une présentation des différents outils proposés pour Ruby.
J'ai pas grand chose à dire sur cette présentation. Il y a eu pas mal d'échanges sur les différents drivers proposés par la communauté et par MongoDB.
D'une façon générale, les drivers sont perfectibles et il faut bien se tenir au courant des évolutions. Cette problématique n'est pas liée au Ruby mais se retrouve dans d'autres languages.
Un petit outil sympa: mongosniff qui permet notamment de suivre les requêtes qui arrivent.
MongoDB, NoRM & ASP.NET / C# / Linq : cas client, premier retour d'expérience de Erwan de Cadoudal
Un autre retour d'expérience sur le développement d'un site web mais cette fois avec du .NET.
Le speaker de qualité ;-) présente comment il a utilisé MongoDB sur son le site en ASP.NET.
Pour
- simplicité de développement
- rapidité d'insertion
- montée en charge assurée nativement
- installation aisée
- accès simple aux métriques et au monitoring du serveur
- possiblité de mettre en place du Map/Reduce
Contre
- "driver officiel" versus "driver NoRM" (communauté et activité un peu faible)
La présentation a bien mis en avant la simplicité d'utilisation de cette solution et montre bien qu'elle mérite qu'on s'y intérèsse. J'en profite d'ailleurs pour parler d'une présentation sur MongoDB réalisée au Techdays par Rui disponible en ligne.
Un petit outil sympa: mongovue qui propose une GUI pour travailler sur MongoDB.
Indexer les données et optimisation des requêtes de Antoine Girbal, Software Engineer, 10gen
La session (en VO) portait sur l'indexation d'une base MongoDB. Elle sera en fait plus théorique que pratique.
Je n'en dirais donc pas grand chose aujourd'hui.
A noter, que comme avec les SGBD qui se respectent, la fonction "explain" permet d'avoir le plan d'exécution d'une requête.
Scaling with MongoDB de Antoine Girbal, Software Engineer, 10gen
Cette session (en VO) portait sur le sharding.
Le sharding est un processus qui permet de répartir les données et la charge entre différents serveurs. Il permet la scalabily horizontale.
Par exemple, on pourrait répartir les données entre différents serveurs en répartissant les utilisateurs à partir du nom de famille.
Les raisons de la mise en place de la scalabily horizontale sont les suivantes:
- Le scaling vertical est limité
- Il est plus difficile de scaler verticalement que horizontalement dans le cloud
- Il est plus pérenne de scaler horizontalement que verticalement
La présentation a ensuite continué sur comment mettre en place le sharding et quelle était l'architecture proposée par MongoDB.
J'en dirais pas davantage mais on voit bien que MongoDB propose pas mal de choses sur le sujet nativement.
ETL et indexation solr sur mongodb de Thibaut Barrere
Encore un retour d'expérience. Cette fois-ci c'est en Ruby !
Le projet permet d'afficher les livres mentionnés dans stackoverflow (3GB de données) et hackernews (1GB de données). La présentation portait sur l'utilisation de MongoDB notamment dans l'ETL maison utilisé pour le projet.
MongoDB est utilisé à deux étapes:
- d'une part pour stocker/manipuler les données extraites dans un format brut
- d'autre part directement par le site web
Pour
- absence de schéma - économie d'échelle
- richesse du requêtage
- upsert (update ou insert géré de façon transparente). Ceci permet d'avoir un comportement identique lors d'un import de données complet ou incrémental.
- API de manipulation des tables et base de données
- scalabilité, sharding et Map/Reduce
Contre
- Rien ... enfin, je n'ai rien noté !
La présentation a ensuite parlé de l'indexation retenue pour la recherche plein-texte:
- MongoDB: trop limité
- Sphynx: trop complexe
- Solr: gagnant
On a même eu droit à la citation de la journée: MongoDB est à SQL ce que Ruby et à Java !
Bon en résumé, c'est un beau projet (mais connaissant le speaker cela ne m'étonne pas).
Utilisation de mongoDB avec node.js de Vincent Hetru
Je n'ai pas pu assister en entier à cette présentation car je devais partir.
On y a parlé du projet très en vogue Node.JS et de son utilisation avec MongoDB.
Ce projet est à surveiller mais ne semble pas encore prêt pour la production.
Conclusion
La journée MongoFR s'arrête ici pour moi. J'ai ensuite filé voir une présentation chez Microsoft dans le cadre de l'Azure Camp.
Pour conclure, c'était une belle journée bien remplie et bien organisée. L'ambiance était sympa et propice à l'échange. En ce qui concerne MongoDB, elle apparait comme une base NoSQL abordable et qui mérite l'interêt.
De l'avis des développeurs, elle est agréable à utiliser et simplifie pas mal les développements. Elle semble avoir atteint un certain niveau de maturité.
En bonus
La communauté open source Azure française dont j'ai pu rencontrer certains membres chez Microsoft propose de l'Azure gratuit sur son site ZeCloud.
Les informations suivantes sont à prendre en compte avec les RIA Services CTP July, je n'ai pas testé avec la dernière version disponible de ces derniers jours.
J'ai une application cliente en silverlight qui utilise les RIA Services pour la validation, la récupération, l'insertion
et la suppression des données.
Lors de la compilation, un DomainContext est créé côté client avec les méthodes créées dans le DomainService sur le Serveur. Pour communiquer avec le serveur , le DomainContext utiliser un HttpHandler " DataService.axd " qui va se charger de rediriger les appels à la class " DataServiceFactory", comme configuré dans le web.config:
<add path="DataService.axd" verb="GET,POST" type="System.Web.Ria.DataServiceFactory, System.Web.Ria, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" validate="false"/>
Plus...