Méritos de um sistema "Message Passing" vs. um sistema "Event Based"

27

Minha pergunta vem de uma perspectiva pouco instruída.

Quais são os méritos relativos de um sistema de " transmissão de mensagens " versus um sistema " baseado em eventos ".

Por que um escolheria um sobre o outro? Quais são os seus pontos fortes e fracos?

Eu gostaria de saber não apenas "na teoria", mas também "na prática".

EDITAR:

Problema específico :

Quero criar um sistema de componentes plugáveis ​​que se comportem como serviços de pequena escala (cada um executando alguma tarefa pequena e ou fornecendo informações).

Os serviços podem:

  • para que a saída de um serviço possa atuar como uma das entradas para outro
  • ter hierarquias de contenção para que um serviço possa ser contido por outro sem um relacionamento específico de entrada e saída, conforme mencionado na frase anterior

O objetivo do sistema é converter um único fluxo de eventos de baixo nível em outro sistema em informações e funcionalidades de nível superior, além de fornecer um canal de volta ao outro sistema, fornecendo uma única série de eventos.

Posso fornecer mais detalhes se isso não for suficiente.

Depois de olhar em volta um pouco mais. Isso e isso provavelmente descrevem melhor minha situação.

Parece que pode ser um bom ajuste para a minha situação: http://akka.io/

sylvanaar
fonte
3
Você precisará fornecer algum contexto. Geralmente, os sistemas baseados em eventos são baseados em um modelo de passagem de mensagens e os demônios estão nos detalhes. Em C #, por exemplo, um modelo de passagem de mensagens permite que a execução exista em um encadeamento diferente, onde eventos como são acionados no encadeamento de chamada.
Telastyn
1
Posso fazer a pergunta com base especificamente nos detalhes do meu projeto, mas queria torná-la geral o suficiente para que ela não se aplicasse apenas a mim.
Sylvanaar
1
Como @Telastyn comentou - "passagem de mensagem" e "evento" não são mutuamente exclusivos.
Oded
Embora exista uma tendência entre as semânticas descritas como baseadas em eventos e as descritas como passagem de mensagens , seu comportamento será específico para qualquer sistema. Você só precisa examinar o número de opções fornecidas na Visão geral dos sistemas de passagem de mensagens para ver que há pouca diferença entre eventos simples e algumas mensagens , mas a semântica de outras mensagens pode ser completamente diferente. Você precisa nos dizer qual o problema que está tentando resolver .
Mark Booth

Respostas:

17

Na minha experiência, a única diferença específica é que, na maioria dos sistemas de passagem de mensagens, o remetente da mensagem está ciente (e frequentemente declara) quem é o destinatário da mensagem.

Portanto, em vez de gerar um evento e qualquer pessoa que seja inscrita no evento, o remetente define algum ID do (s) destinatário (s) ou grupo lógico de destinatários e envia a mensagem diretamente a eles ou passa por um intermediário de mensagens (embora o sistema operacional possa ser visto como um intermediário de mensagens em um sistema baseado em eventos).

Obviamente, existe o caso de threading mencionado por Telastyn com a implementação de eventos do C #, mas você ainda pode criar seu próprio modelo de publicação / assinatura que é executado em diferentes threads.

Steven Evers
fonte
21

São maçãs e laranjas:

Um sistema orientado a eventos pode reagir a eventos passados ​​como mensagens (as mensagens neste contexto são dados não compartilhados imutáveis ​​implícitos ) à medida que os eventos são gerados. Este é um projeto puramente arquitetônico.

Um sistema de passagem de mensagens pode ser acionado por eventos que criam e transmitem as mensagens. Este é um design puramente de implementação.

Os dois não são mutuamente exclusivos.

Exemplo: Você pode implementar um design orientado a eventos em qualquer idioma, que também pode ser um ambiente de passagem de mensagens , como em Erlang.


fonte
11

Grande parte da confusão entre "passagem de mensagem" e "baseado em evento" tem a ver com detalhes arquitetônicos versus de implementação. Eu já vi (e escrevi) sistemas orientados a eventos que realmente usam mensagens fornecidas pelo SO para sua implementação. Acho que você está realmente se referindo a idéias arquitetônicas.

Como muitas pessoas já apontaram "passagem de mensagem" e "baseado em evento", não são realmente bons termos suficientes para evitar ambiguidade.

Quais são os méritos relativos de um sistema de "transmissão de mensagens" versus um sistema "baseado em eventos".

Passagem de mensagem

Vou começar supondo que, quando você diz um sistema de "transmissão de mensagens", está falando de um sistema em que um objeto passa uma mensagem para outro objeto específico. Quando penso em um sistema baseado nesse paradigma, geralmente penso em um sistema em que um objeto que detecta algo sabe quem precisa ser informado sobre algo. (Não estou especificando como ele sabe, apenas o que sabe.)

Esse tipo de arquitetura é muito bom para sistemas em que os produtores e consumidores são bem conhecidos. O produtor de uma mensagem sabe quem deve recebê-la ou o consumidor deve saber de quem receber a mensagem.

