Como construir um cluster RabbitMQ no Ubuntu 20.04

Fugindo um pouco do assunto “Containers” nesse primeiro momento, vamos aprender um pouco sobre mensageria, em específico utilizando o RabbitMQ.

O que é o RabbitMQ?

RabbitMQ é um servidor de mensageria de código aberto (open source) desenvolvido em Erlang, implementado para suportar mensagens em um protocolo denominado Advanced Message Queuing Protocol (AMQP). Ele possibilita lidar com o tráfego de mensagens de forma rápida e confiável, além de ser compatível com diversas linguagens de programação, possuir interface de administração nativa e ser multiplataforma.

Dentre as aplicabilidades do RabbitMQ estão possibilitar a garantia de assincronicidade entre aplicações, diminuir o acoplamento entre aplicações, distribuir alertas, controlar fila de trabalhos em background.

Como o RabbitMQ funciona?

Vamos dar uma olhada rápida em como o RabbitMQ funciona. Vamos primeiro nos familiarizar com alguns conceitos importantes do RabbitMQ:

  • Producer: É o responsável por incluir cada nova mensagem na fila, ou seja enviar a mensagem.
  • Consumer: Como diz o próprio nome é o agente responsável por consumir, retirar, a informação da fila.
  • Queue: Buffer que armazena as mensagens.
  • Message: Informações que são enviadas do produtor a um consumidor por meio do RabbitMQ.
  • Connection: É uma conexão TCP entre seu aplicativo e o broker RabbitMQ.
  • Channel: Um canal é uma conexão virtual dentro de uma conexão. Quando você está publicando ou consumindo mensagens de uma fila. Tudo é feito em um canal.
  • Exchange: Recebe mensagens dos produtores e as envia para as filas, dependendo das regras definidas pelo tipo da exchange. Para receber mensagens, uma fila precisa ser vinculada a pelo menos uma exchange.
  • Binding: É um link entre uma fila e uma exchange.
  • Routing key: É uma chave que a exchange analisa para decidir como rotear a mensagem para as filas. A chave de roteamento é como um endereço para a mensagem.

Os produtores enviam/publicam as mensagens para o broker. Os consumidores recebem as mensagens do broker. O RabbitMQ atua como um middleware de comunicação entre produtores e consumidores, mesmo que eles sejam executados em máquinas diferentes.

Enquanto o produtor está enviando uma mensagem para a fila, ela não será enviada diretamente, mas sim pela troca. O design abaixo demonstra como os três componentes principais estão conectados uns aos outros:

Como o RabbitMQ funciona?

As exchanges são responsáveis por rotear as mensagens para diferentes filas. Para que a mensagem seja recebida do produtor para a central e depois reenviada para a fila. Isso é conhecido como método de “Publicação”. A mensagem será capturada e consumida da fila. Isso é chamado de “Consumidor”.

Como criar um cluster RabbitMQ?

Agora que já aprendemos o básico sobre o RabbitMQ vamos aprender a criar o nosso cluster. Para isso vou utilizar a Digital Ocean. Caso você tenha interesse, através desse link de afiliado você ganha $100 dólares de crédito para utilizar como quiser em até 60 dias.

Antes de tudo, vamos criar nossos Droplets, no menu do lado esquerdo, clique em Droplets ou no botão: Get Started with a Droplet:

Como criar Droplets na Digital Ocean

Após, clique no botão: Create Droplet

Como criar Droplets na Digital Ocean

Na escolha da imagem (sistema operacional) escolha Ubuntu 20.04 e o plano Basic:

Como criar Droplets na Digital Ocean

Em CPU Options escolha: Regular Intel with SSD e escolha a máquina com 2GB de RAM e 2 CPUs:

Como criar Droplets na Digital Ocean

No passo da localizão do Data center escolha o qual você achar melhor, mas aqui eu escolhi New York 3:

Como criar Droplets na Digital Ocean

Crie 3 máquinas distintas, renomeie-as conforme a imagem abaixo:

Como criar Droplets na Digital Ocean

Clique no botão criar e estando tudo ok você vai ver na home do seu projeto as 3 máquinas criadas:

Como criar Droplets na Digital Ocean

Com as 3 máquinas criadas, vamos implementar antes alguns procedimentos básicos de segurança conforme já falei aqui anteriormente nesse post. Aconselho nesse momento a não implementar ainda as regras de firewall, vamos instalar primeiro o RabbitMQ e estando tudo ok após nós configuramos o mesmo.

Instalando o RabbitMQ Server

