mardi 9 septembre 2014

Premier test de Broadway

Même si le nom est peu évocateur d'informatique, le propos est centré sur la mise en œuvre de DDD et des patrons CQRS et EventSourcing.

Vous comptiez que je parle de l'avenue de New York? Certains en parleraient bien mieux que moi.

Cela fait maintenant quelques mois que je me documente sur le Domain Driven Design (développement piloté par le domaine). Dès le début, j'ai été enchanté par la simplicité qu'apporte le langage omniprésent dans le dialogue avec les experts métiers. Les deux parties utilisent les mêmes termes pour désigner la même chose. Pas de transposition, pas de terme technique très obscur pour l'expert métier.

Puis le CQRS est venu avec. Il devient très vite évident tout comme l'utilité de l'EventSourcing. Après plusieurs présentations, lectures (en anglais la plupart du temps), exemples, il fallait commencer la mise en oeuvre.

Mais voilà, je travaille en PHP et la plus grande partie des exemples sont écrits en ".net" et l'un des nombreux langages de Microsoft. Que faire ? Passer au langage de Microsoft ? Ce n'est pas envisageable au travail, et à la maison je suis sur Mac. Il faut trouver des exemples en PHP ou écrire depuis zéro. 

Après quelques recherches, j'ai trouvé la librairie lite-cqrs. J'ai passé beaucoup de temps à essayer de comprendre son fonctionnement. Après un fork, beaucoup de modifications et quelques heures de travail, le résultat ne me convenait pas. Il me fallait autre chose de plus consistant.

Puis, au détour d'une question posée sur un réseau social, je découvre la librairie PHP nommée Broadway.
Seulement voilà, Broadway utilise Doctrine/DBAL pour l'EventStore, ElasticSearch pour le ReadModel et Mongo dB pour Saga.

Mes usages seraient plutôt vers un EventStore et un ReadModel dans deux bases de données distinctes.

Mais, avant de tenter l'ajout d'un ReadModel en base de données, j'ai souhaité essayer la mise en place de l'EventSourcing.

Dans mon test, j'ai un agrégat, un command handler (celui qui gère l'exécution des commandes), une commande et un évent.

Après quelques changements dans la configuration de mon application Symfony 2, tout a fonctionné du premier coup!!!


La prochaine fois, je vous parlerai de l'ajout du ReadModel utilisant Doctrine.

Aucun commentaire: