Pular para o conteúdo principal

Conceitointermediário

Estratégias Básicas de Escalabilidade

Visão Geral

Identificado o gargalo, há um conjunto conhecido de respostas.

Este documento as apresenta na ordem de custo — que é diferente da ordem em que elas costumam ser consideradas. A tendência natural é começar pelas caras.

Problema

"Precisamos escalar" costuma significar "vamos distribuir": mais serviços, mais partições, mais componentes.

Essa é a resposta mais cara e frequentemente a última necessária. Antes dela há várias que custam ordens de grandeza menos e resolvem a maior parte dos casos.

O erro não é distribuir — é distribuir antes de ter esgotado o que é barato. E depois de distribuir, voltar atrás custa migração.

Conceitos Centrais

A ordem de custo

1. Remover o trabalho. O ganho mais barato: uma consulta que não precisa existir, um campo que ninguém lê, uma chamada que pode ser eliminada. Custa quase nada e é a menos considerada.

2. Corrigir o que está errado. Índice ausente, consulta que percorre tabela, N+1. Frequentemente o gargalo inteiro está aqui, e a correção leva horas.

3. Escalar verticalmente. Uma máquina maior. É desprezado por não parecer arquitetura, e resolve mais do que se admite — máquinas modernas comportam cargas que exigiriam clusters há uma década. Custa dinheiro e nenhuma complexidade.

4. Cachear. Evitar recalcular. Ver cache. Custa invalidação e um componente.

5. Escalar horizontalmente. Mais instâncias sem estado atrás de um balanceador. Custa a exigência de ausência de estado.

6. Tornar assíncrono. Mover trabalho para fila. Custa consistência eventual, duplicação e ordem.

7. Replicar leitura. Réplicas do banco. Custa atraso de replicação e roteamento de consulta.

8. Particionar. Dividir os dados por chave. Custa muito: operações que atravessam partições ficam caras, e a escolha da chave é difícil de reverter.

Cada degrau custa mais que o anterior. Suba um de cada vez, medindo.

Escala vertical é subestimada

O reflexo é tratar escala vertical como derrota. Vale contrapor com números: uma instância de banco atual comporta dezenas de milhares de transações por segundo e centenas de gigabytes em memória.

A maior parte dos sistemas que adota particionamento nunca chegou perto de saturar uma instância única — e assumiu permanentemente o custo de operações entre partições.

Escala vertical tem limite, e o limite é mais alto do que a intuição sugere.

Ausência de estado é o degrau que destrava

O passo 5 depende de ausência de estado. Um componente com estado local não escala horizontalmente sem afinidade — que desequilibra — ou sem particionamento — que é o degrau 8.

Por isso vale investir em ausência de estado cedo: ela é barata quando o sistema é pequeno e cara de retrofitar depois.

Reduzir a carga é uma estratégia

O degrau 1 merece ser dito de novo, porque quase nunca aparece nas discussões.

Uma tela que carrega 40 campos e mostra 5. Um relatório calculado em tempo real que ninguém abre. Uma sincronização que roda a cada minuto quando de hora em hora bastaria.

Cada um desses é capacidade recuperada sem nenhum custo arquitetural.

Escalar não conserta

Escala aumenta capacidade; ela não corrige lentidão intrínseca. Se cada requisição leva 3 segundos por uma consulta ruim, dez instâncias atendem dez vezes mais requisições — todas em 3 segundos.

Ver desempenho versus escalabilidade.

Modelo Mental

Suba um degrau por vez, medindo entre eles. O degrau certo é o mais barato que resolve o gargalo atual.

Quando Usar

  • O gargalo foi identificado por medição.
  • O requisito não está sendo atendido.
  • Há previsão de crescimento com prazo.
  • Um recurso está acima de 70% de utilização.

Quando Não Usar

Antes de identificar o gargalo. Escalar o que não limita não muda nada — e escalar a aplicação quando o gargalo é o banco piora, porque mais instâncias significam mais conexões.

Quando o requisito já é atendido. Capacidade ociosa é custo.

Pulando degraus. Particionar sem ter tentado índice, cache e escala vertical é assumir custo permanente por um problema possivelmente temporário.

Quando o problema é latência de uma operação. Escala não torna nada mais rápido.

Sem medir depois. Sem verificação, ninguém sabe se o degrau resolveu.

