Hoje, vamos explorar como otimizar o tempo de carregamento de suas páginas web, realizando o processamento mais complexo de forma assíncrona, tudo isso administrado de maneira intuitiva com o auxílio do RabbitMQ.
A estabilidade e a rapidez de um aplicativo ou site são, sem dúvida, fatores cruciais para a satisfação do usuário. Quem nunca abandonou um site antes mesmo da página inicial carregar devido à demora excessiva?
O que é RabbitMQ?
RabbitMQ é um agente de mensagens de código aberto, distribuído e escalável, que opera como um intermediário para facilitar a comunicação eficiente entre produtores e consumidores de mensagens.
O RabbitMQ utiliza o protocolo de mensagens da camada de aplicação AMQP, que se concentra na comunicação assíncrona de mensagens, garantindo a entrega através de confirmações de recebimento tanto do broker para o produtor quanto dos consumidores para o broker.
Como o RabbitMQ Funciona?
De forma simplificada, o RabbitMQ estabelece filas que armazenam as mensagens enviadas pelos produtores até que os aplicativos consumidores as recebam e processem. Isso possibilita a criação e implementação de sistemas distribuídos, nos quais um sistema é dividido em módulos independentes que se comunicam através de mensagens.
Assim como em qualquer comunicação, necessitamos de um produtor, uma mensagem e um receptor. No meio desse fluxo, encontramos o RabbitMQ, que funciona como o local onde a mensagem aguarda o destinatário.
Vamos entender melhor o seu funcionamento examinando os tipos de exchanges (trocas) que representam a troca de mensagens.
Tipos de Exchanges (Trocas)
Através das exchanges, ao enviarmos uma mensagem pelo RabbitMQ, não a enviamos diretamente para uma fila, mas sim para um ponto central, que tem a responsabilidade de direcionar as mensagens para diferentes filas.
Crédito da imagem: CloudAQMP
Os tipos de exchanges são: Direct, Fanout, Topic e Headers.
Exchange Direta
Imagine que um produtor necessite enviar uma mensagem de confirmação de compra para três consumidores diferentes. Ou seja, o sistema precisa se comunicar com outros três sistemas para concretizar a compra.
Como o RabbitMQ envia a mensagem separadamente para cada fila, há uma tendência a querer que esses outros sistemas recebam a mensagem diretamente.
A exchange geralmente encaminha a mensagem para as filas, mas frequentemente desejamos que as mensagens não sejam enviadas para todas as filas. Por isso, existem várias condições que podemos aplicar para o funcionamento de uma exchange.
Dessa forma, você consegue enviar sua mensagem para apenas um consumidor, em vez de enviá-la para todos.
Chave de Binding (Vinculação): Para conectar uma fila a uma exchange, é necessário criar um vínculo, ou seja, uma relação entre a fila e a exchange, funcionando como um conector.
Chave de Roteamento: Nesse binding, podemos também criar um elemento chamado chave de roteamento, que serve como um identificador para encaminhar as mensagens para uma fila específica.
Se você possui uma chave de roteamento X, uma chave de roteamento Y e uma chave de roteamento Z, a mensagem com a chave de roteamento Y, por exemplo, passará pela fila Y e será entregue diretamente ao consumidor que você definiu para receber essa mensagem.
Assim, podemos ter diversas filas conectadas a uma exchange, mas ao mesmo tempo, elas podem ter diferentes relacionamentos com as exchanges utilizando as chaves de roteamento.
Exchange Fanout
Quando a mensagem é enviada para a exchange, ela é distribuída para todas as filas conectadas a ela. Portanto, se houver 10 filas conectadas a uma exchange do tipo fanout, todas as filas receberão a mensagem enviada.
Exchange Topic
Esta é uma das exchanges mais flexíveis, permitindo o envio de mensagens com base no assunto. Com base na forma como você nomeia as chaves de roteamento, é possível criar padrões de regras e relações entre sistemas.
Por exemplo: chave de roteamento (x.*); chave de roteamento (*.z); chave de roteamento (*.y.*).
O que é AMQP no RabbitMQ?
AMQP (Advanced Message Queuing Protocol) é um protocolo de mensagens aberto, utilizado para definir o transporte de mensagens entre diversas aplicações. É semelhante a protocolos como HTTP e TCP, pois é um protocolo de nível de transporte, mas com a particularidade de permitir o transporte assíncrono.
O RabbitMQ optou por implementar o AMQP por várias razões. A primeira é que este protocolo é considerado um padrão para middleware, ao contrário do JMS, que define uma API.
Um consórcio internacional, incluindo grandes empresas como Red Hat, Cisco Systems e Microsoft, redigiu a especificação AMQP. A segunda razão é a interoperabilidade deste protocolo, que permite que qualquer aplicação que implemente AMQP se comunique com um broker AMQP.
O AMQP não é o único protocolo utilizado pelo RabbitMQ. A imagem abaixo ilustra todos os protocolos, linguagens e APIs implementadas e/ou suportadas pelo RabbitMQ.
Principais Características do RabbitMQ
Além de possibilitar a integração de diferentes aplicações através de mensagens de forma assíncrona e de diferentes localizações, o RabbitMQ oferece outras funcionalidades que o consagraram no universo dos agentes de mensagens:
Armazenamento Confiável
O RabbitMQ incorpora diversos mecanismos para assegurar a entrega das mensagens. Entre eles, está o armazenamento quando não há nenhum consumidor disponível para receber a mensagem. Ele permite que os consumidores confirmem o recebimento da mensagem, garantindo que ela foi processada com êxito.
Se o processamento falhar, o RabbitMQ possibilita que a mensagem retorne à fila para ser consumida por outra instância do consumidor ou ser processada novamente pelo mesmo consumidor que falhou inicialmente ao se recuperar.
O RabbitMQ também assegura a ordem de entrega das mensagens, ou seja, elas são consumidas na mesma sequência em que chegaram às filas do RabbitMQ.
Criação de Clusters
Embora o RabbitMQ apresente um ótimo desempenho, processando milhares de mensagens por segundo, às vezes é necessário lidar com um volume maior de mensagens sem prejudicar o desempenho da aplicação.
Para isso, o RabbitMQ permite a criação de clusters, possibilitando a escalabilidade horizontal da solução, o que é transparente tanto para produtores quanto para consumidores.
Filas de Alta Disponibilidade
No RabbitMQ, as filas podem ser replicadas em diversos nós de um cluster, assegurando que, em caso de falha de um nó ou tempo de inatividade, o intermediário continue recebendo mensagens dos produtores e entregando-as aos consumidores corretos.
Roteamento Flexível
O RabbitMQ permite a definição de regras de roteamento flexíveis, seguindo padrões específicos, para direcionar mensagens entre exchanges e filas, através de bindings.
Suporte a Múltiplos Protocolos
Além de suportar o protocolo AMQP, o RabbitMQ oferece suporte a STOMP, MQTT e HTTP através de plugins. Também incorpora mecanismos de autenticação e controle de acesso para cada componente do broker.
Casos de Uso Reais do RabbitMQ
As aplicações mais relevantes do RabbitMQ incluem garantir a assincronia entre aplicações, reduzir o acoplamento entre elas, distribuir alertas e controlar filas de jobs em segundo plano.
No entanto, os casos práticos de uso do RabbitMQ se destacam no e-commerce, onde ele é utilizado para manipular, processar e direcionar os pedidos de venda para sistemas de outros setores, como distribuição e emissão de notas fiscais.
Ao processar um pedido, você pode encaminhar a mensagem de venda para o centro de distribuição e para a área de faturamento. Nesse esquema, tudo funciona horizontalmente, seguindo o padrão assíncrono de envio de mensagens, mas muitas vezes é possível enviar uma ação para diversas filas.
Seguindo o exemplo anterior, essa funcionalidade pode ser muito útil quando um cliente efetua uma compra e o produto precisa ser preparado para distribuição, transporte e emissão da nota fiscal.
Como cada um desses setores representa um sistema distinto, o objetivo do RabbitMQ é encaminhar todas essas mensagens para os sistemas correspondentes.
Alternativas ao RabbitMQ:
O RabbitMQ é bem mais simples do que pode parecer, e existem várias alternativas a ele, incluindo:
#1. IronMQ
IronMQ é um software de enfileiramento de mensagens com alta velocidade. É altamente disponível, durável e com preferência por entrega única. O IronMQ é uma solução nativa de nuvem robusta para arquiteturas modernas de aplicações.
Ele suporta filas push, filas pull e long polling, que mantém as solicitações de pesquisa abertas por mais tempo. Além disso, utiliza vários data centers de alta disponibilidade, o que facilita a escalabilidade.
Você pode implementá-lo na nuvem, em hardware compartilhado ou dedicado, ou on-premises. Ele também oferece uma variedade de bibliotecas de cliente com documentação de fácil compreensão.
#2. Apache Kafka
O Kafka é uma plataforma com forte presença em streaming de eventos distribuídos. Em essência, o Kafka é projetado como um log de confirmação persistente, distribuído e replicado.
Sua maior aplicabilidade é para microsserviços de alta performance orientados a eventos ou aplicações de processamento de fluxo em grande escala, replicando automaticamente eventos de forma assíncrona dentro do cluster para garantir tolerância a falhas e alta disponibilidade.
#3. Apache ActiveMQ
ActiveMQ é um Message Broker multiprotocolo baseado em Java. Através dele, podemos integrar aplicações utilizando o protocolo de enfileiramento de mensagens AMQP na camada de aplicação.
Ele implementa diversos protocolos de integração, como JMS (nativo Java) e Stomp (que pode ser utilizado por aplicações PHP), entre outros.
Além disso, a Amazon oferece sua versão “gerenciada”, chamada Amazon MQ, que simplifica consideravelmente a utilização do serviço.
Considerações Finais
Os corretores de mensagens têm sido tradicionalmente peças importantes nas arquiteturas das organizações. No entanto, com o aumento do tráfego de usuários nos sistemas das empresas por diferentes canais, são necessários produtos que permitam a escalabilidade horizontal com baixo custo, possibilitando o processamento de um grande número de mensagens por segundo.
É nesse contexto que uma nova geração de corretores, como o RabbitMQ, ganha relevância em aplicações modernas, que buscam oferecer altos níveis de disponibilidade, confiabilidade, interoperabilidade e desempenho para os usuários.
Você também pode explorar algumas plataformas de hospedagem RabbitMQ confiáveis para sua aplicação.