¿Debo usar un comando o un evento?

14

La diferencia entre un comando y un evento en la comunicación del bus me parece un poco vaga. Sé que los comandos deben ejecutarse solo una vez, mientras que un evento se puede manejar varias veces, pero aún no estoy seguro de cuándo usar un comando o un evento.

Veamos un ejemplo:

Cuando un nuevo usuario se registra en una aplicación web, debemos crearle una cuenta y enviarle un correo electrónico de confirmación.

Creación de la cuenta : este parece ser el lugar correcto para enviar un mensaje CreateUserCommandal bus y dejar que un componente especializado lo maneje.

¿O tal vez esto ni siquiera debería implementarse con una comunicación de bus asíncrono? Queremos que el usuario pueda iniciar sesión en la aplicación de inmediato. Con el bus no tenemos garantía de cuándo se ejecutará el comando.

Envío de correo electrónico : después de que el componente crea la cuenta, puedo ver 2 posibilidades

  1. Enviar otro comando al bus SendConfirmationEmailCommand
  2. Publica un evento UserAccountCreatedEvent

Y luego deje que el componente del remitente del correo electrónico lo tome y haga su trabajo.

Por un lado, quiero que el correo electrónico de confirmación se envíe solo una vez (use un comando), por otro lado, creo que puede haber múltiples componentes interesados ​​en los usuarios recién registrados. Un registrador o tal vez un remitente de SMS.

¿Cómo lo implementaría?

Andrzej Gis
fuente

Respuestas:

16

En principio, un comando describe una solicitud que debe ejecutarse, mientras que un evento describe algo que ha sucedido:

  • Un comando requiere que un procesador realice alguna acción, y esta acción debe ser realizada solo una vez por este procesador.

  • Un evento es la notificación de alguna acción que ya se ejecutó o un evento externo. Varios procesadores / agentes pueden estar interesados ​​en conocer el evento. Varios de ellos pueden emitir más comandos o acciones requeridas por esta notificación en su dominio de responsabilidad.

En su escenario, entiendo que:

  • CreateUserCommand es un comando
  • UserAccountCreatedEventes un evento que debe emitirse cuando CreateUserCommandel servicio de administración de cuentas lo completa con éxito

Ahora hay dos posibilidades:

  1. El servicio de administración de cuentas se emite a SendConfirmationEmailCommanden el bus, ya que espera que este comando sea ejecutado por un servicio más especializado.
  2. El servicio de administración de cuentas no hace más que enviar la notificación del evento al finalizar, y deja a otro servicio (por ejemplo, servicio de comunicación, servicio de suscripción, etc.) la decisión sobre si enviar o no un correo electrónico / sms / etc ... y si es necesario emitir un SendConfirmationEmailCommandcomando para que lo realice alguna puerta de enlace

Si ha optado por un enfoque de bus de servicio, tendría sentido utilizar la flexibilidad que esto permite, es decir, favorecer la opción 2.

Christophe
fuente
Gracias, eso aclara las cosas. Dos preguntas más sobre la opción 2: 1. ¿Cómo sabrá el servicio de administración de cuentas sobre la finalización del comando? Creo que es al escuchar los eventos publicados por servicios especializados al finalizar sus tareas, ¿cuál es el verdadero propósito del servicio de administración de cuentas? ¿Para volver a publicar los eventos? Parece redundante 2. Tampoco entendí quién debe emitir el SendConfirmationEmailCommand. ¿Servicio de administración de cuentas o el "otro servicio"?
Andrzej Gis
1) supuse que el servicio de administración de cuentas realizó el trabajo y envió el evento cuando finalizó con éxito (es decir, no encontró errores). Pero tiene razón: es posible que el servicio de administración de cuentas se envíe comandos a un servicio de persistencia / base de datos y tenga que monitorear el evento de finalización del trabajo (por ejemplo, una respuesta asincrónica).
Christophe
@gisek 2) en un bus de servicio, me imagino que tiene servicios muy especializados, cada uno con una responsabilidad limitada. En este caso, Account Management solo realiza la creación y notifica a quien esté interesado que se ha realizado. Algún otro servicio supervisaría las cosas para reaccionar. Por ejemplo, podría tener un gerente de comunicación, que se encargaría de aplicar las reglas comerciales para decidir cuándo y cómo comunicar eventos a los usuarios. Si haría 1) +2) en el mismo servicio, difícilmente necesitaría un bus de servicio.
Christophe