Alternativas

  • Reduzir a carga — o degrau 1, e o mais barato.
  • Aceitar a degradação — se o pico é raro e a consequência é pequena, aceitar pode ser mais barato que dimensionar para ele.
  • Limitar a taxa — proteger a capacidade em vez de aumentá-la. Ver rate limiting.
  • Degradar — servir versão mais barata sob pressão.

Trade-offs

DegrauGanhoCusto
Remover trabalhoVariável, às vezes grandeNenhum
Corrigir consultaFrequentemente ordens de grandezaHoras
Escalar verticalLinear até o limiteDinheiro
CacheAlto em leituraInvalidação, frescor
Escalar horizontalLinearAusência de estado
AssíncronoAbsorve picoConsistência eventual
Réplica de leituraLeitura escalaAtraso, roteamento
ParticionarEscrita escalaOperações entre partições, chave difícil

Modos de Falha

Escalar a aplicação com o banco saturado. Mais conexões, mais pressão.

Particionar com chave errada. Uma partição concentra a carga — um hotspot — e o particionamento não ajuda.

Cache mascarando problema. A taxa de acerto cai e o problema volta pior.

Assíncrono escondendo incapacidade. A fila cresce indefinidamente.

Réplica com atraso não considerado. Leitura logo após escrita não vê o dado.

Erros Comuns

Pular direto para distribuição. Distribuir troca um problema de capacidade por falha parcial, latência de rede e consistência — três problemas mais difíceis que o original, adquiridos antes de esgotar o que era barato.

Não considerar escala vertical. Uma máquina hoje comporta centenas de gigabytes de memória e dezenas de núcleos. Trocar de instância é uma tarde de trabalho e resolve a maior parte dos sistemas de negócio por anos.

Não medir entre degraus. Sem medir depois de cada mudança, ninguém sabe se o gargalo se moveu — e otimizar o componente que deixou de ser o limite é trabalho com retorno zero.

Confundir escala com desempenho. São eixos independentes e às vezes opostos: um sistema pode responder em 10 ms e não suportar dobrar a carga, e a otimização que acelera a instância única frequentemente é a que impede distribuir.

Não considerar reduzir a carga. Cache, paginação, remoção de uma consulta desnecessária e limitação de taxa mudam o denominador da conta. É a alternativa mais barata e a que quase nunca entra na lista, porque a pergunta feita foi "como aguentamos mais?" em vez de "por que há tanto?".

Exemplo Real

Um sistema de emissão de boletos atendia 40 requisições por segundo e o requisito era 200. A proposta inicial: particionar o banco e distribuir a aplicação em três regiões.

A subida degrau a degrau levou seis semanas e nunca chegou ao particionamento.

Degrau 1. A tela de emissão carregava o histórico completo do cliente — usado por nenhum campo exibido. Removido: 40 → 65 req/s.

Degrau 2. Duas consultas sem índice adequado, encontradas no perfil. Índices criados: 65 → 140 req/s.

Degrau 3. A instância do banco estava num tamanho definido três anos antes. Dobrada: 140 → 190 req/s. Custo mensal adicional equivalente a dois dias de trabalho de um engenheiro.

Degrau 4. Cache na consulta de dados cadastrais do cliente, que mudavam raramente e eram lidos em toda emissão: 190 → 310 req/s.

Parou aí, com folga de 55% sobre o requisito.

O custo total: seis semanas de trabalho, majoritariamente medição, e um aumento de instância. O plano original — particionamento e multi-região — estava estimado em dois trimestres e teria adicionado custo operacional permanente.

O que a equipe registrou no ADR: os degraus 1 e 2 sozinhos entregaram 250% do ganho, e ambos eram correções de coisas erradas, não escala. Se a proposta original tivesse sido executada, os dois problemas continuariam lá — distribuídos.

Conceitos Relacionados

Exercício Prático

Se seu sistema tem um problema de capacidade, percorra os degraus por escrito antes de agir: existe trabalho a remover? Consulta a corrigir? Quando a instância foi dimensionada pela última vez?

Os três primeiros degraus resolvem a maioria dos casos e quase nunca são tentados na ordem.

Perguntas de Entrevista

  • Qual a ordem de custo das estratégias de escala?
  • Por que escalar a aplicação pode piorar um gargalo de banco?
  • Por que escala vertical é subestimada?

Para Aprofundar

  • Kleppmann, Martin. Designing Data-Intensive Applications. O'Reilly, 2017.
  • Gregg, Brendan. Systems Performance. 2ª ed., 2020.
Terminou de ler este documento?Seu progresso fica salvo apenas neste navegador.