CONN_MAX_AGE para reduzir churn de conexões

TLDR: Configura conexões persistentes de banco em production, para não reabrir uma conexão nova a cada request.

Contexto

Depois de adicionar o RDS Proxy, a métrica DatabaseConnections (proxy → RDS) estabilizou em ~15. No entanto, ClientConnections (Django → proxy) ainda mostra um padrão em dente de serra: as conexões sobem com o tráfego e caem para ~4 quando ocioso.

A causa raiz é que o Django, sem CONN_MAX_AGE, fecha a conexão de banco no fim de cada request. Cada request novo paga de novo o custo do handshake TCP e da autenticação no proxy.

Objetivos

  • Reutilizar conexões de banco entre requests dentro de cada worker do gunicorn
  • Achatar o dente de serra de ClientConnections
  • Adicionar health checks para evitar reutilizar conexões mortas (obrigatório com gevent)

Fora de escopo

— (não registrado na spec original)

Mudanças

  • config/settings/production.py: envolver os resultados de db_url para adicionar CONN_MAX_AGE e CONN_HEALTH_CHECKS nos bancos default e readonly

python DATABASES = { 'default': { **config('DB_URL', cast=db_url), 'CONN_MAX_AGE': 60, 'CONN_HEALTH_CHECKS': True, }, 'readonly': { **config('DB_URL_READER', cast=db_url), 'CONN_MAX_AGE': 60, 'CONN_HEALTH_CHECKS': True, }, }

CONN_HEALTH_CHECKS=True é obrigatório porque o gunicorn usa gevent — sem ele, uma conexão morta compartilhada entre greenlets pode causar erros.

Como verificar

Após o deploy, checar as métricas do RDS Proxy no CloudWatch: - ClientConnections deve manter uma linha de base estável entre requests, em vez de cair para ~4 - DatabaseConnections deve permanecer plana em ~15 (inalterada)

Documentação

Nenhuma mudança de documentação necessária.