Se você estiver escrevendo um aplicativo bancário, é de se esperar que você realmente queira saber para quem está enviando suas transações e de quem elas são originárias.

Baseado em evento

O outro sistema em que acredito que você está pensando quando diz que um sistema "baseado em eventos" é aquele em que um objeto gera um "evento" sem saber quem (se alguém) responderá a ele.

Esse tipo de arquitetura orientada a eventos é muito bom para sistemas em que o produtor não se importa com quem consome o evento ou onde o consumidor realmente não se importa com quem produziu o evento.

Em geral, esses sistemas são ótimos onde você não conhece o relacionamento entre consumidores e produtores e espera que o relacionamento seja dinâmico.

Um sistema em que usei isso foi um sistema em que o aplicativo era realmente composto de módulos configurados dinamicamente (plug-ins) carregados em tempo de execução. Quando um módulo era carregado, ele se registrava para os eventos importantes. O resultado foi um sistema no qual foi muito fácil estender a funcionalidade.

Por exemplo, digamos que a condição A gerou um EA de evento que normalmente causava a resposta RA. O objeto que causou a resposta RA simplesmente se registrou para receber o evento EA e agiu sobre ele quando chegou. Agora, digamos que queremos adicionar uma nova resposta ao EA, chamada RA_1. Para fazer isso, simplesmente adicionamos um novo objeto que procura o EA e gera a resposta RA_1.

Aqui estão alguns exemplos (usando sua terminologia):

  • "passagem de mensagem" : seu chefe diz para você preencher sua folha de ponto.
  • "orientado a eventos" : a secretária do departamento envia um e-mail a todos, lembrando-os de que suas folhas de ponto estão vencidas hoje.
jwernerny
fonte
4
Isso me lembra ... é final de mês, então é melhor eu preencher minha folha de ponto.
Dave Nay
2

Na SOA, você tem o conceito de Mensagens de Comando e Mensagens de Eventos . Há uma necessidade de ambos.

No entanto, as mensagens de comando têm um acoplamento comportamental mais alto ao ponto final do destinatário, pois está solicitando explicitamente ao ponto final que execute alguma função. Ele não precisa estar vinculado a um terminal específico (isso pode ser configurado ou determinado em tempo de execução).

As mensagens de evento, por outro lado, não têm acoplamento comportamental entre o remetente / destinatário, pois o remetente não tem idéia do que um destinatário fará com a mensagem. Nem sequer sabe se alguém está inscrito no evento.

Para mais informações, você pode ler meu site de barramento de serviço aqui: http://www.servicebus.co.za


fonte
1

Na minha experiência, a maior diferença entre os dois é que as mensagens em um sistema de passagem de mensagens são objetos de primeira classe, enquanto os eventos em sistemas controlados por eventos são muito mais simples. As mensagens tendem a transportar informações, e essas informações podem ser transformadas, armazenadas, recuperadas e reenviadas. Os eventos tendem a transportar bits menores e mais focados de informação que são imediatamente consumidos e depois descartados. Eles tendem a ser enviados de uma fonte de eventos diretamente para um ou mais coletores de eventos, enquanto as mensagens são roteadas com mais frequência entre vários receptores e podem ser convertidas / traduzidas / agrupadas ou processadas em qualquer ponto ao longo da rota. Eles usam tecnologias semelhantes (ônibus, filas, filtros, etc.), mas são animais muito diferentes.

TMN
fonte
0

De um ponto de vista prático, as mensagens são normalmente implementadas como um bloco de memória que é copiado do espaço de endereço do remetente para o espaço de endereço do destinatário (ou de outro modo forçado a ser um objeto imutável), para que você obtenha segurança de thread imediatamente.

Em alguns casos de envio de mensagens, o remetente deve especificar o destinatário, mas em outros casos, você pode simplesmente postar uma mensagem em uma caixa de correio e qualquer pessoa pode ouvir as mensagens nessa caixa de correio, para que haja alguma flexibilidade na rigidez do acoplamento. Obviamente, você pode ter uma caixa de correio onde o contrato é "Vou postar uma mensagem nessa caixa de correio quando esse evento acontecer".

No caso de eventos, você está registrando um delegado ou retorno de chamada com o proprietário do evento. Na programação orientada a objetos, isso significa que o proprietário do evento mantém uma referência ao objeto que se registrou para receber o evento. Às vezes, isso pode levar a pesadelos da contabilidade, tentando descobrir qual objeto se esqueceu de cancelar o registro do manipulador de eventos. Isso significa que o destino não pode ser coletado como lixo até que o proprietário do evento seja coletado, mesmo que o destino não esteja mais fazendo algo útil.

Pessoalmente, eu escolheria a mensagem passando por eventos, exceto nos casos em que os eventos são forçados a você, como programação da GUI do Windows, etc.

Scott Whitlock
fonte
Apenas para resolver, resolvi o problema dos ciclos (seu pesadelo na contabilidade) no meu sistema de eventos C ++, armazenando o fraca_ptr e limpando qualquer ponteiro .expired () do conjunto de ouvintes sempre que o evento era chamado. O objeto de evento não possui o objeto de destinatário e essas semânticas do ponteiro deixam isso claro.
Robinson