$ cat system-design-como-estimar-escala-sem-panico.md

O cálculo que assusta em entrevistas de System Design, mas não deveria

· 9 min read · [system-design]

Existe um momento em entrevistas de System Design que costuma causar aquele frio na barriga.

Você está conversando sobre requisitos, APIs, bancos de dados e componentes quando o entrevistador pergunta:

Quantas requisições por segundo esse sistema precisa suportar?

Nesse momento, várias dúvidas aparecem ao mesmo tempo.

Quantos utilizadores devo considerar? Quantas ações cada pessoa realiza? Preciso chegar ao número exato? O que acontece se eu errar uma conta simples?

Essa etapa é conhecida como Back-of-the-Envelope Estimation, que podemos traduzir como uma estimativa rápida ou um cálculo de guardanapo.

Apesar de envolver números, ela não é realmente uma prova de matemática.

É uma forma de tornar o seu raciocínio visível.

Você não precisa acertar o número exato

Quando estimamos a escala de um sistema, não estamos tentando prever exatamente quantos servidores a aplicação utilizará daqui a três anos.

O objetivo é descobrir a ordem de grandeza do problema.

Existe uma diferença enorme entre projetar um sistema para:

  • 300 requisições por segundo;
  • 30 mil requisições por segundo;
  • 300 mil requisições por segundo.

Da mesma forma, armazenar 50 GB é um problema completamente diferente de armazenar 50 PB.

A estimativa precisa ser boa o suficiente para ajudar a responder algumas perguntas:

  • O sistema realmente terá uma escala elevada?
  • O maior volume estará nas leituras ou nas escritas?
  • O armazenamento será um desafio relevante?
  • Precisaremos de cache?
  • A largura de banda poderá ser um gargalo?
  • Será necessário distribuir os dados entre várias regiões?

Antes mesmo de desenhar o primeiro componente, os números já começam a mostrar onde a arquitetura poderá ficar mais difícil.

O entrevistador quer acompanhar o seu raciocínio

Uma boa estimativa pode começar com uma frase simples:

Vou declarar algumas premissas para conseguirmos estimar a ordem de grandeza.

Essa frase muda completamente a conversa.

Você não está dizendo que conhece os números reais da empresa. Está apenas criando um cenário razoável para orientar o design.

Por exemplo:

  • 300 milhões de utilizadores ativos por mês;
  • 50% utilizam a aplicação diariamente;
  • cada utilizador realiza duas ações por dia;
  • o tráfego no horário de pico é duas vezes maior do que a média.

Caso o entrevistador prefira outras premissas, ele poderá ajustá-las. O método continuará exatamente o mesmo.

As suas premissas não precisam ser perfeitas. Elas precisam ser claras.

Um método simples para estimar a escala

Sempre que alguém pedir uma estimativa, você pode seguir esta sequência.

1. Calcule os utilizadores ativos por dia

Normalmente começamos com o número de utilizadores ativos por mês, chamado de Monthly Active Users, ou MAU.

DAU = MAU × percentagem de utilizadores ativos diariamente

Se tivermos 300 milhões de MAU e assumirmos que 50% utilizam o sistema todos os dias:

300 milhões × 50% = 150 milhões de DAU

Agora temos o número de Daily Active Users, ou DAU.

2. Calcule as ações realizadas por dia

Se cada utilizador realiza duas ações diariamente:

150 milhões × 2 = 300 milhões de ações por dia

3. Transforme ações diárias em QPS

Um dia possui 86.400 segundos.

Portanto:

QPS médio = requisições por dia ÷ 86.400

No nosso exemplo:

300 milhões ÷ 86.400 ≈ 3.500 QPS

Durante uma estimativa inicial, também podemos arredondar 86.400 para aproximadamente 100.000, ou 10⁵.

Isso facilita bastante o cálculo mental:

300 milhões ÷ 100 mil ≈ 3.000 QPS

O resultado não é exato, mas está na ordem de grandeza correta.

Em uma entrevista de System Design, isso costuma ser muito mais importante do que chegar ao último dígito.

4. Considere o horário de pico

O tráfego de uma aplicação não é distribuído de maneira uniforme durante o dia.

Uma aplicação pode receber mais acessos durante a noite, depois do envio de uma notificação ou durante algum evento importante.

Por isso, podemos aplicar um Peak Factor, normalmente entre duas e três vezes o tráfego médio.

Peak QPS = Average QPS × Peak Factor

Utilizando um fator de pico de duas vezes:

3.500 × 2 = 7.000 QPS no pico

Pronto. Já temos uma primeira noção da carga que o sistema deverá suportar.

Quando a estimativa revela o verdadeiro problema

Vamos adicionar armazenamento ao mesmo exemplo.

Imagine que:

  • 10% das publicações possuem uma imagem ou outro conteúdo multimédia;
  • cada conteúdo possui aproximadamente 1 MB;
  • os dados serão armazenados durante cinco anos.

O armazenamento diário seria:

150 milhões de utilizadores
× 2 publicações por dia
× 10%
× 1 MB

= 30 TB por dia

Durante cinco anos:

30 TB × 365 × 5 ≈ 55 PB

Observe o que aconteceu.

O sistema possui aproximadamente 3.500 escritas por segundo, um número que pode parecer relativamente administrável.

Por outro lado, ele precisa armazenar aproximadamente 55 petabytes de conteúdo.

A estimativa acabou de mostrar que o maior desafio provavelmente não está no número de requisições. O problema mais complexo pode estar no armazenamento, na replicação, na distribuição e na entrega desses ficheiros.

Descobrimos isso antes de escolher banco de dados, cache, fila, linguagem de programação ou qualquer serviço de cloud.

