Skip to content

Substituição do Redis por RabbitMQ como broker de mensageria do Celery#1413

Draft
Copilot wants to merge 3 commits intomainfrom
copilot/replace-redis-with-rabbitmq
Draft

Substituição do Redis por RabbitMQ como broker de mensageria do Celery#1413
Copilot wants to merge 3 commits intomainfrom
copilot/replace-redis-with-rabbitmq

Conversation

Copy link
Copy Markdown
Contributor

Copilot AI commented Mar 19, 2026

O que esse PR faz?

Substitui o Redis pelo RabbitMQ como broker do Celery. Redis permanece para cache, sessões e result backend.

Broker (RabbitMQ):

  • Serviço rabbitmq adicionado em local.yml (com management UI) e production.yml
  • CELERY_BROKER_URL=******rabbitmq:5672// nos arquivos .envs
  • Dependências dos serviços celeryworker/celerybeat/django atualizadas
  • celery-exporter apontando para RabbitMQ

Result backend (Redis):

  • CELERY_RESULT_BACKEND desacoplado do broker — agora lê env("CELERY_RESULT_BACKEND") com default redis://redis:6379/0

Entrypoint:

  • Removida derivação export CELERY_BROKER_URL="${REDIS_URL}" — agora vem direto do env file

Onde a revisão poderia começar?

config/settings/base.py (linhas 367–369) — separação de broker vs result backend. Depois local.yml e production.yml para os serviços Docker.

Como este poderia ser testado manualmente?

  1. docker-compose -f local.yml up -d
  2. Verificar que RabbitMQ está acessível em http://localhost:15672 (guest/guest)
  3. Disparar uma task Celery e verificar nos logs do celeryworker que conectou via AMQP
  4. Confirmar que cache Django (Redis) continua funcional

Algum cenário de contexto que queira dar?

Componente Antes Depois
Celery broker Redis RabbitMQ (AMQP)
Celery result backend Redis (via broker URL) Redis (env var dedicada)
Cache/Sessions Redis Redis (sem alteração)

A separação broker ≠ result backend permite escalar e operar cada componente independentemente. RabbitMQ oferece ack nativo, dead-letter queues e roteamento AMQP que Redis não suporta.

Screenshots

N/A — alterações de infraestrutura/configuração.

Quais são tickets relevantes?

Referências

Original prompt

This section details on the original issue you should resolve

<issue_title>Substituição do Redis por RabbitMQ como broker de mensageria.</issue_title>
<issue_description>
Atualmente a aplicação utiliza o Redis como broker para gerenciamento de filas assíncronas.
Apesar de funcional, o Redis não é especializado em mensageria e possui limitações em cenários mais complexos (roteamento, confiabilidade, escalabilidade).

Este PR propõe a substituição do Redis pelo RabbitMQ, que é uma solução robusta e nativa para mensageria.


Objetivo

  • Tornar a camada de mensageria mais robusta e confiável
  • Melhorar o controle de filas (ack, retry, dead-letter)
  • Preparar a aplicação para cenários de maior escala
  • Padronizar com boas práticas de arquitetura assíncrona

Alterações realizadas

  • Substituição do broker Redis por RabbitMQ
  • Atualização das variáveis de ambiente:
    • CELERY_BROKER_URL
    • CELERY_RESULT_BACKEND (se aplicável)
  • Ajustes no docker-compose para inclusão do RabbitMQ
  • Atualização da configuração do Celery
  • Remoção de dependências relacionadas ao Redis (quando não utilizadas)
  • Revisão dos workers e filas existentes

Configuração

Exemplo de broker:

CELERY_BROKER_URL=amqp://user:password@rabbitmq:5672//</issue_description>

## Comments on the Issue (you are @copilot in this section)

<comments>
</comments>

💡 You can make Copilot smarter by setting up custom instructions, customizing its development environment and configuring Model Context Protocol (MCP) servers. Learn more Copilot coding agent tips in the docs.

Copilot AI and others added 2 commits March 19, 2026 13:22
- Add RabbitMQ service to local.yml and production.yml docker-compose files
- Update service dependencies to include rabbitmq for django, celeryworker, celerybeat
- Set CELERY_BROKER_URL to amqp://guest:guest@rabbitmq:5672// in env files
- Change CELERY_RESULT_BACKEND to use Redis directly (decoupled from broker)
- Remove CELERY_BROKER_URL derivation from REDIS_URL in production entrypoint
- Update celery-exporter broker URL to use RabbitMQ
- Update start-dev.sh and docs/conf.py broker URLs
- Keep Redis for caching, sessions, and result backend

