Fila de mensagens vs. serviços da Web? [fechadas]

258

Sob quais condições alguém preferiria aplicativos conversando por meio de uma fila de mensagens em vez de por serviços da Web (quero dizer XML ou JSON ou YAML ou qualquer outra coisa sobre HTTP aqui, não um tipo específico)?

Eu tenho que falar entre dois aplicativos em uma rede local. Um será um aplicativo da web e precisará solicitar comandos em outro aplicativo (executando em hardware diferente). Os pedidos são como criar usuários, mover arquivos e criar diretórios. Sob quais condições eu preferiria XML Web Services (ou TCP direto ou algo assim) a usar uma fila de mensagens?

O aplicativo da web é Ruby on Rails, mas acho que a questão é mais ampla que isso.

Dan Rosenstark
fonte

Respostas:

315

Ao usar um serviço da Web, você tem um cliente e um servidor:

  1. Se o servidor falhar, o cliente deve assumir a responsabilidade de lidar com o erro.
  2. Quando o servidor está funcionando novamente, o cliente é responsável por reenviá-lo.
  3. Se o servidor responder à chamada e o cliente falhar, a operação será perdida.
  4. Você não tem contendas, ou seja: se milhões de clientes ligam para um serviço da Web em um servidor em um segundo, provavelmente o servidor será desativado.
  5. Você pode esperar uma resposta imediata do servidor, mas também pode lidar com chamadas assíncronas.

Ao usar uma fila de mensagens como RabbitMQ, Beanstalkd, ActiveMQ, IBM MQ Series, Tuxedo, você espera resultados diferentes e mais tolerantes a falhas:

  1. Se o servidor falhar, a fila persistirá na mensagem (opcionalmente, mesmo que a máquina desligue).
  2. Quando o servidor está funcionando novamente, ele recebe a mensagem pendente.
  3. Se o servidor responder à chamada e o cliente falhar, se o cliente não reconhecer a resposta, a mensagem será mantida.
  4. Você tem contenção, pode decidir quantas solicitações serão tratadas pelo servidor (chame-o de trabalhador).
  5. Você não espera uma resposta síncrona imediata, mas pode implementar / simular chamadas síncronas.

As filas de mensagens têm muito mais recursos, mas essa é uma regra prática para decidir se você deseja lidar com as condições de erro ou deixá-las na fila de mensagens.

sw.
fonte
1
Se a ligação SOAP / JMS for usada, também se obterá um acoplamento flexível nos serviços da web.
Koppor # 15/15
Para vários micro serviços no lado do servidor, qual deve ser o serviço da Web ou o serviço de enfileiramento preferido?
pratap Shivendra Singh
Dear @sw. , posso saber se isso significa que podemos colocar o MQ na frente de sites normais? Digamos que eu tenho o site Wordpress (pilha LAMP). Posso usar o MQ na frente do Apache para que as solicitações venham 1 após 1, em vez de todas ao mesmo tempo. Nesse caso, os clientes (navegadores) estão conectados ao MQ em vez do Apache, estou certo? Mas então, os navegadores mantêm a conexão HTTP aberta e continuam esperando o Apache responder? Por favor, me ajude a entender um pouco sobre isso. Aprecie sua bondade.
夏期劇場
@ 夏 期 劇場 qual é o seu caso de uso? O que você está tentando alcançar para beneficiar o usuário final usando o navegador?
sw.
Essas preocupações com as configurações de cliente / servidor ainda não estão entre a fila e o servidor e entre o cliente e a fila? Parece que o paradigma cliente / servidor ainda existe e agora em dois lugares.
imagineerThat
75

Houve uma quantidade considerável de pesquisas recentes ao considerar como as chamadas HTTP REST poderiam substituir o conceito de fila de mensagens.

Se você introduzir o conceito de um processo e uma tarefa como um recurso, a necessidade de camada de mensagens do meio começará a evaporar.

Ex:

POST /task/name
    - Returns a 202 accepted status immediately
    - Returns a resource url for the created task: /task/name/X
    - Returns a resource url for the started process: /process/Y

GET /process/Y
    - Returns status of ongoing process

Uma tarefa pode ter várias etapas para inicialização e um processo pode retornar o status quando pesquisado ou POST para um URL de retorno de chamada quando concluído.

Isso é simples e torna-se bastante poderoso quando você percebe que agora pode assinar um feed rss / atom de todos os processos e tarefas em execução sem nenhuma camada intermediária. Qualquer sistema de enfileiramento exigirá algum tipo de front-end da Web, e esse conceito foi incorporado sem outra camada de código personalizado.

Seus recursos existem até você excluí-los, o que significa que você pode visualizar informações históricas muito tempo após a conclusão do processo e da tarefa.

Você integrou a descoberta de serviços, mesmo para uma tarefa que possui várias etapas, sem protocolos extras complicados.

GET /task/name
    - returns form with required fields

