Conteúdos

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:

  1. Exchange para receber mensagens e rotear para fila a partir de routing keys
  2. Queue para receber, armazenar a mensagem e disponibiliza-la aos consumidores
  3. Deadletter Exchange para receber mensagens recusadas pelo consumidor
  4. 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

  1. CLI do git instalado
  2. 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!