Como determinar se uma mensagem deve ser uma mensagem de comando ou mensagem de evento?

11

Dois padrões de integração corporativa são a mensagem de comando e a mensagem do evento . Estou trabalhando em um sistema no qual usamos mensagens não apenas para integração com outros sistemas, mas também para comunicação interna entre serviços. Deveria ser um sistema eventualmente consistente , e os serviços deveriam ser ignorantes um do outro (com exceção de alguns serviços para fins especiais). Dessa forma, tentamos evitar coisas que parecem chamadas de procedimento remoto (RPC ou RPI). Temos um sistema de middleware orientado a ônibus e mensagens, e todas as mensagens são transmitidas.

Nós tendemos a nomear nossas mensagens como eventos, ou seja, como uma frase no passado perfeita, por exemplo PurchaseOrderShipped. No entanto, os eventos geralmente são adicionados apenas quando alguns outros serviços precisam saber sobre eles e, no início, geralmente apenas um serviço se importa. Além disso, às vezes esse serviço emite um evento como resultado, que é ouvido pelo primeiro serviço. Portanto, se eu fizesse um diagrama da interação, ele se pareceria muito mais com o diagrama da mensagem de comando no link acima (ou mesmo com o diagrama RPC) do que com a mensagem do evento, embora, mais uma vez, isso não seja realmente implementado com mensagens diretas, mas transmitidas em um ônibus. Acrescente a isso o fato de eu ter visto recentemente algumas mensagens nomeadas como comandos, ou seja, uma frase no imperativo, por exemplo BillShippedPurchaseOrder.

O estranho é que os nomes das mensagens e a maneira como elas fluem não são alterados, seja ela nomeada como um evento ou como um comando. Então, como determinar se algo deve ser uma mensagem de comando ou um evento? Isso é apenas uma diferença de semântica e nomeação ou existe uma diferença real de implementação entre mensagens de comando e evento? Dado que todas as nossas mensagens são transmitidas, isso significa que nenhuma delas é realmente uma mensagem de comando?

Kazark
fonte

Respostas:

11

Há uma diferença sutil, mas importante, entre comandos e eventos. Um comando tem uma presunção de resposta, enquanto um evento não presume uma resposta, é apenas uma declaração.

Para ser menos abstrato:

ShipOrderé um comando e o remetente ShipOrderprovavelmente esperará uma resposta de algum tipo.
OrderShippedé uma declaração e é improvável que o remetente espere uma resposta, como GoodJob!é uma resposta inútil neste exemplo.

Se você está projetando seus sistemas para esperar apenas mensagens de eventos, não importa necessariamente para o design do sistema o que você chama de mensagens. Os desenvolvedores podem ficar confusos com o nome de uma mensagem, mas os sistemas responderão perfeitamente, independentemente da convenção que você segue para nomear as coisas.

Mas não parece que seus colegas desenvolvedores estejam seguindo o modelo de mensagem somente para eventos. Se os serviços esperam respostas para as "mensagens de evento" que estão enviando, estão realmente enviando mensagens de comando. Não é grande coisa, e posso pensar em muitos casos em que comandos como solicitações de informações seriam necessários. Mas você terá uma dor de cabeça semântica se esperava ver apenas as mensagens do evento.

A transmissão de mensagens realmente não afeta se uma mensagem é um comando ou um evento. Geralmente, você não transmite comandos, pois duplica o esforço. Mas não há nada a dizer que você não poderia. Os primeiros protocolos de rede transmitiam todos os pacotes e os receptores tinham que ser inteligentes o suficiente para saber quando ignorarmensagens pacotes que não lhes pertencem.


fonte
Como você implementa request for informationfuncionalidades? Parece natural usar algo como o getUserInfo(uid)que é uma mensagem de comando esperando uma resposta. Eu sei que as mensagens de comando introduzem acoplamento, mas, infelizmente, neste caso, não vejo como implementá-lo com mensagens de evento. Ou é bom ficar com mensagens de comando em ocasiões como essa?
problema é o seguinte
@ du369 Desculpe, mas não estou seguindo sua pergunta. Parece que você está tentando criar um comando, mas usando eventos?
Sim, praticamente isso. No link fornecido na resposta de Lee, a mesma funcionalidade é implementada de duas maneiras diferentes. Um está usando a CancelPolicyRequestmensagem que é um comando. A outra abordagem utiliza duas mensagens de evento, a saber InvoicePastDueNotificatione PolicyCancelledNotification. Então, eu estou querendo saber se é possível alterar comandos como o getUserInfo(uid)estilo de mensagens de eventos e como devo fazer isso.
problema é o seguinte
1
@ du369 Algo, em algum lugar, é necessário executar o Actionassociado ao comando. Existem duas etapas associadas a um comando. 1) O comando é necessário (por exemplo, a política expirou) e 2) executa o comando (por exemplo, cancela a política). Se o Actorque determina se o comando é necessário E pode ser executado, Actoré possível enviar mensagens de eventos. Caso contrário, o que determinar que o comando é necessário é necessário para enviar um evento de comando.
5

Uma mensagem de evento é algo que acabou de acontecer. Você está notificando o evento que acabou de acontecer.

Uma mensagem de comando é uma mensagem que espera que algo seja feito. Pode ou não esperar uma resposta.

Quando usar o que se resume ao acoplamento e a diferença só emergirá ao longo do tempo à medida que os sistemas evoluírem. Favorecer eventos sobre comandos resulta em menos acoplamento. O emissor do evento não se importa com o consumidor. Em um padrão de comando, o responsável pela chamada conhece e, portanto, depende da existência do provedor.

Bill Poole sugere evitar todas as mensagens de comando: http://bill-poole.blogspot.com.au/2008/04/avoid-command-messages.html

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

Lee Simpson
fonte
Lee, obrigado pela sua resposta, mas eu entendo a teoria por trás da definição de cada uma. Minha pergunta é como aplicar isso na vida real - quando notificar que algo aconteceu, o que geralmente resulta em algo sendo feito e quando solicitar que algo seja feito.
Kazark
Eu acho que tudo se resume ao acoplamento e a diferença só emergirá ao longo do tempo à medida que os sistemas evoluírem. Favorecer eventos sobre comandos resulta em menos acoplamento. O emissor do evento não se importa com o consumidor. Em um padrão de comando, o responsável pela chamada conhece e, portanto, depende da existência do provedor. Você leu os artigos de Bill Poole?
Lee Simpson
Lee, obrigado, isso é útil; na verdade, sugiro que você edite o conteúdo do seu comentário na sua resposta, incluindo um link para os artigos de Poole (que não tenho certeza de ter lido).
Kazark 12/01