Esse é o verdadeiro valor do Back-of-the-Envelope Estimation.

Os números que realmente vale a pena memorizar

Você não precisa decorar dezenas de fórmulas.

Um pequeno conjunto de números resolve a maior parte das estimativas.

86.400 segundos por dia

Esse é o número utilizado para transformar ações diárias em QPS.

Como atalho:

86.400 ≈ 100.000 ≈ 10⁵

Outra referência útil:

1 milhão de ações por dia ≈ 10 QPS
100 milhões de ações por dia ≈ 1.000 QPS
1 bilhão de ações por dia ≈ 10.000 QPS

A escada de armazenamento

Cada passo representa aproximadamente mil vezes mais dados:

KB → MB → GB → TB → PB

Se você mantiver essa sequência na cabeça, ficará muito mais fácil converter milhões de registos em gigabytes, terabytes ou petabytes.

O fator de pico

O QPS médio raramente representa o momento mais movimentado do sistema.

Como aproximação inicial:

Peak QPS ≈ Average QPS × 2 ou 3

Mais importante do que escolher exatamente duas ou três vezes é explicar a premissa utilizada.

O fator de replicação

Este é um dos termos mais fáceis de esquecer.

Se o sistema armazena três cópias de cada dado:

Armazenamento físico = armazenamento lógico × 3

Cinquenta terabytes de dados podem rapidamente transformar-se em 150 terabytes após a replicação.

Disponibilidade exige redundância. Redundância significa cópias. E cópias ocupam espaço.

A largura de banda

Outra conta simples, mas frequentemente esquecida:

Bandwidth = QPS × tamanho do payload

Mil respostas por segundo com 1 MB cada representam:

1.000 × 1 MB = 1 GB por segundo

Nesse cenário, o limite pode não estar na CPU ou no banco de dados. Ele pode estar na rede e no custo de transferência dos dados.

Erros comuns durante a estimativa

Alguns pequenos hábitos evitam grande parte dos problemas durante a entrevista.

Escreva sempre as unidades

O número 5 não significa nada sozinho.

São 5 KB, 5 MB, 5 GB, 5 mil requisições ou 5 servidores?

Uma unidade esquecida pode transformar uma conta correta numa conclusão completamente errada.

Arredonde sem culpa

Transforme uma conta como:

99.987 ÷ 9,1

em:

100.000 ÷ 10

Você está fazendo uma estimativa, não fechando a contabilidade anual de uma empresa.

Diga as premissas em voz alta

Uma frase como esta demonstra organização e maturidade:

Vou assumir que 40% dos utilizadores estão ativos diariamente e que o pico é aproximadamente três vezes maior do que a média.

Mesmo que os números mudem, o método continua válido.

Faça uma verificação de sanidade

Ao terminar, pergunte:

  • O resultado parece razoável?
  • Estou falando de centenas ou centenas de milhares de QPS?
  • O armazenamento deveria estar em gigabytes ou petabytes?
  • Esqueci o fator de replicação?
  • Estou misturando bits e bytes?
  • O sistema possui mais leituras ou escritas?
  • O tamanho do payload faz sentido?

Essa pequena pausa pode encontrar erros antes que eles afetem o restante do design.

Uma ferramenta para praticar o raciocínio

Para tornar esse processo mais visual, criei um pequeno conjunto de recursos para praticar estimativas de System Design.

O estimador interativo começa com o conhecido exemplo do Twitter e mostra cada etapa do cálculo.

Você pode alterar:

  • número de utilizadores;
  • percentagem de utilizadores ativos diariamente;
  • ações realizadas por utilizador;
  • proporção entre leituras e escritas;
  • tamanho do payload;
  • período de retenção;
  • fator de pico;
  • fator de replicação;
  • capacidade estimada de cada servidor.

Em vez de apresentar apenas o resultado, a ferramenta mostra como cada valor foi calculado.

Essa é uma parte importante do processo, porque o objetivo não é memorizar uma resposta pronta. O objetivo é entender como as premissas se transformam em números e como esses números influenciam a arquitetura.

Também preparei um poster imprimível em formato A4 com as principais fórmulas, referências de latência, níveis de disponibilidade, unidades e atalhos de cálculo mental.

A ideia é imprimir, colocar próximo à secretária e consultar com frequência até que os números comecem a parecer familiares.

Todo o material, incluindo o código-fonte, as fórmulas e um conjunto de exercícios de revisão, está disponível no meu repositório de estudos:

github.com/mhayk/system-design

Confiança não vem de decorar todas as respostas

A parte mais desconfortável de uma entrevista de System Design costuma ser não saber exatamente qual resposta o entrevistador espera.

Mas esse é justamente o ponto.

Na vida real, raramente começamos um projeto com todas as informações disponíveis. Trabalhamos com requisitos incompletos, premissas, métricas aproximadas e limites que mudam ao longo do tempo.

Uma boa estimativa demonstra que você consegue trabalhar com essa incerteza.

Você não precisa prever o futuro.

Não precisa acertar o número exato.

Não precisa fazer toda a matemática mentalmente e em silêncio.

Você precisa declarar as suas premissas, manter as unidades visíveis, arredondar com bom senso e explicar o que os números significam para a arquitetura.

Na próxima vez que alguém perguntar:

Quantas requisições por segundo esse sistema precisa suportar?

Respire.

Escreva as premissas.

Divida por 86.400.

Encontre a ordem de grandeza.

Depois, use o resultado para descobrir onde o sistema realmente fica difícil.

O frio na barriga pode até continuar aparecendo, mas agora você terá um método para saber exatamente por onde começar.

Leave a Reply