Guia de sobrevivência de Postgres da startup

Engenheiros de startups trocando histórias de guerra sobre operar PostgreSQL enfatizam que o básico operacional — monitoramento, backups e pool de conexões — importa mais para a sobrevivência do que ajustes exóticos. Comentadores debatem serviços gerenciados como AWS RDS versus auto-hospedagem em VPS baratos, equilibrando custo, lock-in e a necessidade de alta disponibilidade, enquanto compartilham ferramentas concretas de backup, estratégias de pooling e limites de configurações DIY. Design de esquema e padrões de consulta são outro tema central, com conselhos para favorecer normalização sólida em vez de uso intenso de JSONB, ter cautela com transações e bloqueios longos e entender índices, migrations e ORMs bem o suficiente para evitar armadilhas de desempenho e confiabilidade à medida que os sistemas escalam.

Backups, Monitoramento e Noções Básicas de “Sobrevivência”

  • Vários comentaristas acham que o guia minimiza backups, restores e monitoramento.
  • Há um forte consenso de que qualquer Postgres em produção precisa de:
    • Backups automatizados (idealmente PITR) e testes regulares de restauração.
    • Monitoramento de XID wraparound, uso de disco e transações longas, com alertas por paging, não por e-mail.
  • Ferramentas mencionadas: pgBackRest (popular, PITR, deltas incrementais, mas exige backups completos periódicos), Barman, pg_dump+cron+object storage simples, e snapshots de volume (por exemplo, EBS) como estratégia secundária.

Postgres Gerenciado vs Auto-hospedado

  • Muitos defendem usar serviços gerenciados (RDS/Cloud SQL) cedo para HA, backups, PITR e menor carga operacional.
  • Outros relatam réplicas superdimensionadas e custos inflados, ou limitações frustrantes e lock-in na nuvem.
  • Alguns argumentam que alguns DBAs, mais Postgres auto-hospedado (muitas vezes em VPS barato ou Hetzner), oferecem mais flexibilidade e menor custo; configurações básicas de HA podem ser executadas de forma barata.

Design de Esquema, Normalização e JSONB

  • Há forte concordância de que bom design de esquema e normalização importam; ORMs que geram schemas automaticamente são criticados.
  • JSONB é útil para dados variáveis ou em estilo de logs, mas seu uso excessivo pode prejudicar desempenho e qualidade dos dados; schemas normalizados com joins costumam ser rápidos o suficiente.
  • Alguns recomendam tabelas append-only de “fonte da verdade” com views desnormalizadas derivadas; outros alertam que event sourcing em todo lugar é exagero para startups.

Índices, UUIDs e Planejamento de Consultas

  • Discussão sobre tipos de índice: btree por padrão, mas GIN/GiST, BRIN e índices hash podem ser poderosos nos workloads certos.
  • Conselho para considerar UUIDv7 em vez de UUIDv4 para melhor localidade de índice; outros observam que chaves primárias bigint serial costumam ser mais simples e rápidas para joins.
  • Peculiaridades do planner: às vezes várias consultas mais simples ou joins em memória superam uma consulta complexa; alguns desativam seqscan em testes para inspecionar o uso de índices.

Transações, Bloqueio e Deadlocks

  • Alertas contra sessões longas ou ociosas em transação; recomenda-se o uso de timeouts (idle_in_transaction_session_timeout, lock_timeout, statement_timeout).
  • Para evitar deadlocks, ordene consistentemente os bloqueios de linhas e tabelas; retries podem piorar a contenção em linhas quentes.
  • Debate sobre SELECT … FOR UPDATE e SKIP LOCKED: úteis para filas e jogos vs um cheiro ruim se o seu modelo central é append-only.

Pool de Conexões

  • Limites de conexões são um modo comum de falha em startups.
  • Poolers externos como PgBouncer (LIFO) ajudam a reduzir conexões com o banco, em comparação com pools FIFO no processo, que principalmente reduzem latência.
  • Cuidado com transações por requisição e conexões injetadas por dependência que mantêm transações abertas por tempo demais.

Funções Armazenadas e ORMs

  • Visões divididas: alguns veem stored procedures como poderosas para constraints, triggers e segurança; outros as evitam para manter a lógica no código da aplicação e preservar flexibilidade.
  • Divisão semelhante sobre ORMs: alguns os consideram dívida técnica de longo prazo e preferem SQL cru; outros os acham produtivos, desde que você entenda SQL e desça para o nível inferior quando necessário.