O primeiro passo aqui é instalar o servidor do RabbitMQ nas 3 máquinas, para isso vamos começar antes instalando alguns pacotes necessários para que tudo funcione corretamente:

Se tudo correu bem até aqui você vai ver que temos 3 instâncias do RabbitMQ Server rodando:

RabbitMQ server

Habilitando o RabbitMQ Management Dashboard

Esse próximo passo deve ser executado somente na máquina número 1, que é onde irá rodar o dashboard administrativo do RabbitMQ:

O usuário de acesso default é o guest mas o meio de acesso é somente via localhost. Vamos então criar um usuário de nível administrador para que possamos acessar o dashboard do RabbitMQ de qualquer lugar. Lembrando novamente que o passo a seguir deve ser executado somente na máquina 1:

Para saber se está tudo ok, pegue o IP da máquina 1 acesse no browser na seguinte forma: IP_DO_SERVER:PORTA, ou seja, aqui no meu caso é: http://161.35.187.17:15672, lembrando que a porta 15672 é a porta default do dashboard do RabbitMQ:

RabbitMQ Management Dashboard

No campo username digite admin e no campo password a senha que você definiu anteriormente. Com isso você tem acesso ao dashboard de administração do RabbitMQ:

RabbitMQ Management Dashboard

Configurando o cluster

A partir de agora a coisa começa a ficar interessante, pois vamos integrar o nosso cluster. Para isso é necessário efetuar uma simples alteração no arquivo /etc/hosts das 3 máquinas para que elas se enxerguem na rede. Na home da administração do seu projeto da Digital Ocean, copie o IP privado de cada máquina, conforme você vê na imagem abaixo:

RabbitMQ Private IPs

Portanto, aqui no meu caso ele acabou ficando da seguinte forma:

Agora vamos editar o arquivo /etc/hosts em todas as máquinas e adicionar os novos hosts:

Aqui ficou da seguinte forma:

Linux host

Salve o arquivo e reinicie as 3 máquinas para que as alterações tenham efeito:

Os nós do cluster RabbitMQ utilizam um cookie para se comunicar entre eles e aqui no nosso caso para que eles se comuniquem perfeitamente precisamos primeiramente copiar o cookie da nossa máquina 1 para as outras máquinas 2 e 3. Para isso, na máquina 1 execute o seguinte comando e copie o valor do cookie:

Agora vá nas máquinas 2 e 3 e substitua o valor do cookie atual pelo valor no qual você copiou da máquina 1 executando o mesmo passo anterior:

Unindo os nós do cluster RabbitMQ

Agora é o passo que vamos indicar que todos os outros nós devem se juntar ao nó rabbitmq-01, portanto, aqui no nosso caso os passos a seguir devem ser executados somente nas máquinas 2 e 3:

Se tudo ocorreu bem, após checar o status do cluster você verá algo do tipo:

RabbitMQ Cluster Status

Acesse novamente o dashboard de administração e você vai ver os 3 nós que acabamos de configurar:

RabbitMQ Management Dashboard

A primeira impressão é que fizemos algo de errado pois as estátísticas dos outros 2 nós não estão aparecendo aqui no Dashboard. Mas nnao tem nada de errado aqui, basta só habilitarmos o plugin rabbitmq_management nos nossos nós 2 e 3 da seguinte forma:

Acesse o dashboard novamente e você agora vai ver que está tudo ok:

RabbitMQ Management Dashboard

RabbitMQ Queue Mirroring

Por padrão, o conteúdo de uma fila fica localizado em um único nó. Portanto, você precisará configurar a diretiva ‘ha policy’ para espelhamento de fila e replicação para todos os nós do cluster. Para fazer isso, crie uma política ha chamada de ‘ha-all’, em que todas as filas no cluster RabbitMQ serão espelhadas em todos os nós do cluster:

Em seguida, crie uma política ha chamada ‘ha-production’, em que todos os nomes de filas começam com ‘production’. Será espelhado para os dois nós do cluster.

Em seguida, crie uma política de alta disponibilidade chamada ‘ha-nodes’ que conterá todas as filas onde o nome começa com ‘nodes’. Estaremos espelhando para dois nós específicos ‘rabbitmq-02’ e ‘rabbitmq-03’ no cluster.

Parabéns, se você chegou até aqui você configurou com êxito um cluster RabbitMQ de três nós no Ubuntu 20.04. Seu cluster agora compartilha informações de configuração, incluindo topologia e informações de segurança entre todos os nós.