RabbitMQ — Primeiros passos

Rafael Honório
Jul 17 · 7 min read

Hey oh!

Olá, vou contar um pouco da minha experiência com RabbitMQ nos últimos meses e meu intuito é criar uma espécie de get started para os iniciantes.

Como a maior parte do conteúdo incluindo a documentação é em inglês, resolvi fazer esse mini-artigo/tutorial para as pessoas da comunidade que assim como eu não tem um inglês muito bom (estou melhorando nisso).

Se chegou aqui você sabe o que é um message broker certo? Se não, caso tenha caído de paraquedas aqui, message broker , use o pai google tradutor, ele ajuda muito.

Dentre as opções de mercado como Kafka, activeMQ, SQS entre outros… O rabbitmq é uma ótima pedida e vale lembrar que é open source, diferente das opções citadas acima. É uma ferramenta bem completa, existem clients oficiais de c#, java, php, python, ruby, GO, exilir e por aí vai, basicamente as principais linguagens do mais usadas no momento.

Vou dividir esse texto em partes:

  • Cenários de aplicação;
  • Conceitos;
  • Mão na massa;

Cenários de aplicação

Eu gosto de dividir em dois possíveis e usuais cenários para aplicar essa tecnologia:

  • Quando você tem um ponto (uma aplicação) que precisa se comunicar com vários pontos (várias aplicações);
  • Quando você precisa executar um processo assíncrono, por exemplo, duas aplicações executando o mesmo processo para realizar algo ou criar uma nova informação.

Todos os outros cenários vão acabar derivando dessas duas situações de alguma forma, por isso dividi entre os dois.

Conceitos

Vou apresentar alguns conceitos do rabbitmq, (não se preocupe, é muito conteúdo e é normal se perder com os nomes, nos primeiros dias lendo a documentação eu me perdia frequentemente).

A forma mais básica de usar um message broker é enviar uma informação de uma app para a outra.

Produtor envia uma informação para uma fila (queue) e um consumidor pega essa informação, conceito simples, não é mesmo?

Existe alguns “poréns” nesse processo mas vamos seguir; não é o intuito detalhar nesse momento. Vou te apresentar agora alguns conceitos do rabbitmq de fato, o que é cada um desses nomes.

  • Queue — refere-se a uma fila dentro do servidor, queues tem algumas propriedades, como: exchange, binds, headers, content, vou comentar sobre eles a seguir.
  • Exchange é, basicamente, um dissipador, roteador, que seja, vai ser como você vai distribuir essa mensagem, no rabbitmq existem quatro tipos de exchange e que distribuem mensagens de forma diferente, dentre elas: Direct, Fanout, Topic e Headers.
  • Bind ou RoutingKey é um identificador que uma queue pode ter, com esse cara é possível distribuir informações enviadas em uma mesma exchange, mas em filas diferentes (segue exemplificação abaixo), mas eu diria que é o carro chefe do rabbitmq, ele que define pra onde cada informação vai ser enviada.
  • Producer ou Publisher — são dois termos que provavelmente você lerá muito, os dois são, fundamentalmente, os mesmos caras em termos diferentes, e nada mais são que as aplicações responsáveis por produzir uma informação e enviar para o rabbitmq;
  • Consumer ou Subscriber — também são os mesmo atores nesse esquema, mas ao contrário do producer ele irá consumir uma informação da queue.
  • virtual host — O rabbitMQ é um sistema multi-tenant, Conexões, filas, binds, exchanges, policies e usuários são separados por virtual host, são grupos lógicos de entidades. Se você conhece virtuais hosts em apache ou bloco de servidores no Nginx, a ideia é semelhante. Há, no entanto, uma diferença importante: os hosts virtuais no Apache são definidos no arquivo de configuração; esse não é o caso do RabbitMQ: os hosts virtuais são criados e excluídos usando rabbitmqctl ou HTTP API.

Com esses termos em mente fica fácil entender o resto, tentei escrever de uma forma bem livre para facilitar o entendimento. :D

Mão na massa

Vou começar a configuração do servidor e até escrever códigos agora, os exemplos a seguir vou usar servidor linux e c# como linguagem de programação, mas ao entender como funciona, pode ser aplicada em qualquer linguagem.

Configuração do servidor

Essa parte é bem tranquila, vou usar um servidor distro debian como exemplo:

Passo 1 — Instalar o Erlang

Dentro da sua distro debian, execute os seguintes comandos:

e agora rode esses comandos para atualizar o apt cache e instalar os pacotes do erlang:

com isso o erlang está configurado em sua maquina.

Passo 2 — Instalando RabbitMQ Server

Da mesma forma do erlang, é necessário instalar e configurar o rabbitmq na sua VM ou máquina, vamos seguir com os comandos.

e agora rode esses comandos para atualizar o apt cache e instalar o rabbitmq server no seu sistema:

se tudo correr bem agora é só habilitar e startar o servidor com os seguintes comandos:

muito bem, agora pare o servidor com o comando:

ainda precisamos de criar um usuário para logar no web management do rabbitmq, execute os seguintes comandos:

seguindo a sequência, criará o usuário, dará permissão de administrador para este e depois concede as permissões para acessar o virtual host padrão.

certo, nessa parte só falta habilitar o web management, segue o comando:

agora é só startar o servidor e acessar a url de um brower com o ip:porta , exemplo: localhost:15672. Obs: a porta padrão do web management é 15672, o rabbitmq tem portas padrões para cada serviço, mas, sinceramente, nunca tive problema em liberar portas no linux até então, caso aconteça, seguem os comandos para liberar as portas no firewall:

agora bastar fazer um reload e fazer uma check nas portas liberadas com os seguintes comandos:

seguindo esses passos você deve obter o seguintes resultado:

Dessa forma o servidor já está configurado, vou mostrar um exemplo para criar uma fila e enviar uma informação e consumir em outra app. Existem várias abordagens para trabalhar com rabbitmq, no meu caso eu criei uma API, basicamente, com as necessidades que tinha no momento.

Cada abordagem vai acabar gerando uma lógica diferente mas o rabbitmq pode ser aplicado em APIs, windows service, console application… Tudo vai depender do seu negocio.

Como no meu trabalho existem aplicações em PHP, dotnet e java, pensei em criar uma API para atender todos os casos, vamos para o código!


Passo 3 — Criando uma app para interagir com RabbitMQ

Crie uma console application e adicione a seguinte dependência

crie uma classe e faça o seguinte código: ↓

Com esse código vão ser executados os seguintes passos, criar uma Exchange → criar uma Queue → criar uma bind → atrelar a exchange e bind à queue → guardar uma mensagem qualquer em uma variável → transformar em bytes(rabbitmq só trabalha com tráfego de bytes) → definir se a mensagem deve ser persistida → e de fato publicar → visualizar a mensagem enviada no console igual a imagem abaixo ↓

Abaixo o código para consumir as informações da fila criada acima ↓

Com esse código a mensagem esperada no console é ↓

Bom, esse é o passo inicial para interagir com rabbitmq via dotnet, no site oficial existe o get started de cada linguagem, em um futuro próximo, quero escrever sobre clusters usando rabbitmq, mas ainda estou escrevendo uma lib para fazer essas interações com uma app acessando um cluster de rabbitmq, postarei em breve, espero ter ajudado!

hope u enjoy! XD

Caso tenha alguma dúvida, pode entrar em contato comigo

Rafael Honório

Written by

Hey oh, I’m a code creator and lover RPG games.

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade