Connection pooling: pgbouncer e a trap serverless
⏱ 11 min·⭐ 50 XP
Pré-requisitos (0/1)0%
- ⬜🧹 Vacuum, autovacuum e bloat: causa #1 de DB morrendo(Database Deep — Postgres Internals)
Recomendamos completar os pré-requisitos antes de seguir, mas nada te impede de continuar.
Pgbouncer modos
| Mode | Quando libera conn | Trade-off |
|---|---|---|
| session | No DISCONNECT do client | Sem pooling real; só middleman |
| transaction | No COMMIT/ROLLBACK | Default moderno; perde LISTEN/NOTIFY, session temp tables, prepared statements (PG 14+ ajuda) |
| statement | Após cada statement | Maior pooling; perde prepared, multi-statement tx |
Modesession
Quando libera connNo DISCONNECT do client
Trade-offSem pooling real; só middleman
Modetransaction
Quando libera connNo COMMIT/ROLLBACK
Trade-offDefault moderno; perde LISTEN/NOTIFY, session temp tables, prepared statements (PG 14+ ajuda)
Modestatement
Quando libera connApós cada statement
Trade-offMaior pooling; perde prepared, multi-statement tx
Config pgbouncer exemplo
# pgbouncer.ini
[databases]
mydb = host=pg-primary port=5432 dbname=mydb
[pgbouncer]
listen_addr = 0.0.0.0
listen_port = 6432
auth_type = md5
pool_mode = transaction
max_client_conn = 10000 # clients lógicos
default_pool_size = 20 # conns físicas por database
reserve_pool_size = 5
reserve_pool_timeout = 3
# App conecta em pgbouncer:6432 em vez de pg:5432Quiz rápido
Qual modo de agrupamento de conexões é mais agressivo, e o que ele exige da aplicação?
Serverless options
- RDS Proxy: AWS managed pooler. Preço: $0.015/vCPU/hr. Integra IAM + Secrets Manager.
- Neon Pooler: embutido em Neon (serverless Postgres).
- Supabase Supavisor: open-source, Rust. Multi-tenant scale.
- Prisma Accelerate: pooler + cache em cima, tier free até 10M queries/mês.
- PlanetScale (MySQL): nativo scale-out com vtgate.
💡
Em 2026, se você escolhe Postgres pra serverless (Lambda, Cloudflare Workers, Vercel Edge), pooler é obrigatório. Ignorar vai estourar em produção mais cedo ou mais tarde.
Perguntas frequentes
❓ Por que o Postgres sofre com muitas conexões?
Porque cada conexão é um processo do sistema operacional com memória própria — centenas de conexões consomem memória e trocam de contexto sem fazer trabalho. É diferente de bancos com modelo de linha de execução, e é a razão de o reservatório externo ser praticamente obrigatório.
❓ Qual modo de reservatório usar?
Modo de transação para a maioria das aplicações: a conexão volta ao reservatório no fim de cada transação, o que maximiza reuso. Modo de sessão quando a aplicação depende de estado de sessão — variável, tabela temporária, comando preparado. Escolher transação com dependência de sessão gera erro intermitente difícil de rastrear.
❓ Por que reservatório é crítico em ambiente sem servidor?
Porque cada instância de função pode abrir a própria conexão, e a plataforma escala a instância sem consultar o banco — mil execuções simultâneas viram mil conexões. O reservatório externo, ou um serviço de reservatório gerenciado, é o que impede o banco de cair no primeiro pico.
Fixando
Quiz rápido
Por que um agrupador externo é necessário mesmo com agrupamento na aplicação?
Quiz rápido
Qual sintoma indica que o dimensionamento do conjunto está errado para mais?
Terminou de ler?
Marcar como concluído registra o XP, mantém sua sequência e coloca 3 cartas deste módulo na fila de revisão espaçada.
Próximos passos sugeridos
Temas deste módulo
Discussão
Carregando comentários…