Trabalhar com processos assíncronos tem se tornado cada vez mais comum, mesmo para resolver problemas que poderiam ser solucionados com processos síncronos. Neste post, irei descrever as minhas respostas para as perguntas que costumo fazer sobre o tema “Mensageria”, mencionado no post #0 da série.
Diversas soluções de problemas que demandam muito tempo e processamento para serem executados são criadas de forma assíncrona para dar uma resposta rápida para os usuários. Por exemplo, será que quando você usa o seu banco através da internet para fazer uma transferência de valores, um pagamento ou outra operação que ele disponibilize para você em uma sequência finita de passos, onde cada um desses passos ocorre até chegar naquela mensagem de sucesso ou falha te dizendo o que ocorreu com o processo, ele faz tudo isso antes de te dizer que foi feito ou diz que vai fazer e você já pode seguir fazendo outras coisas? Será que aquele pagamento ocorre na mesma hora?
Motivação
Existem inúmeras possibilidades para trabalhar com mensageria, seja para dar uma resposta rápida para o usuário de um sistema, fazer requisições para outros sistemas, trabalhar orientado a eventos e/ou outras necessidades de negócios que não precisam ficar aguardando um retorno enquanto o processo é executado.
A plataforma Java disponibiliza uma especificação para trabalhar com mensageria, o Java Message Service, mais conhecido como JMS, e conhecer ferramentas que aplicam e estão ligadas ao conceito de mensageria pode ser muito útil na caixa de ferramentas de um desenvolvedor.
Perguntas
- Qual é a diferença entre tópico e fila?
Resposta: Fila é um tipo de estruturas de dados, onde o primeiro que entra é o primeiro que sai. Quando estamos falando de processos assíncronos e mensageria que utilizam fila, isso significa que estes processos estão ordenados para serem executados em algum momento e não estão presos na mesma thread do fluxo principal de processamento que produziu a mensagem, este producer continua seu fluxo sem a necessidade de esperar que o processamento dos itens da fila finalize para seguir, além disso as filas entregam a mensagem somente para um consumidor. Os tópicos são a solução para cenários em que as mensagens enviadas precisam ser entregues a vários consumidores, então o producer dispara uma mensagem no tópico e vários consumers podem se inscrever para obter essa mesma mensagem.
- Como você lida com erros em processos de negócio assíncronos?
Resposta: O tratamento para os erros pode variar muito de acordo com os requisitos de negócio. O ideal é que todo processo feito de forma assíncrona possa ser desfeito de forma assíncrona também, além de permitir que seja revertido, também deve permitir que uma ou mais etapas sejam reprocessadas. Nesse sentido, é possível trabalhar com DLQ para reprocessar de forma automática ou fazer uma intervenção no código e reprocessar manualmente se necessário. Nesse sentido, para lidar com erros nesses processos assíncronos, costumo construir estratégias de rollback e reprocessamento.
Java Message Service (JMS) pode ser considerado um tema avançado em Java e, em minha experiência, trabalhar com processos assíncronos pode ser um grande desafio, principalmente pela mudança de mindset, já que geralmente aprendemos a criar programas síncronos no começo dos estudos e carreira como desenvolvedor.
Eu gosto de comparar o uso de JMS em Java com o uso de Promises em Javascript e, apesar de não serem a mesma coisa, parece que as explicações para diversas questões ficam mais simples quando eu as comparo. Quanto mais crio soluções assíncronas e implemento na prática, mais aprendo a lidar com as diversas situações que aparecem, então sugiro começar pensando em como e porque transformar uma solução síncrona em assíncrona e depois buscar ferramentas que te ajudam a aplicar esses conceitos.
Para saber mais
Gostou? Foi útil? Concorda ou discorda de algum ponto? Comenta ai e vamos aprender mais juntos.
Espero que te ajude 😉