¿Cómo determinar si un mensaje debe ser un mensaje de comando o un mensaje de evento?

11

Dos patrones de integración empresarial son el mensaje de comando y el mensaje de evento . Estoy trabajando en un sistema en el que utilizamos la mensajería no solo para la integración con otros sistemas, sino también para la comunicación interna entre servicios. Se supone que es un sistema eventualmente consistente , y se supone que los servicios se ignoran entre sí (con la excepción de un par de servicios de propósito especial). Como tal, tratamos de evitar cosas que parecen llamadas a procedimientos remotos (RPC o RPI). Tenemos un bus y un sistema de middleware orientado a mensajes, y todos los mensajes se transmiten.

Tendemos a nombrar nuestros mensajes como eventos, es decir, como una frase en el pasado perfecto, por ejemplo PurchaseOrderShipped. Sin embargo, los eventos a menudo se agregan solo cuando algunos otros servicios necesitan saber sobre ellos, y al principio, a menudo solo un servicio se preocupa. Además, a veces ese servicio emite un evento como resultado, que es escuchado por el primer servicio. Por lo tanto, si tuviera que diagramar la interacción, se parecería mucho más al diagrama para el mensaje de comando en el enlace anterior (o incluso al diagrama RPC) que al del mensaje de evento, aunque una vez más, esto no se implementa realmente con mensajería directa pero transmitida en un autobús. Agregue a eso el hecho de que recientemente he visto algunos mensajes que se nombran como comandos, es decir, una frase en el imperativo, por ejemplo BillShippedPurchaseOrder.

Lo extraño es que los nombres de los mensajes y la forma en que fluyen no cambian si se nombra como un evento o como un comando. Entonces, ¿cómo se determina si algo debería ser un mensaje de comando o un evento? ¿Es esto solo una diferencia de semántica y denominación, o hay una diferencia de implementación real entre los comandos y los mensajes de eventos? Dado que todos nuestros mensajes se transmiten, ¿eso significa que ninguno de ellos son realmente mensajes de comando?

Kazark
fuente

Respuestas:

11

Hay una sutil, pero importante diferencia entre comandos y eventos. Un comando tiene una presunción de respuesta, mientras que un evento no supone una respuesta, es simplemente una declaración.

Para ser menos abstracto:

ShipOrderes un comando y el remitente de ShipOrderprobablemente esperará una respuesta de algún tipo.
OrderShippedes una declaración y es poco probable que el remitente espere una respuesta, ya que GoodJob!es una respuesta inútil en este ejemplo.

Si está diseñando sus sistemas para que solo esperen mensajes de eventos, entonces no necesariamente le importa al diseño del sistema lo que llama los mensajes. Los desarrolladores pueden confundirse por el nombre de un mensaje, pero los sistemas responderán bien independientemente de la convención que sigas para nombrar las cosas.

Pero no parece que sus colegas desarrolladores estén siguiendo el modelo de mensaje de solo evento. Si los servicios esperan respuestas a los "mensajes de evento" que están enviando, entonces realmente están enviando mensajes de comando. No es un gran problema, y ​​puedo pensar en muchos casos en los que se requerirían comandos como solicitudes de información. Pero tendrá un dolor de cabeza semántico si espera ver solo mensajes de eventos.

La transmisión de mensajes realmente no tiene un impacto en si un mensaje es un comando o un evento. En general, no difunde comandos ya que duplica el esfuerzo. Pero no hay nada que decir que no pudiste. Los primeros protocolos de red transmitieron cada paquete y los receptores tuvieron que ser lo suficientemente inteligentes como para saber cuándo ignorarmensajes paquetes que no les pertenecían.


fuente
¿Cómo implementan las request for informationfuncionalidades? Parece natural usar algo como lo getUserInfo(uid)que es un mensaje de comando que espera una respuesta. Sé que los mensajes de comando introducen el acoplamiento, pero lamentablemente en este caso, no veo cómo implementarlo con mensajes de eventos. ¿O está bien atenerse a los mensajes de comando en algunas ocasiones como esta?
du369
@ du369 Lo siento, pero no estoy siguiendo tu pregunta. ¿Parece que estás intentando crear un comando pero estás usando eventos?
Sí, más o menos eso. En el enlace proporcionado en la respuesta de Lee, la misma funcionalidad se implementa de dos maneras diferentes. Uno está usando el CancelPolicyRequestmensaje que es un comando. El otro enfoque utiliza dos mensajes de evento, a saber, InvoicePastDueNotificationy PolicyCancelledNotification. Entonces, me pregunto si es posible cambiar comandos como el getUserInfo(uid)estilo de los mensajes de eventos y cómo se supone que debo hacer eso.
du369
1
@ du369 Algo, en algún lugar tiene que realizar lo Actionasociado con el comando. Hay dos pasos asociados con un comando. 1) ¿Se necesita el comando (por ejemplo, política expirada) y 2) ejecutar el comando (por ejemplo, cancelar la política). Si Actoreso determina si se necesita el comando Y puede ejecutarse, entonces Actorpuede enviar mensajes de eventos. De lo contrario, lo que determine que se necesita el comando es necesario para enviar un evento de comando.
5

Un mensaje de evento es algo que acaba de suceder. Estás notificando el evento que acaba de suceder.

Un mensaje de comando es un mensaje que espera que se haga algo. Puede o no esperar una respuesta.

Cuándo usar lo que se reduce al acoplamiento y la diferencia solo surgirá con el tiempo a medida que los sistemas evolucionen. Favorecer eventos sobre los comandos resulta en menos acoplamiento. El emisor del evento no se preocupa por el consumidor. En un patrón de comando, la persona que llama lo sabe y, por lo tanto, depende de la existencia del proveedor.

Bill Poole sugiere evitar todos los mensajes de comando: http://bill-poole.blogspot.com.au/2008/04/avoid-command-messages.html

http://bill-poole.blogspot.com.au/

Lee Simpson
fuente
Lee, gracias por tu respuesta, pero entiendo la teoría detrás de la definición de cada uno. Mi pregunta es cómo aplicar esto en la vida real: cuándo notificar que algo ha sucedido, lo que a menudo resulta en que se haga algo, y cuándo solicitar que se haga algo.
Kazark
Creo que todo se reduce al acoplamiento y la diferencia solo surgirá con el tiempo a medida que evolucionen los sistemas. Favorecer eventos sobre los comandos resulta en menos acoplamiento. El emisor del evento no se preocupa por el consumidor. En un patrón de comando, la persona que llama lo sabe y, por lo tanto, depende de la existencia del proveedor. ¿Has leído los artículos de Bill Poole?
Lee Simpson el
Lee, gracias, eso es útil; de hecho, le sugiero que edite el contenido de su comentario en su respuesta, incluido un enlace a los artículos de Poole (que no estoy seguro de haber leído).
Kazark