POST (URL provided form's "action" attribute)

Sua descoberta de serviço é um formulário HTML - um formato legível universal e humano.

Todo o fluxo pode ser usado programaticamente ou por um ser humano, usando ferramentas universalmente aceitas. É um cliente orientado e, portanto, RESTful. Toda ferramenta criada para a web pode conduzir seus processos de negócios. Você ainda possui canais de mensagens alternativos, POSTando assincronamente para uma matriz separada de servidores de log.

Depois de considerar por um tempo, relaxe e comece a perceber que o REST pode apenas eliminar a necessidade de uma fila de mensagens e um ESB completamente.

http://www.infoq.com/presentations/BPM-with-REST

tempire
fonte
11
@tempire e quanto à tolerância a falhas e assim por diante? REST é bom, mas as extremidades desenvolvedor até a construção de middleware ele / ela mesma
Dan Rosenstark
10
@Yar A maioria das perguntas sobre 'e quanto a isso' pode ser reafirmada, 'como é tratada na web?'. A tolerância a falhas pode ser tratada por meio de balanceadores de carga ou até mesmo manipulação de registros de DNS. Há mais alguns problemas a serem resolvidos, como escalabilidade horizontal - a web não lida com isso de forma inerente (ataques de ddos, por exemplo).
tempire
8
@tempire, não há entrega garantida na Web, certo? Apertei enviar e rezo para que a mensagem chegue ao seu destino. Com um MQ, eu sei que, se eu chegar ao MQ, estou pronto. Ele tratará de receber a mensagem no destino.
Dan Rosenstark
10
@Yar considere o que significa "entrega garantida". É tão 'garantido' quanto o tempo de atividade da fila de mensagens. Substitua a fila de mensagens por servidores REST que tratam tarefas e processos como recursos, e você tem a mesma 'garantia' de qualquer outra coisa. Essencialmente, você ainda tem uma fila de mensagens, mas em um formato acessível padrão da Web, que pode ser monitorado usando qualquer ferramenta da Web.
tempire
16
@Yar - Acho que muitas pessoas não entendem a definição de problema que o MQ está tentando resolver o suficiente para considerar essas coisas. Eles entendem o MQ, mas isso é diferente de entender o espaço do problema. É uma questão generalizada, no entanto, porque acho que a maioria dos programadores e gerentes do mundo foi treinada para conectar peças em vez de soluções de engenharia.
tempire
32

As filas de mensagens são ideais para solicitações que podem levar muito tempo para serem processadas. As solicitações são colocadas na fila e podem ser processadas offline sem bloquear o cliente. Se o cliente precisar ser notificado sobre a conclusão, você poderá fornecer uma maneira de verificar periodicamente o status da solicitação.

As filas de mensagens também permitem escalar melhor ao longo do tempo. Isso melhora sua capacidade de lidar com rajadas de atividades pesadas, porque o processamento real pode ser distribuído ao longo do tempo.

Observe que as filas de mensagens e os serviços da web são conceitos ortogonais, ou seja, não são mutuamente exclusivos. Por exemplo, você pode ter um serviço da Web baseado em XML que atua como uma interface para uma fila de mensagens. Eu acho que a distinção que você procura é Filas de Mensagens versus Solicitação / Resposta; a última é quando a solicitação é processada de forma síncrona.

DSO
fonte
3
Sim, eu estava pensando isso: não é se eles estão bloqueando ou não. É se eles exigem tempos mais longos e / ou imprevisíveis para serem processados ​​... Considerando que eles são ortogonais, também é verdade que os serviços da Web podem ser usados ​​para solicitações longas (é claro, dropoff e pickup separados). No entanto, se você tiver o luxo de uma fila de mensagens, pode ser uma boa ideia.
Dan Rosenstark
Minha nova pergunta é: e se o processo fosse síncrono, mas assíncrono no tempo limite? Então, talvez os serviços da web sejam mais adequados.
Dan Rosenstark
27

As filas de mensagens são assíncronas e podem tentar várias vezes se a entrega falhar. Use uma fila de mensagens se o solicitante não precisar esperar por uma resposta.

A frase "serviços da web" me faz pensar em chamadas síncronas para um componente distribuído por HTTP. Use serviços da web se o solicitante precisar de uma resposta de volta.

duffymo
fonte
1
Obrigado por isso, sim, "entrega garantida", vou ter que pensar se isso é importante. Quero dizer, sincronização vs. assíncrona é uma espécie de gosto, em algum sentido. Embora haja casos claramente em preto e branco, há também um enorme meio cinza.
Dan Rosenstark
22

Eu acho que, em geral, você deseja um serviço da Web para uma tarefa de bloqueio (essas tarefas precisam ser concluídas antes de executarmos mais código) e uma fila de mensagens para uma tarefa sem bloqueio (pode demorar um pouco, mas não precisa esperar por isso).

Tobias Cohen
fonte
Os serviços da Web também oferecem métodos unidirecionais ( @Oneway ). Para receber a resposta, um serviço da web deve ser oferecido pelo cliente.
Koppor # 15/15