Sistema de processamento assíncrono com API e worker em processos separados.
A API recebe jobs via HTTP, persiste o status inicial no Redis e publica na fila. O worker consome os jobs de forma assíncrona com asyncio, atualiza o status e aplica retry com backoff em caso de falha.
- Python 3.12
FastAPI— API HTTPredis-py(async) — fila e persistência de statusasyncio— concorrência no worker viacreate_taskDocker Compose— orquestração de serviços
┌─────────────┐ POST /jobs ┌─────────────────────────┐
│ Cliente │ ──────────────────► │ API (FastAPI) │
└─────────────┘ │ 1. persiste PENDING │
│ 2. RPUSH → fila Redis │
GET /jobs/:id ◄───────────────└──────────┬──────────────┘
(consulta status) │
Redis │ BLPOP
┌──────────▼──────────────┐
│ Worker (asyncio) │
│ 1. PROCESSING │
│ 2. processa (+ retry) │
│ 3. DONE ou FAILED │
└─────────────────────────┘
PENDING → PROCESSING → DONE
↘ FAILED (após MAX_RETRIES tentativas)
docker compose up --buildcurl -X POST http://localhost:8000/jobs \
-H "Content-Type: application/json" \
-d '{"type": "send_email", "data": {"to": "user@example.com"}}'Resposta:
{
"job_id": "uuid-aqui",
"status": "PENDING",
"result": null,
"updated_at": "2024-01-01T00:00:00Z"
}curl http://localhost:8000/jobs/{job_id}curl -X POST http://localhost:8000/jobs \
-H "Content-Type: application/json" \
-d '{"type": "test", "data": {"fail": true}}'O worker vai tentar 3 vezes com backoff linear (2s, 4s) e marcar como FAILED.
A API deve responder rápido e não ficar presa ao tempo de processamento. Por isso ela apenas valida, persiste PENDING e publica o job. O worker tem outra responsabilidade: consumir, processar e atualizar o status — com retry e backoff sem impactar as requisições HTTP. Essa separação permite escalar API e worker de forma independente.