Ao usar um serviço da Web, você tem um cliente e um servidor:
- Se o servidor falhar, o cliente deve assumir a responsabilidade de lidar com o erro.
- Quando o servidor está funcionando novamente, o cliente é responsável por reenviá-lo.
- Se o servidor responder à chamada e o cliente falhar, a operação será perdida.
- 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.
- 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:
- Se o servidor falhar, a fila persistirá na mensagem (opcionalmente, mesmo que a máquina desligue).
- Quando o servidor está funcionando novamente, ele recebe a mensagem pendente.
- Se o servidor responder à chamada e o cliente falhar, se o cliente não reconhecer a resposta, a mensagem será mantida.
- Você tem contenção, pode decidir quantas solicitações serão tratadas pelo servidor (chame-o de trabalhador).
- 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.
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:
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.
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
fonte
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.
fonte
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.
fonte
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).
fonte