Porquê o Rabbit? O que é o MQ? Como ele pode melhorar as nossas aplicações? Por que eu iria querer aprender mais sobre ele? – Estas são perguntas que eu fiz quando fui apresentado pela primeira vez ao RabbitMQ. Eu sou Gabor, e agora sou um engenheiro e consultor RabbitMQ. No meu tempo trabalhando com o RabbitMQ, eu aprendi que mesmo clientes experientes fazem estas perguntas.
TL;DR > Veja nossa página de produtos RabbitMQ para casos de uso, características e para contatar nossos consultores especialistas.
Que problema o RabbitMQ resolve?
Antes de nos aprofundarmos no que é o RabbitMQ e como usá-lo, vale a pena aprender mais sobre o domínio do problema em si. A comunicação entre os diferentes serviços (também conhecidos como computadores) é um problema antigo.
Por um lado, existem os diferentes protocolos que definem o meio de transporte e as propriedades da comunicação. Alguns exemplos de tais protocolos incluem SMTP, FTP, HTTP ou WebSockets (para citar alguns), que são todos baseados em TCP/UDP. Eles lidam com a formatação, confiabilidade e busca do destinatário correto de uma mensagem.
Por outro lado, podemos explorar a comunicação a partir da perspectiva da mensagem. Ela existe em um sistema, então ela é transportada para outro, é transformada, ou seja, tem um ciclo de vida. Como ela viaja de um sistema para outro, devemos estar cientes de onde a mensagem está, e de quem é o dono em um determinado momento.
Os protocolos de comunicação mencionados acima podem garantir que a propriedade (e a localização “física”) da mensagem seja transferida de um sistema para o outro (embora possa levar algum tempo para executar essa transação). Podemos considerar a transferência como uma transação entre as duas partes enquanto ambas estão presentes. Na maioria das vezes, essa troca ativa é desejável, por exemplo, pedir o status do serviço e esperar uma resposta oportuna e precisa. Um exemplo do mundo físico seria ligar para alguém pelo telefone:
1) iniciamos a chamada,
2) esperamos que a outra parte responda,
3) temos uma boa discussão,
4) desligamos o telefone.
Mas há outras vezes em que não precisamos da resposta, só precisamos que o receptor se aproprie da mensagem e faça o seu trabalho. Neste caso, precisamos de um agente intermediário, outro sistema para se apropriar da mensagem (temporariamente) e garantir que a mensagem chegue ao seu destino. Para dar mais força ao exemplo do telefone, a outra parte não está disponível no momento, então deixamos uma mensagem de voz. O serviço de correio de voz irá notificar o receptor pretendido.
Esta entrega assíncrona (atrasada) de mensagem é o que o RabbitMQ fornece. Obviamente, ele pode fazer mais do que uma simples secretária eletrônica, então vamos explorar algumas das opções que ele fornece abaixo
(Se você está interessado em aprender mais sobre a história do RabbitMQ, eu recomendo o primeiro capítulo de “RabbitMQ em Ação” por Alvaro Videla e Jason Williams. Ele revelará a resposta para o porquê do seu nome em RabbitMQ).
RabbitMQ é uma solução livre, open-source e extensível de enfileiramento de mensagens. É um corretor de mensagens que entende AMQP (Advanced Message Queuing Protocol), mas também é capaz de ser usado com outras soluções de mensagens populares como MQTT. É altamente disponível, tolerante a falhas e escalável. É implementado em Erlang OTP, uma tecnologia feita à medida para construir sistemas stabe, fiáveis, tolerantes a falhas e altamente escaláveis que possuem capacidades nativas de lidar com um grande número de operações simultâneas, como é o caso do RabbitMQ e outros sistemas como o WhatsApp, MongooseIM, para mencionar alguns.
A um nível muito elevado, é uma camada de middleware que permite que diferentes serviços na sua aplicação comuniquem entre si sem se preocuparem com a perda de mensagens, ao mesmo tempo que fornecem requisitos de qualidade de serviço (QoS) diferentes. Ele também permite um roteamento fino e eficiente de mensagens permitindo um desacoplamento extenso de aplicações.
Use cases
Para mostrar a versatilidade do RabbitMQ, vamos usar três estudos de caso que demonstram como o RabbitMQ é bem adequado como uma abordagem de serviço gerenciado em black-box, como uma que se integra perfeitamente com a aplicação permitindo uma arquitetura de micro-serviço bem funcional, ou como um gateway para outros projetos legados.
RabbitMQ como um barramento de mensagens geral
Quando um sistema monolítico é decomposto para separar subsistemas, um dos maiores problemas que precisam ser resolvidos é qual tecnologia de comunicação usar. Uma solução como Mulesoft, ou MassTransit pode “wire” serviços, declarando ouvintes e remetentes HTTP. Este tipo de solução trata o RabbitMQ como uma caixa preta, mas ainda é capaz de alavancar as capacidades do RabbitMQ. Como um exemplo de comunicação direta, vamos usar HTTP para “conectar” os serviços individuais. Embora seja uma escolha bem suportada e sólida, tem alguns inconvenientes:
1) A descoberta de serviços não está resolvida. Uma solução possível é usar o DNS. À medida que o sistema se dimensiona e cresce, o mesmo acontece com a complexidade de encontrar e equilibrar essa carga. RabbitMQ pode mitigar o aumento da complexidade da solução.
2) A comunicação é efêmera. As mensagens são propensas a serem descartadas ou duplicadas na camada de rede. Se um serviço estiver temporariamente indisponível, a entrega falha.
RabbitMQ pode ajudar em ambos os casos, utilizando filas de mensagens como meio de transporte. Os serviços podem publicar e consumir mensagens, o que dissocia a entrega de mensagens de ponta a ponta da disponibilidade do serviço de destino. Se um serviço consumidor estiver temporariamente indisponível, ao contrário do HTTP, a mensagem é armazenada em buffer e retida com segurança no RabbitMQ, e eventualmente entregue quando o serviço voltar online.
Discoverability também é simplificado. Tudo o que precisamos saber é onde está o RabbitMQ e qual é o nome da fila. Embora pareça que isto apenas reinventa o problema, isto é escalável. O nome da fila funciona como o endereço do serviço. As mensagens de consumo das filas pelos serviços individuais oferecem um meio de escalabilidade, ou seja, cada fila pode servir múltiplos consumidores e equilibrar a carga. Não há necessidade de alterar a configuração da fila já incorporada nos serviços.
Esta configuração moderadamente estática da fila empurra o RabbitMQ para uma camada de middleware onde um design sólido pode garantir uma qualidade de serviço estável a longo prazo.
RabbitMQ como uma camada de roteamento avançado para micro-serviços
No outro extremo do espectro está uma arquitetura mais fluida e adaptável às necessidades em constante mudança de muitos micro-serviços. O que faz o RabbitMQ brilhar neste ambiente são as capacidades de roteamento muito poderosas que ele fornece.
A lógica de roteamento é implementada em diferentes (chamados) tipos de troca que podem ser criados dinamicamente pela aplicação quando necessário. Os serviços de destino criam as filas de espera que desejam consumir, depois ligam-nas às trocas especificando um padrão para as chaves que os editores podem usar ao publicar a mensagem. (Pense nessas chaves como metadados que as trocas podem usar para rotear e entregar as mensagens para uma ou mais filas.)
A lógica de roteamento é implementada em diferentes (chamados) tipos de trocas que podem ser criadas dinamicamente pela aplicação quando necessário. Os serviços de destino criam as filas que desejam consumir e depois ligam-nas às trocas especificando um padrão para as chaves que os editores podem usar ao publicar a mensagem. (Pense nessas chaves como metadados que as trocas podem usar para rotear e entregar as mensagens para uma ou mais filas.)
RabbitMQ vem com quatro tipos de trocas úteis que cobrem a maioria dos casos de uso para envio de mensagens:
1) Troca direta. Isto irá entregar a mensagem recebida a qualquer fila cuja chave de encadernação corresponda exactamente à chave de encaminhamento da mensagem. Se você ligar as filas com o nome da fila como chaves de roteamento, então você pode pensar sobre isso como uma entrega de mensagem um-para-um. É simples entregar a mesma mensagem em várias filas usando as teclas de atalho para várias filas.
2) Troca de tópicos. Isto irá entregar a mensagem recebida em qualquer fila cuja chave de encadernação de wild-card coincida com a chave de encaminhamento da mensagem publicada. As chaves de encadernação podem conter critérios de correspondência de wild-card para uma chave de roteamento composta. (por exemplo, a chave de encadernação logs.*.error
irá corresponder às chaves de encaminhamento logs.accounting.error
e logs.ui.error
). Isto nos permite escrever serviços simples onde a lógica está bem contida, e a mensagem chegará aos serviços corretos através da “magia” do RabbitMQ.
3) Troca de Fanout. Algumas mensagens precisam ser entregues em todas as filas, aqui é onde uma troca de fanout pode ser usada ao invés de escrever uma elaborada lógica multicast na aplicação. Com uma troca de fanout RabbitMQ, cada serviço liga a fila apropriada à troca sem a necessidade de especificar uma chave de ligação, e tudo acontece automaticamente. Se uma chave vinculada for especificada, a troca de fanout simplesmente a ignorará e ainda roteará/transmitirá mensagens para todas as filas vinculadas a ela.
4) Troca de cabeçalhos. Esta troca alavanca a estrutura das mensagens AMQP e é capaz de roteamento complexo baseado nos cabeçalhos (incluindo os personalizados) da mensagem AMQP. Os cabeçalhos são metadados anexados a cada mensagem enviada via AMQP.
Além das trocas, existem outras características úteis no RabbitMQ que permitem a implementação de uma lógica muito complexa de troca de mensagens. Algumas das características mais importantes incluem:
1) Plug-ins personalizados. O RabbitMQ é extensível permitindo que seus usuários adicionem plug-ins. Quase todos os aspectos do RabbitMQ são customizáveis, incluindo a gestão, autenticação e autorização, soluções de backup, e clustering.
2) Clustering. Quando um único servidor RabbitMQ não é suficiente, vários corretores RabbitMQ podem ser conectados para trabalhar em conjunto e escalar o sistema. Ele pode permitir que o RabbitMQ processe mais mensagens ou aumentar a resiliência a erros.
3) Qualidade de sintonia do serviço. A entrega de mensagens sensíveis ao tempo pode ser ajudada anexando um valor TTL (Time-to-Live) à mensagem ou à fila de espera. As mensagens com limite de tempo podem ser automaticamente entregues a uma fila de letras mortas. Combinando a lógica de roteamento comum e essas características extras podem levar a lógicas de roteamento altamente avançadas. Outro recurso útil é o uso de filas de prioridade onde o editor pode atribuir um nível de prioridade a cada mensagem. Também é possível limitar o número de mensagens não reconhecidas, o que permite o ajuste de desempenho dos serviços consumidores, neste caso, o RabbitMQ aplica um mecanismo de contrapressão.
RabbitMQ integrado em sistemas legados
No caso de uso anterior, eu mencionei a possibilidade de usar plug-ins para estender a funcionalidade do RabbitMQ. Este poderoso recurso permite que o RabbitMQ atue como uma camada de mediação entre seus serviços nativos RabbitMQ (capazes de AMQP) e outras aplicações legadas. Alguns exemplos notáveis incluem:
1) Usando o RabbitMQ como um corretor MQTT simplesmente habilitando um plug-in. Isto abre o cenário para muitas tecnologias IoT.
2) RabbitMQ’s JMS (Java Message Service) plug-in, que permite que o RabbitMQ se comunique com qualquer solução de mensagens capaz de JMS.
3) Se sua aplicação está usando um protocolo proprietário para comunicação, é possível desenvolver um plugin personalizado para se conectar a qualquer serviço.
Conclusion
Como os exemplos acima demonstram, não há quase nada com o qual o RabbitMQ não possa se comunicar. Mas como com qualquer coisa na vida, ele tem um preço. Embora a configuração do RabbitMQ seja simples, às vezes o mero número de características pode ser esmagador. Se você enfrentar qualquer problema com o design, implementação ou suporte de seus corretores RabbitMQ, entre em contato com nossa equipe de especialistas aqui. Ou, se você gostaria de começar sua carreira em uma das tecnologias mais requisitadas, inscreva-se em nosso curso de treinamento de 3 dias RabbitMQ.
Debugging RabbitMQ
Quer um sistema intuitivo que torna fácil o monitoramento e manutenção do seu RabbitMQ? Obtenha o seu teste gratuito de 45 dias do WombatOAM agora.
Nossa página de Capacidades RabbitMQ