DBAtlas · Atlas de operações de banco de dados

Arquitetura de referência: aplicação OLTP em 3 camadas

Aplicações de negócio clássicas (pedidos, pagamentos, estoque) executam um grande número de transações curtas, de linha única e críticas para a consistência (OLTP). Esta árvore mostra passo a passo, a partir da identificação do perfil de carga, quando introduzir o banco relacional primário, um pooler de conexões, read replicas, uma camada de cache, backup + PITR e monitoramento. O objetivo não é 'adicionar tudo de início', mas adicionar o componente certo à medida que cada gargalo é comprovado.

Qual é o seu perfil de carga: mix de transações e requisitos de consistência?

A primeira decisão em uma arquitetura OLTP é se a carga é realmente transacional (um mix curto de gravações e leituras que exige ACID). Os dados são naturalmente relacionais e a consistência é crítica (dinheiro, estoque, pedidos), a carga é majoritariamente de leitura, ou a carga ainda é muito baixa?

  • Transações curtas, consistência forte (dinheiro/estoque/pedidos)
  • As leituras predominam fortemente, poucas gravações, e o tráfego está crescendo
  • A carga é muito baixa; a configuração mais simples basta?

Você escolheu o engine de banco principal, e está preocupado com escala?

Um engine relacional é a base certa para o núcleo transacional (PostgreSQL, MySQL/InnoDB, Oracle, SQL Server). Com a escolha do engine definida, a próxima questão é a escalabilidade: uma única instância basta por enquanto, ou o número de conexões e a carga de leitura estão aumentando?

  • O engine está definido; uma única instância basta por enquanto
  • O número de conexões disparou, os recursos estão se esgotando
  • A carga de leitura está crescendo e sobrecarregando a instância primária de gravação

Como você vai escalar as leituras: réplica ou cache?

Se a carga de leitura está sobrecarregando a instância primária, há duas opções complementares. Leituras que toleram dados levemente atrasados, como relatórios/listagens, podem ser direcionadas para uma read replica; se os mesmos dados 'quentes' forem solicitados repetidamente, um cache com latência de microssegundos (Redis) alivia o banco.

  • Muitas leituras de relatórios/listagens; um leve lag é aceitável
  • Os mesmos dados populares são lidos repetidamente

Recomendação: comece com um único primário + pool + backup

Mantenha a arquitetura simples no início: uma única instância primária relacional, um pool de conexões à frente dela e backups regulares bastam. Adicione complexidade somente quando um gargalo medido exigir.

Recomendação: adicione um pooler de conexões

Em OLTP, quando cada instância da aplicação abre as próprias conexões, o banco primário sufoca com o overhead de memória e de escalonamento sob milhares de conexões. Colocar um pooler no meio compartilha um pequeno número de conexões reais com o banco entre muitos requests da aplicação.

Recomendação: adicione uma read replica

As gravações permanecem no primário enquanto o tráfego somente leitura (relatórios, listagens, busca) é direcionado para uma ou mais réplicas assíncronas alimentadas pelo primário. Isso libera o primário para gravações e leituras críticas para a consistência.

Recomendação: adicione uma camada de cache (Redis)

Se os mesmos dados populares (sessões, catálogo, perfis, fragmentos de página) são lidos repetidamente, coloque um cache em memória à frente do banco e atenda a maioria das leituras sem sequer chegar ao banco. A latência cai e o banco primário fica aliviado.

Abrir no DBAtlas →