O que é o RabbitMQ?

Concluído

Em qualquer aplicativo nativo de nuvem, os microsserviços devem se comunicar para obter todas as informações necessárias para responder aos usuários. Você deve verificar se essa mensagem é robusta mesmo quando há problemas de rede ou falhas entre os componentes. O RabbitMQ é uma ferramenta que você pode usar para aumentar a confiabilidade do sistema de mensagens.

Em seu varejista de equipamentos ao ar livre, você está fazendo progressos rápidos com seus microsserviços. No entanto, no teste de aplicativo, algumas chamadas de um microsserviço para outro parecem estar perdidas. Você gostaria de garantir que esse problema não surja no seu ambiente de produção em que 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 de nuvem?

Os aplicativos nativos de nuvem consistem em microsserviços independentes, muitas vezes criados por equipes separadas e usando diferentes tecnologias e idiomas. Cada equipe tem os próprios sprints de desenvolvimento e agendamentos 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 o recebe quase sempre precisa chamar outros microsserviços e serviços de backup 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 raramente mudam. Geralmente, eles são implementadas 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 poderão 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 em execução em mais de um contêiner, para qual você deve enviar mensagens?

Um agente de mensagens é um middleware que resolve esses problemas. Os serviços enviam mensagens para o agente de mensagens em vez de diretamente para um destino. O agente os armazena em filas na ordem em que chegam. Os serviços de destino assinam essas filas e pegam 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, no mesmo ponto. Nenhuma mensagem é perdida, embora o remetente tenha que esperar mais tempo.

Como mais de um destino pode assinar 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 pega a mensagem. O agente distribui automaticamente mensagens para instâncias para espalhar a carga.

O que é o RabbitMQ?

O RabbitMQ é um dos agentes de mensagens mais populares e tem muitos recursos que o tornam um candidato ideal para lidar com comunicações em um aplicativo nativo de nuvem. Ele inclui:

  • O servidor RabbitMQ, que hospeda as filas. O servidor dá suporte a clustering e failover para alta disponibilidade e pode ser executado em contêineres.
  • Implementações do protocolo AMQP (Advanced Message Queuing Protocol), STOMP (Simple Text Oriented Message Protocol) e MQTT (Message Queuing Telemetry Transport).
  • Bibliotecas de clientes AMQP que você pode usar em .NET, Java e Erlang.

Conceitos do RabbitMQ

Na terminologia do RabbitMQ, seus microsserviços, que enviam e recebem mensagens, são clientes. Os clientes que enviam mensagens são chamados 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 de enfileiramento diferentes. 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 nesta configuração simples, você cria um sistema de mensagens robusto que lida com interrupções sem problemas:

Diagrama mostrando uma única fila RabbitMQ com um único produtor e um único consumidor.

Enviar mensagens para 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.

Diagrama mostrando uma única fila RabbitMQ com um único produtor e dois consumidores concorrentes.

Esse padrão é útil em aplicativos nativos de nuvem quando você tem um microsserviço de consumo hospedado em vários contêineres para aumentar a capacidade. Cada mensagem atingirá apenas uma instância do consumidor, portanto, será processada apenas uma vez. O trabalho não será duplicado.

Publicação e inscrição

Se você quiser enviar uma única mensagem de um produtor para vários consumidores, use o modelo publicação/assinatura. O produtor envia mensagens para uma troca. Cada consumidor assina mensagens dessa troca. Quando eles assinam, 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 assinou. Os consumidores não competem por cada mensagem. Em vez disso, todos eles recebem uma cópia de cada mensagem.

O modelo de publicação/assinatura usa uma troca de fanout, que copia cada mensagem para cada fila de trabalho.

Diagrama mostrando um modelo de assinatura de publicação com um único produtor, uma troca de fanout e dois consumidores.

Esse padrão é útil quando você deseja que cada mensagem seja processada por vários microsserviços. Por exemplo, quando um cliente faz a finalização da compra de uma cesta, talvez você queira enviar uma mensagem sobre o número de cada produto que ele comprou. Essa mensagem deve chegar ao microsserviço de envio para instruir o armazém a empacotar a encomenda e ao microsserviço de estoque para diminuir os números de estoque e talvez disparar pedidos aos fornecedores.

Roteamento de mensagens e tópicos

Às vezes, você deseja distribuir mensagens simples para vários consumidores, mas, para cada consumidor, aplicar um filtro. Esse padrão é chamado de roteador de mensagem. Assim como no modelo de publicação/assinatura, os consumidores assinam a troca para criar várias filas de trabalho. No entanto, em vez de uma troca de fanout, o modelo usa uma troca direta. Com essa troca, cada assinatura tem uma chave de associação. Somente as mensagens cuja chave de roteamento corresponde à chave de associação são enviadas para essa assinatura. Outras são tiradas do filtro.

Diagrama mostrando o modelo de roteamento de mensagens com um único produtor, uma troca direta e dois consumidores.

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 log. 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 roteia mensagens com base em um único critério. Para tornar as coisas ainda mais flexíveis, você pode usar uma troca de tópico. Para cada mensagem, você pode usar uma chave de roteamento com vários termos separados por pontos. Na chave de associação, você pode usar os curingas *, para substituir exatamente uma palavra ou # para substituir zero ou mais palavras.

Observação

As alternativas ao RabbitMQ incluem o Apache Kafka e o Barramento de Serviço do Azure. Esses dois agentes de mensagens são compatíveis com componentes dedicados no .NET Aspire. Você aprenderá sobre o Barramento de Serviço do Azure em um módulo posterior neste Roteiro de Aprendizagem.

Saiba mais