Co-authored-by: robertatakenaka <505143+robertatakenaka@users.noreply.github.com>
Co-authored-by: robertatakenaka <505143+robertatakenaka@users.noreply.github.com>
Copilot AI changed the title [WIP] Replace Redis with RabbitMQ as messaging broker Substituição do Redis por RabbitMQ como broker de mensageria do Celery Mar 19, 2026
Copilot AI requested a review from robertatakenaka March 19, 2026 13:25
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Este PR migra o broker do Celery de Redis para RabbitMQ (AMQP), mantendo o Redis para cache/sessões e como result backend, para separar responsabilidades e facilitar a operação/escala.

Changes:

  • Atualiza a configuração do Django/Celery para desacoplar CELERY_BROKER_URL de CELERY_RESULT_BACKEND.
  • Adiciona serviço rabbitmq e ajusta dependências/integrações nos docker-compose (local e produção), incluindo celery-exporter.
  • Atualiza envs/scripts para apontarem o broker para RabbitMQ.

Reviewed changes

Copilot reviewed 8 out of 8 changed files in this pull request and generated 7 comments.

Show a summary per file
File Description
config/settings/base.py Separa broker (CELERY_BROKER_URL) de result backend (CELERY_RESULT_BACKEND com default Redis).
local.yml Adiciona serviço rabbitmq (management) e inclui como dependência de django/celeryworker/celerybeat.
production.yml Adiciona serviço rabbitmq e atualiza dependências/celery-exporter para AMQP.
.envs/.local/.django Define CELERY_BROKER_URL apontando para RabbitMQ.
.envs/.production/.django Define RABBITMQ_DEFAULT_* e CELERY_BROKER_URL para RabbitMQ.
compose/production/django/entrypoint Remove export automático de CELERY_BROKER_URL a partir de REDIS_URL.
docs/conf.py Define fallback de CELERY_BROKER_URL para permitir django.setup() em builds de docs.
start-dev.sh Ajusta broker do Celery para AMQP no modo USE_DOCKER=no.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

CELERY_BROKER_URL = env("CELERY_BROKER_URL")
# http://docs.celeryproject.org/en/latest/userguide/configuration.html#std:setting-result_backend
CELERY_RESULT_BACKEND = CELERY_BROKER_URL
CELERY_RESULT_BACKEND = env("CELERY_RESULT_BACKEND", default="redis://redis:6379/0")
Comment on lines +11 to +16
RABBITMQ_DEFAULT_USER=guest
RABBITMQ_DEFAULT_PASS=guest

# Celery
# ------------------------------------------------------------------------------
CELERY_BROKER_URL=amqp://guest:guest@rabbitmq:5672//
ports:
- "5672:5672"
env_file:
- ./.envs/.production/.django
ports:
- 9808:9808
command: ["--broker-url=redis://redis:6379/0"]
command: ["--broker-url=amqp://guest:guest@rabbitmq:5672//"]
container_name: scielo_core_local_rabbitmq
ports:
- "5672:5672"
- "15672:15672"

# Celery
# ------------------------------------------------------------------------------
CELERY_BROKER_URL=amqp://guest:guest@rabbitmq:5672//
Comment on lines +13 to 16
export CELERY_BROKER_URL=amqp://guest:guest@$IP:5672//
export USE_DOCKER=no
export IPYTHONDIR=/app/.ipython
export REDIS_URL=redis://$IP:6399/0
@gitnnolabs
Copy link
Copy Markdown
Collaborator

Testado e funcionando como esperado, necessário realizar teste de massa em ambiente com volume de dados.

Copy link
Copy Markdown
Collaborator

@gitnnolabs gitnnolabs left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Localmente foi testado rodando a tarefa hello

Comment on lines +11 to +12
RABBITMQ_DEFAULT_USER=guest
RABBITMQ_DEFAULT_PASS=guest
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Usuários de acordo com a review do Copilot

sys.path.insert(0, os.path.abspath("/app"))
os.environ["DATABASE_URL"] = "sqlite:///readthedocs.db"
os.environ["CELERY_BROKER_URL"] = os.getenv("REDIS_URL", "redis://redis:6379")
os.environ["CELERY_BROKER_URL"] = os.getenv("CELERY_BROKER_URL", "amqp://guest:guest@rabbitmq:5672//")
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Usuários de acordo com a review do Copilot. Dá para usar as variáveis de ambiente também.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Substituição do Redis por RabbitMQ como broker de mensageria.

5 participants