Java Messaging Service (JMS) ou Api Rest

Boa!

Estou desenvolvendo uma API de mensagens que será consumida por um aplicativo cliente que as exibirá para seus respectivos usuários.

Eu utilizei a arquitetura Rest, porém me surigu uma dúvida. Seria mais correto utilizar a especificação Java JMS?

Pensando, eu cheguei a conclusão que JMS é mais utilizada em comunicação alto nível em relação ao cliente final, isto é, aplicação x aplicação. Já com Rest ficaria mais correto já que seria o consumo de um serviço, ou seja, a listagem de mensagens na aplicação cliente.

O que vocês acham? Qual seria a arquitetura idela, JMS ou Rest, neste caso?

Obrigado.

JMS e REST não são mutualmente exclusivos. Você pode utilizar REST e ter uma parte com JMS. Acho que você compreendeu JMS de uma forma não tão correta.

JMS serve para trabalhar de forma assíncrona do lado do servidor.

Por exemplo: imagine que você está confirmando uma compra numa loja online. Na hora que você clica no último botão, de finalizar a compra, é enviada uma requisição para o servidor, certo? Nesse momento, uma série de medidas tem que ser tomadas. Dentre elas:

  1. Separar o produto no sistema de estoque;
  2. Confirmar o cartão de crédito com um sistema de terceiros;
  3. Gerar a nota fiscal;

E muitas outras coisas. Se tudo isso fosse feito de forma síncrona, teríamos alguns problemas, como:

  1. O navegador ia ficar naquele estado de “carregando”, por um bom tempo, até tudo ser concluído e a resposta ser retornada para você;
  2. As vezes, os sistemas intermediários (como o do cartão de crédito e o da receita federal) não estão disponíveis an hora que você fez a compra. O que fazer? Cancelar tudo? Esperar um pouco (e deixar o cliente esperando) e tentar de novo?

Para isso que serve a abordagem assíncrona. Quando você clica em finalizar, o servidor te retorna imediatamente uma página dizendo: “Obrigado pela compra! Em alguns instantes vamos te mandar os detalhes por email”.

O que o servidor fez:

  1. Coletou os dados da compra e enviou para uma fila de processamento assíncrono. Essa chamada, falando de código, retorna imediatamente;
  2. Te devolveu a página de agradecimento

Existe outro sistema intermediário, chamado de MOM (Message-Oriented Middleware), que é o gerenciador dessa fila de processamento. O MOM é o responsável por gerenciar (receber e enviar) a comunicação assíncrona entre sistemas distribuídos (nesse caso, a loja e o processador de compras).

Um terceiro sistema, que seria o processador de compras, vai ficar consumindo mensagens do MOM. Toda vez que chega uma mensagem de uma compra nova, por exemplo, ele vai fazer os passos que eu citei anteriormente, a parte do cartão de crédito, nota fiscal, estoque, etc. Se algo der errado, basta tentar novamente depois de um tempo, ou dar um rollback na transação e avisar o cliente de que algo errado ocorreu (através de email, por exemplo).

Trabalhar de forma assíncrona não precisa ter necessariamente a ver com não deixar o usuário esperando. Existem arquiteturas onde a abordagem assíncrona pode melhorar o desempenho da aplicação de forma geral. Existem porém, casos onde todo o processo deve ser executado de forma síncrona. Depende da aplicação.

É exatamente isso que descreve a especificação JMS. Uma API para produção e consumo de mensagens assíncronas. Mensagem num sentido muito mais genérico do que uma mensagem de chat, significando qualquer unidade de trabalho à ser processada.

Para trabalhar com mensagens, uma abordagem interessante pode ser a utilização de web sockets.

1 curtida

Muito obrigado pela explicação, de forma tão clara.

Entendo o que você me disse e vou pesquisar a abordagem por meio de web socekts.

Já volto pŕa continuar o assunto.

Obrigado.

Opa!

Como fiquei de voltar, aqui estou.

Depois de pesquisar um pouco sobre o assunto, e dar uma lida em Push technology, nesse link da wikipedia, resolvi aplicar a seguinte solução:

Como eu gostaria de tornar o serviço de mensagens independente, resolvi implementar um serviço Rest para tal. Vai rodar um Spring-rest pelo Spring-boot e tal… (Queria aprender a utilizar, isso pesou muito).

A integração com a aplicação (“ecommerce”) vai ser via Restclient e utilizará o padrão observer. Quando o usuário logar, o EJB Stateful SessionBean de login se registrará em um EJB Singleton responsável pelo Schedule do pull que está configurado no SessionBean. A cada período de 10 segundos o Singleton dispara o método pull de todos os observers, fazendo com que as mensagens de cada usuário logado sejam recuperadas.

Para exibir automaticamente e assincronamente eu utilizei o componente do Primefaces <p:poll> para atualizar um span dentro de um h:button que exibe a qtd de mensagens. Isso pois neste sistema ainda utilizo o bom e velho (fucker) JSF.

Bom, hoje a solução está dessa forma, mas vou refatorar e repensar. Pelo prazo escasso, é a ideal.

Obriago @lvbarbosa.