Archives du mot-clé CQRS

DDD Day à Lyon

Alexandre Balmes propose à tous les développeurs PHP une journée (le samedi 30 janvier 2016 de 9H à 16H30) centrée sur la conception guidée par le domaine.

L’évènement est gratuit et la liste des intervenants annonce une belle journée. Pour s’inscrire, cela ce passe ici sur EventBrite.

J’y serais présent et j’ai hâte de rencontrer d’autre développeur PHP faisant du DDD pour de vrai !

Source : https://medium.com/@pockystar/ddd-day-1dab25711fb0

Des bases de DDD, CQRS et EventSourcing en Français

Voici une vidéo d’une réunion du MUG de Lyon (octobre 2015) qui vous présente en 1h25.

DDD : « Domain Driven Design » soit en français « Conception Guidé par le Domaine ».

CQRS : « Command Query Responsibility Segregation » en français « Ségrégation des Responsabilité entre Commande et Requête ».

Event Sourcing : Principe qui place l’évènement qui vient de se produire au coeur du système.

Quelques liens :

Bonne vidéo et n’hésitez pas à réagir dans les commentaires.

[Updated] DDD with Broadway and the Design Pattern State

Note : This article is the translate of this article. I use Google Translate for help me to write in english. Please, if you read wrong phrase send me the correct by one comment.

In a refactoring sprint, I found that my main aggregate class took much overweight.

I had exceeded 750 lines of code with, in many actions, a « switch » or a dozen « IF ». This did not please me very much because, if a change was required with this level, the amendment would be difficult.

Continuer la lecture de [Updated] DDD with Broadway and the Design Pattern State 

[MàJ] DDD avec Broadway et le Design pattern State

[English version]

Au cours d’un petit sprint de refactorisation, j’ai constaté que la classe de mon principal agrégat prenait beaucoup d’embonpoint.

J’avais dépassé les 750 lignes de code avec, dans beaucoup d’actions, soit un “switch » soit une petite dizaine de “IF”. Cela ne me plaisait pas beaucoup car, si une modification était demandée à ce niveau-là, la modification serait délicate.

Continuer la lecture de [MàJ] DDD avec Broadway et le Design pattern State 

[Updated] Symfony, Broadway and the replay event

Note : This article is the translate of this article. I use Google Translate for help me to write in english. Please, if you read wrong phrase send me the correct by one comment.

On of the main advantages of EventSourcing is the replay event for build a new view database or sync the an old view.

Do have you ever wondered how to go about not send emails on events issued by the aggregates ?

In my case, the dilemma is rather important because many things are based on events. If they are replayed, all treatments are rerun.

In my project, I use Broadway (by QandidateLabs) for implementing the CQRS/ES.

For use the default event bus, you must tag any services with broadway.domain.event_listener and extend this class Broadway\Processor\Processor.
All services will be injected into the event bus by a compiler pass. The latter takes 3 arguments: the event bus service identifier, the tag used for get all services to inject her, and the interface name that services must implement to be injected.

You can reuse the code to add a new event bus without write more code.

3 steps for separate into new bus all services necessary for refresh view.

1) Add a new event bus

2) Add new tag for all services to update the view. By exemple mon_bundle.domain.event_listener.
3) Run new compiler pass with new parameters

This is a SOLID code.

Your event listener must also be. One listener one responsibility.

Finally, during the retransmission of events, simply send them on the bus dedicated to replay events to perform the update only the view.
That’s done! You can retransmit all the events to update the view without having to change the configuration of the production application to prevent the resend of the emails.

Get the source code on github.

Now you can share your experiences in the comments.

[MàJ] Symfony, Broadway et le replay d’event

[English version]

L’un des principaux atouts qui reviennent souvent lorsque l’on parle de l’EventSourcing est la réémission des évènements afin de reconstruire la vue (par exemple). Cela peut être pour la construction d’une nouvelle base de vue ou le rafraichissement de la vue désynchronisée.

Ne vous est-il jamais arrivé de vous demander comment s’y prendre pour ne pas renvoyer les emails basés sur les évènements émis par les agrégats ?

Continuer la lecture de [MàJ] Symfony, Broadway et le replay d’event 

Personnaliser le nom de la table de l’eventstore de Broadway

Dans le cas fort probable où vous devez personnaliser le nom de la table où Broadway stocke les évènements, voici comment redéfinir le service :

YAML :

my_project.event_store.dbal

     class: Broadway\EventStore\DBALEventStore

     arguments: [@doctrine.dbal.default_connection, @broadway.serializer.payload, @broadway.serializer.metadata, ‘mon_event_store’]

broadway.event_store:

     alias: my_project.event_store.dbal

Vous pouvez également en profiter pour changer la connexion doctrine à la base de données. Attention toutefois, le changement ne s’appliquera pas à la commande d’initialisation de la table. La commande Symfony utilise la connexion « default ».

C’était mon astuce du jour. Et vous, en avez-vous une ?

4 mois avec Broadway

Voilà maintenant 4 mois que j’utilise au quotidien la librairie Broadway pour la gestion de l’EventStore dans un projet en production.

Il y a maintenant plus d’un million d’agrégats et il en est prévu quasiment 5 millions.

Comment cela réagit-il ?

Le système réagit très bien, même en cas de décalage de version entre l’EventStore et le ReadModele.

MS SQL Serveur encaisse plutôt bien la volumétrie, sachant qu’un agrégat a, au minimum, 10 events au cours de sa vie.

Quelles sont les difficultés rencontrées ?

La principale difficulté est liée à l’une des contraintes du projet qui demande l’usage intensif des scripts pour les traitements. Cela nécessite une gestion poussée des transactions SQL afin de limiter les problèmes d’annulation de transaction. En effet, l’EventStore est stocké en base de données et dispose d’une connexion distincte de celle du ReadModel.

Pour le stockage des Events, une transaction ne contient qu’un seul Event (selon le principe de l’Event sourcing, un Event non enregistré ne peut pas être émis sur le bus) alors que la transaction pour le Read Model est enregistrée à la fin du traitement batch effectué sur l’agrégat.

Dans tous les cas, si votre EventStore et votre ReadModel sont dans la même base de données, je vous conseille d’utiliser deux connexions distincte afin d’éviter des problèmes lors de ROLLBACK.

Une autre difficulté rencontrée est la faible résilience du bus de commande. En effet, si le Command Handler ou l’agrégat émet une Exception, les commandes émises ensuite ne seront pas traitées.

Dans mon cas, une commande est envoyée, son traitement dans le Command Handler lève une exception. Le script principal catch l’exception et émet une commande selon la situation. Cette dernière sera mise en file d’attente mais ne sera pas traitée.

Pour contourner le problème, la commande qui lève une exception doit émettre un Event indiquant l’erreur. Charge au script principal de recharger l’agrégat et de vérifier son état.

Il y a sûrement une meilleure méthode pour gérer plus efficacement ces cas. J’attends vos idées dans les commentaires.

Les points positifs ?

Le gros point positif est le suivi de toutes les modifications de l’agrégat tout au long de sa vie. Pouvoir remonter dans le temps et analyser ce qu’il s’est passé est un point très important. La possibilité d’ajouter des informations sur chaque Event est également un plus. Savoir comment a été modifié l’agrégat (ligne de commande ou interface web) et par qui sont parfois des informations très précieuses.

La possibilité de rejouer les événements passés en environnement de développement ou de test est très appréciable. Quoi de mieux que l’utilisation réelle pour vérifier le bon fonctionnement du système?

Est-il envisageable de l’utiliser dans d’autres projets ?

Oui, en utilisant une version stable de la librairie. Mais l’écoute des nouvelles librairies dans le domaine est important.

Quelques liens sur le sujet :

Suite du test de Broadway

La dernière fois, je me suis contenté de mettre en place l’EventStore. Cette fois, il y aura également le ReadModel.

La meilleure méthode est de configurer Saga et le ReadModel de  Broadway avec la valeur « in_memory ». Cela vous laisse toute latitude pour la réalisation de votre ReadModel.

La dernière version de mon exemple ajoute à l’application la partie sécurité. Chaque évènement sera enrichi par l’utilisateur l’ayant commandé.

Pour cela, il a valu mettre en place un MetadataEnricher.

Il est bien évident que vous pouvez réaliser beaucoup de choses avec cette librairie. N’hésitez pas non plus à réaliser un fork (fourche) pour proposer vos améliorations.

Je remercie la société Qualitate.com d’avoir ouvert le code source de sa librairie.

 

Bonus: Un deuxième exemple d’utilisation de la librairie : https://github.com/macintoshplus/school-cqrs-php/tree/broadway

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.