Como Configurar RabbitMQ com Docker Compose, Filas, DLQs, Plugins e Segurança

Introdução
Recentemente, precisei rodar uma instância do RabbitMQ no meu ambiente local. O desafio era replicar fielmente o ambiente de produção, incluindo a configuração de virtual hosts, exchanges, filas, routing keys, bindings, usuários, permissões e plugins, para que eu pudesse simplesmente iniciar o desenvolvimento sem me preocupar com a infraestrutura.
Para resolver isso com o Docker, criei um docker-compose que sobe uma instância do RabbitMQ já configurada com todos os recursos que a aplicação precisa. Assim, consigo simular o ambiente produtivo de forma realista e garantir que a aplicação funcione corretamente durante o desenvolvimento.
Neste post, vou mostrar como você também pode montar rapidamente seu ambiente de RabbitMQ, seja para estudar, testar ou desenvolver aplicações que dependem de uma infraestrutura pré-configurada.
Diagrama
Para facilitar o entendimento, criei uma estrutura básica muito utilizada no RabbitMQ que consiste em:
- Exchange para receber mensagens e rotear para fila a partir de routing keys
- Queue para receber, armazenar a mensagem e disponibiliza-la aos consumidores
- Deadletter Exchange para receber mensagens recusadas pelo consumidor
- Deadletter Queue para receber e armazenar mensagens recusadas
Com essa estrutura, você terá uma base pronta e vários exemplos de configurações que vão facilitar a personalização para atender às suas necessidades.
Como rodar o RabbitMQ
Pré-requisitos
- CLI do git instalado
- Docker instalado e rodando
Subir a instrância
1. Clone o repositório na pasta de sua preferência
git clone https://github.com/davydsonverri/rabbitmq-docker-compose.git
2. Acesse a pasta que contem o arquivo docker-compose.yaml
cd rabbitmq-docker-compose
3. Execute o comando compose no modo daemon
docker-compose up -d
Pronto, sua instância está rodando e você pode acessar a interface web do Rabbit Management para visualizar os recursos que foram criados.
Credenciais
Para logar use as seguintes credenciais:
Usuario: guest
Password: guest123
Estrutura dos arquivos
Para que você possa compreender e personalizar a instância do RabbitMQ com facilidade, a seguir apresento a estrutura dos arquivos e explico o papel de cada configuração.
rabbitmq-docker/
├── definitions.json
├── docker-compose.yaml
├── enabled_plugins
└── rabbitmq.conf
definitions.json
Este é o principal arquivo de configuração do RabbitMQ, nele você consegue configurar:
- 👤 Usuários;
- 🛡️ Permissionamento;
- 📦 Virtual hosts;
- 🔀 Exchanges;
- 📨 Filas;
- 🪦 Deadletters.
{
"users": [
{
"name": "guest",
"password_hash": "oRw25r5d1FRUfrpGueD2bJXm57h8LbslWfhf4gz7xndOafRv",
"hashing_algorithm": "rabbit_password_hashing_sha256",
"tags": "administrator"
}
],
"vhosts": [
{ "name": "/" },
{ "name": "MYVH"}
],
"permissions": [
{
"user": "guest",
"vhost": "/",
"configure": ".*",
"write": ".*",
"read": ".*"
},
{
"user": "guest",
"vhost": "MYVH",
"configure": ".*",
"write": ".*",
"read": ".*"
}
],
"queues": [
{
"name": "MYVH.MainQueue",
"vhost": "MYVH",
"durable": true,
"arguments": {
"x-dead-letter-exchange": "MYVH.DeadletterExchange",
"x-dead-letter-routing-key": "MYVH.MainQueue.Dlq"
}
},
{
"name": "MYVH.MainQueue.Dlq",
"vhost": "MYVH",
"durable": true
}
],
"exchanges": [
{
"name": "MYVH.MainExchange",
"vhost": "MYVH",
"type": "direct",
"durable": true,
"auto_delete": false
},
{
"name": "MYVH.DeadletterExchange",
"vhost": "MYVH",
"type": "direct",
"durable": true,
"auto_delete": false
}
],
"bindings": [
{
"vhost": "MYVH",
"source": "MYVH.MainExchange",
"destination": "MYVH.MainQueue",
"destination_type": "queue",
"routing_key": "MYVH.MainQueue"
},
{
"vhost": "MYVH",
"source": "MYVH.DeadletterExchange",
"destination": "MYVH.MainQueue.Dlq",
"destination_type": "queue",
"routing_key": "MYVH.MainQueue.Dlq"
}
]
}
docker-compose.yaml
Configurações gerais do container docker contendo a versão da imagem do RabbitMQ, portas do broker e do portal de gestão, bem como as referência dos arquivos de configuração que serão mapeados para dentro do container.
services:
rabbitmq:
image: rabbitmq:4.1-management
container_name: rabbitmq
ports:
- "5672:5672"
- "15672:15672"
volumes:
- ./rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf
- ./enabled_plugins:/etc/rabbitmq/enabled_plugins
- ./definitions.json:/etc/rabbitmq/definitions.json
enabled_plugins
Responsável por habilitar plugins do RabbitMQ.
[
rabbitmq_management,
rabbitmq_shovel,
rabbitmq_shovel_management
].
- rabbitmq_management - habilita a interface web de gerenciamento do RabbitMQ
- rabbitmq_shovel - habilita a shovel, um plugin usado para copiar mensagens
- rabbitmq_shovel_management - habilita a interface web de gerencialmente do shovel
rabbitmq.conf
Responsável por fazer o link com o arquivo de definitions.json
load_definitions = /etc/rabbitmq/definitions.json
Repositório Git
Acesse o repositório no GitHub: rabbitmq-docker-compose
Se este post foi útil para você, considere deixar uma ⭐ no repositório, isso ajuda o projeto a alcançar mais pessoas.
Sinta-se à vontade para fazer um fork, abrir issues ou enviar pull requests. Toda contribuição é muito bem-vinda!