DEV Community

Mensageria com RabbitMQ e Golang

Introdução

A comunicação entre sistemas mudou bastante nos últimos anos. Antes, era comum que uma aplicação chamasse outra diretamente e esperasse sua resposta. Isso funcionava, mas só até certo ponto: quanto maior o sistema, maior o acoplamento e menor a tolerância a falhas. Hoje, quando falamos em microsserviços, escalabilidade e resiliência, surge uma alternativa quase sempre mais saudável: a mensageria.

A ideia central é simples. Em vez de depender de resposta imediata, um serviço envia uma mensagem para uma fila e segue sua vida. Outro serviço, quando puder, lê essa mensagem e faz o trabalho necessário. Isso torna a aplicação mais leve, mais modular e mais preparada para lidar com períodos de carga alta.

Neste artigo, vamos entender o básico sobre mensageria, aprender como usar o RabbitMQ para organizar o fluxo de mensagens e criar exemplos práticos em Go.


O que é Mensageria e por que ela é tão útil

Mensageria é o padrão de comunicação onde sistemas conversam através do envio e consumo de mensagens, e não por chamadas diretas. Isso resolve alguns problemas comuns em arquiteturas tradicionais.

Imagine um serviço de API que precisa realizar diversas etapas a partir de uma única requisição, sendo que uma delas (ou mais) pode sofrer com lentidão devido a conexão instável, grande volume de dados ou processamento mais pesado. Se for feito de forma síncrona, basta um desses passos ficar lento para o serviço todo travar, ou até mesmo ocasionar em erros.

A mensageria permite deslocar essas tarefas para outro componente. Assim, a API recebe a requisição, separa o que precisa ser feito naquele momento (processamento síncrono) e o que não precisa ser concluído antes do retorno da API (processamento assíncrono).

Por exemplo, se houver a necessidade dessa requisição enviar um email ao final, a API pode retornar uma mensagem informando que o email será enviado, e designar o disparo desse email a um serviço de mensageria e que será feito de forma independente.

Uma cenário comum desse exemplo seria o enviar o e-mail de boas-vindas após um cadastro. Ao invés de ser feito de forma assíncrona na requisição, pode ser criada uma estrutura similar a esta:

Mensagem:
{
  "usuario_id": 123,
  "acao": "enviar_email_boas_vindas"
}
Enter fullscreen mode Exit fullscreen mode

Isso vai para uma fila de mensagens. Depois, um outro serviço lê essa fila e manda o e-mail.


O que é RabbitMQ e como ele funciona

RabbitMQ é um message broker. Ele recebe mensagens, organiza essas mensagens em filas e garante que consumidores possam acessá-las com segurança. RabbitMQ implementa o protocolo AMQP, que define regras claras para envio, roteamento e entrega de mensagens.

O RabbitMQ se destaca pela simplicidade, estabilidade e pela facilidade de adaptação a diferentes cenários — desde pequenas aplicações até sistemas de alta disponibilidade. Dentre alternativas conhecidas estão Kafka, Redis Streams e SQS.

Alguns elementos básicos e fundamentais do RabbitMQ são:
Produtor (Producer): Quem envia a mensagem
Fila (Queue): Onde a mensagem fica armazenada
Consumidor (Consumer): Quem lê e processa a mensagem
Exchange: Responsável por decidir pra onde cada mensagem vai
Binding: Associação, ou vínculo, entre uma exchange e uma fila
Routing key: Chave usada para auxiliar no roteamento

O Exchange é a entidade na qual o Produtor publica mensagens, que são então roteadas para um conjunto de Filas. O objetivo do Exchange é encaminhar todas as mensagens que passam por ele para uma ou mais Filas ou outros Exchanges. O tipo de Exchange e as propriedades do Binding são usados ​​para implementar a lógica de roteamento.

Uma Fila no RabbitMQ é uma coleção ordenada de mensagens. As mensagens são enfileiradas (criadas pelo Produtor) e desenfileiradas (entregues aos Consumidores) de maneira FIFO ("primeiro a entrar, primeiro a sair").

Top comments (0)