Dois-je utiliser une commande ou un événement?

14

La différence entre une commande et un événement dans la communication par bus me semble un peu vague. Je sais que les commandes ne doivent être exécutées qu'une seule fois, alors qu'un événement peut être géré plusieurs fois, mais je ne sais toujours pas quand utiliser une commande ou un événement.

Regardons un exemple:

Lorsqu'un nouvel utilisateur s'inscrit à une application Web, nous devons lui créer un compte et lui envoyer un e-mail de confirmation.

Création du compte - cela semble être le bon endroit pour envoyer un CreateUserCommandau bus et laisser un composant spécialisé le gérer.

Ou peut-être que cela ne devrait même pas être mis en œuvre avec une communication par bus asynchrone? Nous voulons que l'utilisateur puisse se connecter immédiatement à l'application. Avec le bus, nous n'avons aucune garantie quand la commande sera exécutée.

Envoi d'email - après que le composant a créé le compte, je peux voir 2 possibilités

  1. Envoyer une autre commande au bus SendConfirmationEmailCommand
  2. Publier un événement UserAccountCreatedEvent

Et laissez le composant expéditeur d'e-mails le saisir et le faire.

D'une part, je souhaite que l'e-mail de confirmation ne soit envoyé qu'une seule fois (utilisez une commande), d'autre part, je pense qu'il peut y avoir plusieurs composants intéressés par les utilisateurs nouvellement enregistrés. Un enregistreur ou peut-être un expéditeur de SMS.

Comment le mettriez-vous en œuvre?

Andrzej Gis
la source

Réponses:

16

En principe, une commande décrit une requête qui doit être exécutée, tandis qu'un événement décrit quelque chose qui s'est produit:

  • Une commande nécessite qu'une action soit exécutée par un processeur, et cette action ne doit être exécutée qu'une seule fois par ce processeur.

  • Un événement est la notification d'une action déjà exécutée ou d'un événement externe. Plusieurs processeurs / agents peuvent être intéressés à connaître l'événement. Plusieurs d'entre eux peuvent en outre émettre des commandes ou des actions requises par cette notification dans leur domaine de responsabilité.

Dans votre scénario, je comprends que:

  • CreateUserCommand est une commande
  • UserAccountCreatedEventest un événement qui doit être émis lorsqu'il CreateUserCommandest terminé avec succès par le service de gestion des comptes

Maintenant, il y a deux possibilités:

  1. Le service de gestion de compte émet lui-même un SendConfirmationEmailCommandsur le bus, car il s'attend à ce que cette commande soit exécutée par un service plus spécialisé.
  2. Le service de gestion de compte ne fait rien de plus que l'envoi de la notification d'événement à la fin, et laisse à un autre service (par exemple, service de communication, service d'abonnement, etc.) la décision d'envoyer ou non un e-mail / sms / etc ... et si nécessaire d'émettre une SendConfirmationEmailCommandcommande à exécuter par une passerelle.

Si vous avez opté pour une approche de bus de service, il serait logique d'utiliser la flexibilité que cela permet, c'est-à-dire de privilégier l'option 2.

Christophe
la source
Merci, ça clarifie les choses. Deux autres questions sur l'option 2: 1. Comment le service de gestion des comptes sera-t-il informé de l'exécution de la commande? Je crois que c'est en écoutant les événements publiés par les services spécialisés à la fin de leurs tâches - quel est le véritable objectif du service de gestion des comptes? Pour republier les événements? Cela semble redondant. 2. Je n'ai pas non plus compris qui est censé émettre le SendConfirmationEmailCommand. Service de gestion de compte ou "autre service"?
Andrzej Gis
1) mon hypothèse était que le service de gestion de compte a effectué lui-même le travail et a envoyé l'événement lorsqu'il s'est terminé avec succès (c'est-à-dire qu'il n'a rencontré aucune erreur). Mais vous avez raison: il est possible que le service de gestion de compte s'envoie des commandes à un service de persistance / base de données et doive surveiller l'événement de fin de tâche (par exemple une réponse asynchrone).
Christophe
@gisek 2) dans un bus de service, j'imagine que vous avez des services très spécialisés, chacun ayant une responsabilité limitée. Dans ce cas, la gestion des comptes n'effectue que la création et informe la personne intéressée que c'est fait. Un autre service surveillerait alors les choses pour réagir. Par exemple, vous pourriez avoir un responsable de la communication, qui serait chargé d'appliquer les règles métier pour décider quand et comment communiquer les événements aux utilisateurs. Si vous faisiez 1) +2) dans le même service, vous auriez à peine besoin d'un bus de service.
Christophe