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:
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:
Após, clique no botão: Create Droplet
Na escolha da imagem (sistema operacional) escolha Ubuntu 20.04 e o plano Basic:
Em CPU Options escolha: Regular Intel with SSD e escolha a máquina com 2GB de RAM e 2 CPUs:
No passo da localizão do Data center escolha o qual você achar melhor, mas aqui eu escolhi New York 3:
Crie 3 máquinas distintas, renomeie-as conforme a imagem abaixo:
Clique no botão criar e estando tudo ok você vai ver na home do seu projeto as 3 máquinas criadas:
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:
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:
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:
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:
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:
Salve o arquivo e reinicie as 3 máquinas para que as alterações tenham efeito:
RabbitMQ Cookie
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:
Acesse novamente o dashboard de administração e você vai ver os 3 nós que acabamos de configurar:
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 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.