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?
request for information
funcionalidades? Parece natural usar algo como logetUserInfo(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?CancelPolicyRequest
mensaje que es un comando. El otro enfoque utiliza dos mensajes de evento, a saber,InvoicePastDueNotification
yPolicyCancelledNotification
. Entonces, me pregunto si es posible cambiar comandos como elgetUserInfo(uid)
estilo de los mensajes de eventos y cómo se supone que debo hacer eso.Action
asociado 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). SiActor
eso determina si se necesita el comando Y puede ejecutarse, entoncesActor
puede enviar mensajes de eventos. De lo contrario, lo que determine que se necesita el comando es necesario para enviar un evento de comando.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/
fuente