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 dedb_urlpara adicionarCONN_MAX_AGEeCONN_HEALTH_CHECKSnos bancosdefaultereadonly
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.