Dovrei usare un comando o un evento?


14

La differenza tra un comando e un evento nella comunicazione bus sembra un po 'vaga per me. So che i comandi dovrebbero essere eseguiti una sola volta, mentre un evento può essere gestito più volte, ma non sono ancora sicuro di quando utilizzare un comando o un evento.

Diamo un'occhiata a un esempio:

Quando un nuovo utente si registra in un'applicazione Web, dovremmo creargli un account e inviare un'e-mail di conferma.

Creazione dell'account : questo sembra essere il posto giusto per inviare un CreateUserCommandbus al bus e lasciare che un componente specializzato lo gestisca.

O forse questo non dovrebbe nemmeno essere implementato con una comunicazione bus asincrona? Vogliamo che l'utente sia in grado di accedere immediatamente all'applicazione. Con il bus non abbiamo alcuna garanzia quando verrà eseguito il comando.

Invio di e - mail : dopo che il componente ha creato l'account, vedo 2 possibilità

  1. Invia un altro comando al bus SendConfirmationEmailCommand
  2. Pubblica un evento UserAccountCreatedEvent

E poi lascia che il componente mittente e-mail lo afferri e al suo lavoro.

Da un lato, voglio che l'e-mail di conferma venga inviata una sola volta (utilizzare un comando), dall'altro lato, credo che possano esserci più componenti interessati agli utenti appena registrati. Un logger o forse un mittente SMS.

Come lo implementeresti?

Risposte:


16

In linea di principio, un comando descrive una richiesta che deve essere eseguita, mentre un evento descrive qualcosa che è accaduto:

  • Un comando richiede che un processore esegua alcune azioni e questa azione deve essere eseguita una sola volta da questo processore.

  • Un evento è la notifica di un'azione già eseguita o di un evento esterno. Diversi processori / agenti potrebbero essere interessati a conoscere l'evento. Molti di essi possono inoltre emettere comandi o azioni richiesti da questa notifica nel proprio dominio di responsabilità.

Nel tuo scenario, capisco che:

  • CreateUserCommand è un comando
  • UserAccountCreatedEventè un evento che deve essere emesso quando CreateUserCommandviene completato con successo dal servizio di gestione dell'account

Ora ci sono due possibilità:

  1. Il servizio di gestione dell'account si emette a SendConfirmationEmailCommandsul bus, poiché prevede che questo comando venga eseguito da un servizio più specializzato.
  2. Il servizio di gestione dell'account non fa altro che inviare la notifica dell'evento al completamento e lascia ad un altro servizio (ad es. Servizio di comunicazione, servizio di abbonamento, ecc ...) la decisione se e-mail / sms / ecc ... e se necessario emettere un SendConfirmationEmailCommandcomando che deve essere eseguito da alcuni gateway.

Se si è optato per un approccio al bus di servizio, sarebbe opportuno utilizzare la flessibilità che ciò consente, ovvero favorire l'opzione 2.


Grazie, questo chiarisce le cose. Altre due domande sull'opzione 2: 1. Come farà il servizio di gestione dell'account a sapere del completamento del comando? Credo che sia ascoltando gli eventi pubblicati da servizi specializzati al termine delle loro attività - qual è il vero scopo del servizio di gestione dell'account? Per ripubblicare gli eventi? Sembra ridondante. 2. Inoltre non capivo chi avrebbe dovuto emettere SendConfirmationEmailCommand. Servizio di gestione dell'account o "un altro servizio"?
Andrzej Gis,

1) la mia ipotesi era che il servizio di gestione dell'account eseguiva se stesso il lavoro e inviava l'evento al termine (cioè non ha riscontrato errori). Ma hai ragione: è possibile che il servizio di gestione dell'account invii comandi a un servizio di persistenza / database e debba monitorare l'evento di completamento del lavoro (ad esempio una risposta asincrona).
Christophe,

@gisek 2) in un bus di servizio, immagino che tu abbia servizi molto specializzati, ognuno con una responsabilità limitata. In questo caso, Gestione account esegue solo la creazione e notifica a chiunque sia interessato a farlo. Alcuni altri servizi dovrebbero quindi monitorare le cose per reagire. Ad esempio, potresti avere un responsabile della comunicazione, incaricato di applicare le regole aziendali per decidere quando e come comunicare gli eventi agli utenti. Se dovessi fare 1) +2) nello stesso servizio, difficilmente avresti bisogno di un bus di servizio.
Christophe,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.