« Bounded contexts » et persistance
Julien on jan 18th 2010
Dans mon billet précédant, je faisais remarquer que la persistance pouvait être implémentée de différente façon au sein d'un même système dans le cadre d'une approche SOA/CQRS. Laissez moi clarifier ce que j'entends par cela (ou plutôt ce que j'ai appris du maitre, Udi Dahan !).
Il est possible de faire varier la persistance selon (au moins) 2 axes.
Tout d'abord, nous pouvons utiliser un ORM (Nhibernate, Entity Framework, etc) ou avoir une approche plus directe de type ado.net ou procédure stockée. L'idée ici est d'adapter la solution au contexte spécifique du cas d'utilisation. Voici 2 exemples :
- On souhaite mettre à jour l'ensemble des commande en cours d'un client pour changer le mode de livraison. Ce processus doit inspecter les commandes non traitées pour vérifier si le poids des colis est compatible avec le nouveau mode de livraison.
=> Ici, le processus de selection ést plus ou moins complexe ET le nombre de commandes en cours est probablement réduit. Un modèle objet est probablement adapté au traitement. - Notre système stocke des cours de bourse. Une société annonce un "split" (chaque action sera "coupée" en X de sorte que 1 action avant le split = X actions après le split. => Une société peut être amené à faire ce genre de choses quand elle estime qu'une action est devenue trop onéreuse). On souhaite appliquer le coefficient sur l'ensemble des cours stockés en base pour faciliter certains calculs. On a donc potentiellement des centaines ou des milliers de cours à mettre à jour.
=> Ici, utiliser un modèle objet n'a aucun sens. Une simple requête SQL du type "UPDATE quotes SET price = (price / X) WHERE ..." est clairement plus simple à mettre en œuvre et sera surtout beaucoup plus optimisée !
Peut importe la solution retenue, le plus important est d'assigner la responsabilité du schéma et la lecture/écriture à un seul et unique bounded context. Ce point est capital : il nous garantit de ne pas intégrer différents systèmes par l'intermédiaire d'un point central (la base de données relationnelles) qui sera :
- difficile à faire évoluer, car couplé à l'ensemble du système
- un point de défaillance unique
- un goulot d'étranglement en terme de performances/montée en charge
Par conséquent, chaque bounded doit pouvoir faire évoluer sa persistance de façon transparente pour le reste du système, ce qui implique également que le support retenu peut être différent pour chaque cas (SQL, base objet, base de documents, fichier texte, etc).
Cependant, ce type de décisions sera fortement influencé par l'organisation interne du projet et la taille des équipes. Après tout, si chaque développeur choisit sa propre technologie, il sera difficile de coordoner le transfert de connaissance ou encore les backups. Il est donc tout à fait possible dans un premier temps de se limiter à un même support (ex : SQL Serveur) mais de séparer logiquement les bounded contexts en créeant des bases de données distinctes. Il faudra ensuite veiller à ce que les différents logins utilisé ait un accès limité à une seule et unique base.
Filed in Command Query Responsibility Segregation, Domain Driven Design | One response so far


Nieve jan 19th 2010 at 08:44 1
Bon, là on voit vraiment à quelle point CQRS est génial :) Je crois que le fait d’avoir un bdd (ou au moins une schéma) par contexte est l’un de plus grand « plus » (pluses, is that how you say it in French?).
deux petits question:
1. c’est juste un détail, néanmoins- puisque aujourd’hui on peut faire énormément de chose avec NH (je parle notamment de ‘Executable queries’ qui nous laisse faire même des ‘bulk operations’ si on veut- voir http://fabiomaulo.blogspot.com/2009/05/nhibernate-210-executable-queries.html), ne serait il tentant de éviter le plus possible les utilisation de ADO.NET?
2. Cela est une question pas aussi petite- si je bien compris, selon Udi on peut même ‘couper’ les contextes en Solutions, ce qui permet un mieux « loose coupling » (si je bien compris). Est ce que la sécurité (ou n’importe quel autre cross-contexte/global implémentations) devient pas un sujet un peu plus difficile à gérer? juste curieux :)