O que é RabbitMQ?
Em qualquer aplicativo nativo da nuvem, os microsserviços devem se comunicar para obter todas as informações necessárias para responder aos usuários. Você deve certificar-se de que essa mensagem é robusta, mesmo quando há problemas de rede ou falhas entre as integrações. RabbitMQ é uma ferramenta que você pode usar para aumentar a confiabilidade das mensagens.
Em seu varejista de equipamentos para atividades ao ar livre, você está progredindo rapidamente com seus microsserviços. No entanto, nos testes de aplicativos, algumas chamadas de um microsserviço para outro parecem ser perdidas. Você gostaria de garantir que esse problema não surja em seu ambiente de produção, onde a reputação da sua empresa está em jogo.
Nesta unidade, você verá como o RabbitMQ pode criar uma plataforma de comunicação flexível e resiliente para microsserviços.
Por que usar um agente de mensagens em um aplicativo nativo da nuvem?
Os aplicativos nativos da nuvem consistem em microsserviços independentes, muitas vezes criados por equipes separadas e usando tecnologias e linguagens diferentes. Cada equipe tem seus próprios sprints de desenvolvimento e cronogramas de atualização e pode implantar correções e novos recursos continuamente. No entanto, quando uma solicitação chega de um usuário, o microsserviço que a recebe quase sempre precisa ligar para outros microsserviços e serviços de suporte e receber respostas deles para formular a resposta completa.
Obviamente, o formato e o esquema dessas solicitações e respostas entre serviços devem ser acordados entre as equipes de desenvolvimento e mudar raramente. Eles geralmente são implementados como APIs REST. Você deve implementar preferencialmente novos recursos de cada interface sem alterar os métodos e parâmetros existentes. No entanto, se você optar por fazer com que os microsserviços se comuniquem diretamente, vários problemas podem surgir:
- Quando um microsserviço de destino está offline ou ocupado, o que acontece com as mensagens enviadas a ele? Quais são as consequências da perda de mensagens?
- Como você pode enviar a mesma mensagem para mais de um destino?
- Se um microsserviço estiver sendo executado em mais de um contêiner, para qual você deve enviar mensagens?
Um agente de mensagens é um middleware que aborda esses problemas. Os serviços enviam mensagens para o agente de mensagens em vez de diretamente para um destino. O corretor armazena-os em filas pela ordem em que chegam. Os serviços de destino assinam essas filas e recebem mensagens, uma de cada vez, para processamento.
Se o serviço de destino não estiver disponível, o microsserviço de envio ainda poderá colocar mensagens na fila. Quando o destino é reiniciado, ele continua a pegar mensagens da fila, do mesmo ponto. Nenhuma mensagem é perdida, embora o remetente tenha que esperar por mais tempo.
Como mais de um destino pode se inscrever em uma fila, uma única mensagem pode ser recebida por mais de um microsserviço. Além disso, quando vários contêineres hospedam instâncias de um único microsserviço, a primeira instância que fica disponível capta a mensagem. O broker distribui automaticamente mensagens para instâncias para distribuir a carga.
O que é RabbitMQ?
O RabbitMQ é um dos corretores de mensagens mais populares e tem muitos recursos que o tornam um candidato ideal para lidar com comunicações em um aplicativo nativo da nuvem. Inclui:
- O servidor RabbitMQ, que hospeda as filas. O servidor suporta clustering e failover para alta disponibilidade e pode ser executado em contêineres.
- Implementações de Advanced Message Queuing Protocol (AMQP), Simple Text Oriented Message Protocol (STOMP) e Transporte de Telemetria de Enfileiramento de Mensagens (MQTT).
- Bibliotecas de cliente AMQP que você pode usar em .NET, Java e Erlang.
Conceitos do RabbitMQ
Em termos RabbitMQ, seus microsserviços, que enviam e recebem mensagens, são clientes. Os clientes que enviam mensagens são denominados produtores de mensagens. Os clientes que recebem mensagens são consumidores de mensagens. O serviço RabbitMQ é o agente de mensagens.
Como enviar mensagens
O RabbitMQ é versátil e capaz de implementar muitos modelos diferentes de filas. Vamos examinar alguns padrões populares.
Se você tiver um único produtor e um único consumidor, usará uma única fila e todas as mensagens chegarão ao mesmo destino. Mesmo nessa configuração simples, você cria um sistema de mensagens robusto que lida com interrupções sem problemas:
Enviar mensagens a consumidores concorrentes
No modelo de consumidores concorrentes, um produtor envia mensagens para uma única fila de trabalho. Dois ou mais consumidores recuperam mensagens da fila. Os consumidores competem para recuperar mensagens porque cada mensagem só pode ser recuperada por um único consumidor.
Esse padrão é útil em aplicativos nativos da nuvem quando você tem um microsserviço de consumo hospedado em vários contêineres para aumentar a capacidade. Cada mensagem só chegará a uma instância do consumidor, pelo que será processada apenas uma vez. O trabalho não será duplicado.
Publicação e subscrição
Se você quiser enviar uma única mensagem de um produtor para vários consumidores, use o modelo de publicação/assinatura . O produtor envia mensagens para uma troca. Cada consumidor subscreve as mensagens dessa troca. Quando eles se inscrevem, o RabbitMQ cria uma nova fila de trabalho para essa assinatura. Cada mensagem é copiada para cada fila para essa troca e é recebida por cada consumidor que se inscreveu. Os consumidores não competem por cada mensagem. Em vez disso, todos recebem uma cópia de cada mensagem.
O modelo de publicação/assinatura usa uma troca de fanout , que copia todas as mensagens para cada fila de trabalho.
Esse padrão é útil quando você deseja que cada mensagem seja processada por vários microsserviços. Por exemplo, quando um cliente faz check-out de uma cesta, talvez você queira enviar uma mensagem sobre o número de cada produto que ele comprou. Esta mensagem deve chegar tanto ao microsserviço de expedição, para instruir o armazém a embalar a encomenda, como ao microsserviço de stock, para diminuir os números de stock e talvez desencadear encomendas aos fornecedores.
Roteamento de mensagens e tópicos
Às vezes, você deseja distribuir mensagens únicas para vários consumidores, mas, para cada consumidor, aplique um filtro. Esse padrão é chamado de roteador de mensagens. Tal como no modelo de publicação/subscrição, os consumidores subscrevem a bolsa para criar várias filas de trabalho. No entanto, em vez de uma troca de fanout, o modelo usa uma troca direta . Com esta troca, cada subscrição tem uma chave de ligação. Somente as mensagens cuja chave de roteamento corresponde à chave de vinculação são enviadas para esta assinatura. Outros são filtrados.
Esse padrão é útil quando alguns consumidores devem processar apenas um subconjunto do fluxo de mensagens. Por exemplo, suponha que você tenha um microsserviço que envia mensagens quando ocorrem erros. Todos os erros devem ser enviados para o microsserviço de registro. Os erros críticos devem ser enviados para o microsserviço de administração que alertará os engenheiros para corrigir o problema.
A troca direta encaminha mensagens com base em um único critério. Para tornar as coisas ainda mais flexíveis, você pode usar uma troca de tópicos . Para cada mensagem, você pode usar uma chave de roteamento com vários termos separados por pontos. Na tecla de ligação, você pode usar os curingas *, para substituir exatamente uma palavra, ou # para substituir por zero ou mais palavras.
Nota
As alternativas ao RabbitMQ incluem o Apache Kafka e o Azure Service Bus. Ambos os agentes de mensagens são suportados por integrações dedicadas no .NET Aspire. Você aprenderá sobre o Barramento de Serviço do Azure em um módulo posterior neste Caminho de Aprendizagem.