39
Mongo db / C# / Linq cas du site www.citizart.com Erwan de Cadoudal le 23 mars 2011

Mongo db with C#

Embed Size (px)

DESCRIPTION

Mongo db / C# cas du site www.citizart.com

Citation preview

Page 1: Mongo db with C#

Mongo db / C# / Linq cas du site www.citizart.com

Erwan de Cadoudal le 23 mars 2011

Page 2: Mongo db with C#

Agenda

Contexte du site CitizArt

Utilisation de Mongo db

Exemples de code simples

Evolutions

Page 3: Mongo db with C#

Agenda

Contexte du site CitizArt

Utilisation de Mongo db

Exemples de code simples

Evolutions

Page 4: Mongo db with C#

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

Page 5: Mongo db with C#

Home page – ajax search engine

Page 6: Mongo db with C#

Refine Facets and Search results

Page 7: Mongo db with C#

Detailed data sheet

Page 8: Mongo db with C#

General informations – form

Page 9: Mongo db with C#

Photos Gallery – form

Page 10: Mongo db with C#

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)

Page 11: Mongo db with C#

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 Map Reduce de Mongo

Permet le faceting (grouping)

Page 12: Mongo db with C#

Agenda

Contexte du site CitizArt

Utilisation de Mongo db

Exemples de code simples

Evolutions

Page 13: Mongo db with C#

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 Entity frmwk 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 Map Reduce capapilities (Group by)

Page 14: Mongo db with C#

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

Page 15: Mongo db with C#

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/

Page 16: Mongo db with C#

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

Page 17: Mongo db with C#

Comparaison rapide SQL / noSQLFonction SQL Server Mongo DB

Licence Microsoft Open Source

Install Setup 2Go (<1h) Copie 20Mo (<1min)

Admin SQLCmd.exe Management Studio

Mongo.exeMongo VUE

Langage SQL (T-SQL) Javascript (json)

Modèle de données

Tables / Relations Collections / Documents

Transactions OUI NON

Procédures Stockées

T-SQL Javascript server

Emplacement Centralisé Réparti

Montée en charge Verticale Horizontale (Sharding)

Driver Sql Driver / C#Oledb

Official C# driver (+fluent Mongo pour Linq)NoRM C# driver …

Binary Blob FS Grid

Page 18: Mongo db with C#

Agenda

Contexte du site CitizArt

Utilisation de Mongo db

Exemples de code simples

Evolutions

Page 19: Mongo db with C#

Server 1

Architecture très classique

Mongo DB1.6.5 / 64b

IIS 7

ASP.NET 4.0

NoRM C# Driver

HTTP

Page 20: Mongo db with C#

Un peu de code ?

Page 21: Mongo db with C#

Conception rapide - Exemple Un client avec 0 ou n adresses de facturation

Customer Id, First name, Last name Date of birth Billing addresses (collection de Address)

Address Street, Zipcode, City Country

Page 22: Mongo db with C#

Cas d’utilisations typiques

Page 23: Mongo db with C#

Documents imbriqués

Page 24: Mongo db with C#

C’est vraiment enregistré ? On lance la console mongo.exe

> show dbsNoRMSample1Admin> use NoRMSample1switched to db NoRMSample1> show collectionsCustomerNormHiLoKeysystem.indexes>

Page 25: Mongo db with C#

C’est vraiment enregistré ? On vérifie> db.Customer.find(){ "_id" : 1, "FirstName" : "Andrew", "LastName" : "SMITH", "BirthDate" : "Sun Oct 05 1980 00:00:00 GMT+0200", "BillingAddresses" : [ { "Street" : "151 rue Montmartre", "ZipCode" : "75002", "City" : "Paris", "Country" : "FR" }] }>

Page 26: Mongo db with C#

Plutôt graphique ? : Mongo VUE

Page 27: Mongo db with C#

OK. On peut relire maintenant ? Un peu de Linq

Page 28: Mongo db with C#

On peut chercher sur les objets imbriqués ? Un peu de Linq et expression Lambda pour le

fun

Page 29: Mongo db with C#

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)

Page 30: Mongo db with C#

Connexion à Mongo Utilisation d’une chaine de connexion

Page 31: Mongo db with C#

Objets en C# - Pas de magie, faisons simple

Page 32: Mongo db with C#

PersistantObject

Page 33: Mongo db with C#

Et c’est rapide ? A l’insertion

Source : Michael Kennedy, http://www.michaelckennedy.net/blog/CommentView,guid,c5043397-ad33-4141-9bb7-64707a9c987d.aspx

Page 34: Mongo db with C#

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 relationCustomer > Order

Page 35: Mongo db with C#

Batch Update field value

db.Customer.find("this.GeoCountyId === 7169") .forEach(function (customer) { customer.GeoCountyId = 7355; db.Customer.save(customer); })

update Customer set GeoCountryId = 7355where GeoCountryId = 7169

MONGO javascriptSQL

Page 36: Mongo db with C#

Agenda

Contexte du site CitizArt

Utilisation de Mongo db

Exemples de code simples

Evolutions

Page 37: Mongo db with C#

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 (HiLo algo) 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é / memory leak Corrigé en fermant proprement les connexions après chaque

utilisation

Page 38: Mongo db with C#

Prochaines Evolutions Passer sur Mongo 1.8

Geo Queries 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# driver

Fluent Mongo pour Linq

Page 39: Mongo db with C#

Pour en savoir plus Contactez

Erwan de Cadoudal, [email protected] www.citizart.com

Resources http://www.mongodb.org/ https://github.com/atheken/NoRM http://normproject.org/

Merci