1. Mongo db/ C# / Linq cas du site www.citizart.com Erwan de Cadoudal le 23 mars 2011
2. Agenda Contexte du site CitizArt Utilisation de Mongo db Exemples de code simples Evolutions
3. Agenda Contexte du site CitizArt Utilisation de Mongo db Exemples de code simples Evolutions
4. Le site en quelques slides Citizart.com Mise en relation de créateurs d’objets de mode et de déco avec des acheteurs et avec des professionnels de l’évènementiel Enjeux Exposer et permettre d’acheter des objets uniques et de qualité Faire connaître les créateurs et leurs talents Etre agile dans les développements
10. Les besoins fonctionnels Entités complexes : product, event, customer, email, showroom, photos gallery, … Beaucoup de formulaires de saisie Chaque créateur possède son espace de saisie (11 formulaires) Recherches Attributes, full text, refine by (facet) Site en évolution constante Besoin de souplesse dans l’ajout/modification des données et de leur structure Back office Gestion de listes d’autorités arborescentes Publication des produits Saisie de contenus (CMS)
11. Les réponses techniques Choix des technos ASP.NET / C# IIS SQL Server puis Mongo DB Objets fortement typés Permet la complétion de code dans Visual Studio Développement plus rapide quand on y est habitué Linq Permet l’écriture de requêtes complexes en C# sans avoir besoin de regarder la syntaxe json / javascript de mongo (ou SQL) Pas de maintenance de code dans la base (pb de versionning) Fonctions de MapReduce de Mongo Permet le faceting (grouping)
12. Agenda Contexte du site CitizArt Utilisation de Mongo db Exemples de code simples Evolutions
13. Historique Site initialement créé sur une racine NopCommerce ASP.NET / C# SQL Server Entity Framework Pourquoi me suis-je tourné vers Mongo db ? Lenteurs de Entityfrmwk avec de petits volumes de données Un jour un Save() n’a pas enregistré données sans rien dire Caractéristiques importantes de Mongo Rapidité à l’insertion et à la recherche Montée en charge assurée nativement Pas de setup avec un JRE ou gros installer, juste un « exe » Monitoring/Metrics du serveur MapReducecapapilities (Group by)
14. Faire le choix de Mongo Après plusieurs mois à surveiller la tendance noSQL Après avoir regardé Cassandra, Reddis, CouchDB Vu les grands noms qui utilisaient Mongo DB : Shutterfly, Foursquare, bit.ly, Source Forge, Etsy, … Mongo semblait bien pour du logging ou de l’insertion de masse, je voulais savoir si l’on pouvait également l’utiliser pour une application plus « classique » La meilleure façon de faire était de se jeter à l’eau
15. Le driver NoRM Avantages Open source écrit en C# Gère la persistance des objets avec Mongo Requêtes en Linq Commandes d’admin : indexs, drop, … Support de Mono (pour évolutions futures) Mais Communauté limitée Peu de commits depuis juillet 2010 (adopté en octobre 2010) https://github.com/atheken/NoRM/wiki/
16. Modèle et données Avant (en SQL server) Création de l’entité et des champs dans la base de données Ajout de la classe dans les objets métiers Ajout de l’entité « Collection » dans le Context Mapping dans le fichier « graphique » model.edmx Design des formulaires de saisie Maintenant (Mongo) Ajout de la classe dans les objets métiers Design des formulaires de saisie Conclusion Concentré sur le métier moins sur le paramétrage et le code de plomberie avec la base de données
21. Conception rapide - Exemple Un client avec 0 ou n adresses de facturation Customer Id, First name, Last name Date of birth Billingaddresses (collection de Address) Address Street, Zipcode, City Country
24. C’est vraiment enregistré ? On lance la console mongo.exe > show dbs NoRMSample1 Admin > use NoRMSample1 switched to db NoRMSample1 > show collections Customer NormHiLoKey system.indexes >
27. OK. On peut relire maintenant ? Un peu de Linq
28. On peut chercher sur les objets imbriqués ? Un peu de Linq et expression Lambda pour le fun
29. La partie déclarative du code C# C’est un language statique, donc on doit définir les objets que l’on manipule : Connexion Couches objets La classe d’aide que j’ai définie (PersistantObject)
33. Et c’est rapide ? A l’insertion Source : Michael Kennedy, http://www.michaelckennedy.net/blog/CommentView,guid,c5043397-ad33-4141-9bb7-64707a9c987d.aspx
34. Et c’est rapide ? A la recherche Source : Michael Kennedy, http://www.michaelckennedy.net/blog/CommentView,guid,c5043397-ad33-4141-9bb7-64707a9c987d.aspx Recherche par Id Recherche complexe avec relation Customer > Order
36. Agenda Contexte du site CitizArt Utilisation de Mongo db Exemples de code simples Evolutions
37. Les problèmes rencontrés Courbe d’apprentissage de Mongo DB Se défaire de ses habitudes des RDBMS Il me reste beaucoup de choses à apprendre Id non linéaires de NoRM (HiLoalgo) Obligé de développer un algo pour rendre les Id continus Bug dans NoRM Quand un champ existant dans Mongo et non en C# Correction faite dans le code NoRM Problème de stabilité / memoryleak Corrigé en fermant proprement les connexions après chaque utilisation
38. Prochaines Evolutions Passer sur Mongo 1.8 GeoQueries Data durability Montée en charge Poser des index Passer les images sur GridFS Envisager d’utiliser le Sharding Cloud pour l’applicatif Si NoRM non maintenu sur la durée et bugs bloquants regarder du côté de Mongo C# driverFluent Mongo pour Linq
39. Pour en savoir plus Contactez Erwan de Cadoudal, edecadoudal@eca-solutions.fr www.citizart.com Resources http://www.mongodb.org/ https://github.com/atheken/NoRM http://normproject.org/ Merci