Curso de Aprenda System Design do ZERO

Categorias

BackendAvançadoSystem Design

📺 Assista ao curso completo no YouTube antes de fazer a prova

Informações do Curso

Carga Horária

1h

Nota Mínima para Aprovação

60%

System Design é uma das habilidades mais importantes para devs que querem construir sistemas escaláveis e também um dos temas mais cobrados em entrevistas para dev pleno e sênior. Nesse curso vamos construir juntos o desenho de um sistema real do zero. Vamos aprender os fundamentos de System Design botando estudando a teoria e botando a mão na massa, mostrando como pensar arquitetura, filas, workers e mensageria para lidar com milhões de eventos.

Conteúdo do curso

0:00

O que é System Design e por que importa

3:43

Exemplos reais de System Design

10:11

Quando você deve se preocupar com System Design

17:00

Escalabilidade, disponibilidade, consistência e CAP

23:32

Escalabilidade horizontal vs vertical

23:36

Disponibilidade: SLA, SLO e SLI e os “noves”

28:12

Consistência e Teorema CAP na prática

37:01

Tradeoffs: como avaliar decisões

47:06

Exemplo prático

Fazer Prova e Tirar Certificado

Faça login e adquira créditos para se inscrever e fazer a prova

Material complementar

🔍 O que é System Design?

System Design é a definição da arquitetura, componentes e interfaces de um sistema com o objetivo de cumprir especificações técnicas e de negócio.

Um bom System Design garante que o sistema:

  • Lida com grandes volumes de dados
  • Escala de acordo com a demanda
  • Se mantém estável em diversas condições

oque-e.png


🏛️ Os Fundamentos

ConceitoO que resolve
EscalabilidadeCrescimento da carga
DisponibilidadeTempo de serviço ativo
ConsistênciaDados íntegros para todos
Teorema CAPTrade-off entre os três acima
Load BalancingDistribuição de tráfego
CacheLeituras rápidas
CDNsEntrega de conteúdo com baixa latência
ReplicaçãoCópias dos dados para segurança
FailoverRecuperação automática de falhas
Pooling / WebSocketsConexões eficientes e em tempo real
Banco de DadosSchema eficiente + escolha certa

conceitos.png


📐 Os 4 Conceitos Essenciais

1. Escalabilidade (Scalability)

Capacidade do sistema de lidar com o aumento de carga adicionando recursos.

TipoComo funcionaLimitação
VerticalMais CPU/RAM na mesma máquinaTem limite físico e de custo
HorizontalAdicionar mais máquinasCrescimento teoricamente infinito ✅

2. Disponibilidade (Availability)

Tempo em que o sistema permanece funcional e acessível. Medida pelos famosos "9s" de uptime.

SLAUptimeDowntime por ano
99%Dois 9s~3,6 dias
99.9%Três 9s~8,7 horas
99.99%Quatro 9s~52 minutos
99.999%Cinco 9s~5 minutos

3. Consistência (Consistency)

Garante que todos os usuários vejam os mesmos dados ao mesmo tempo, independentemente do servidor que acessem.

Exemplo: Se você atualiza seu perfil, a consistência garante que qualquer pessoa que acessar seu perfil verá a informação nova imediatamente.


4. Teorema CAP

Em um sistema distribuído, é impossível garantir os três ao mesmo tempo:

C — Consistency     (Consistência)
A — Availability    (Disponibilidade)
P — Partition Tolerance (Tolerância a falhas de rede)

Como falhas de rede (Partição) são inevitáveis, você sempre terá que escolher entre:

PrioridadeTipoExemplo
CPConsistência + PartiçãoSistema bancário (PIX — o saldo tem que estar certo)
APDisponibilidade + PartiçãoRede social (curtidas no Instagram podem atrasar)

⚖️ Trade-offs

Ao desenhar um sistema, você precisará tomar decisões entre diferentes abordagens. Isso se chama trade-off.

Como analisar um trade-off:

  1. Liste as opções disponíveis
  2. Avalie os prós e contras de cada uma
  3. Decida com base nos requisitos mais importantes do sistema

Exemplo prático — Adicionar Redis como cache:

FatorCom Cache (Redis)Sem Cache
Latência de leitura~60ms ✅~100ms
Custo de infraMaior ❌Menor
ComplexidadeMaior ❌Menor

tradeoffs.png


📋 Requisitos Funcionais vs. Não Funcionais

Antes de desenhar qualquer diagrama ou escolher um banco de dados, separe:

Requisitos Funcionais — "O Quê"

São as funcionalidades diretas, o comportamento do sistema diante de ações do usuário. Basicamente as regras de negócio.

Exemplos:

  • O usuário deve conseguir realizar login via OAuth
  • O sistema deve enviar e-mail de confirmação após a compra
  • O criador deve conseguir visualizar o dashboard de ganhos

Requisitos Não Funcionais — "Como"

Definem os critérios de operação — performance, segurança, confiabilidade. É aqui que o System Design brilha.

Exemplos:

  • Escalabilidade: suportar 100 mil usuários simultâneos
  • Latência: busca de produtos em menos de 200ms
  • Disponibilidade: 99.9% de uptime (SLA)
  • Segurança: dados sensíveis criptografados em repouso

🛠️ Estudo de Caso — NotiFly: Sistema de Alertas em Tempo Real

Requisitos Funcionais

  • Envio de notificações via Push, E-mail e SMS
  • Seguidor pode configurar preferências de alerta
  • Usuário acessa histórico de notificações no app

Requisitos Não Funcionais

  • Escalabilidade: picos repentinos (1 milhão de notificações de uma vez)
  • Baixa latência: notificação em menos de 5 segundos
  • Confiabilidade: nenhuma notificação pode ser perdida
  • Disponibilidade: serviço de envio não pode cair mesmo que o banco de histórico esteja instável


🚩 O Desafio: The Fan-out Problem

Um único evento (1 vídeo publicado) se transforma em 500.000 ações de envio simultâneas. Tentar processar isso em um único loop vai causar timeout ou estourar a memória do servidor.


🏗️ A Solução: Arquitetura em Camadas

[YouTube WebSub]
      │
      ▼
┌─────────────────────────┐
│  1. Webhook Handler     │  ← Responde 200 OK em < 100ms
│     (Ingestão)          │
└────────────┬────────────┘
             │ coloca mensagem na fila
             ▼
┌─────────────────────────┐
│  2. Fan-out Service     │  ← Busca seguidores do canal
│     (Descoberta)        │    e divide em chunks de 500
└────────────┬────────────┘
             │ chunks para a fila
             ▼
┌─────────────────────────┐
│  3. Message Queue       │  ← RabbitMQ / Kafka / SQS
│     (Mensageria)        │    Garante que nada se perde
└────────────┬────────────┘
             │ distribui para workers
             ▼
┌─────────────────────────┐
│  4. Notification Workers│  ← Processamento paralelo
│     (Execução)          │    Checa Redis → chama API
└─────────────────────────┘
             │ falha?
             ▼
        [Dead Letter Queue]  ← Tenta novamente depois

Resumo de Componentes

CamadaTecnologiaResponsabilidade
IngestãoAPI RESTReceber webhook e enfileirar
DescobertaDynamoDB / MongoDBBuscar seguidores por canal
MensageriaKafka / SQS / RabbitMQGarantir entrega confiável
CacheRedisPreferências do usuário em memória
ExecuçãoWorkers paralelosEnviar via Firebase / SendGrid
ResiliênciaDead Letter Queue (DLQ)Reprocessar falhas sem perder dados

🏦 Caso Real AWS — Temenos: Banking Software at Scale

A Temenos é uma das maiores fornecedoras de software bancário do mundo. Este caso mostra como eles aplicaram os fundamentos de System Design na prática, usando AWS para construir o sistema T24 Transact — um core banking de alto desempenho e altíssima disponibilidade.


🏗️ A Arquitetura

O sistema foi construído com serviços gerenciados e serverless da AWS, o que elimina grande parte da necessidade de gerenciar servidores manualmente.

         [Cliente / Aplicação Bancária]
                      │
                      ▼
            ┌─────────────────┐
            │  API Gateway    │  ← Ponto único de entrada
            └────────┬────────┘
                     │
          ┌──────────┴──────────┐
          ▼                     ▼
   ┌─────────────┐      ┌──────────────┐
   │  AWS Lambda │      │ AWS Fargate  │  ← Containers sem servidor
   │  (Funções)  │      │ (Workloads)  │
   └──────┬──────┘      └──────┬───────┘
          │                    │
          ▼                    ▼
   ┌──────────────────────────────────┐
   │         ELB (Load Balancer)      │
   └──────────────────────────────────┘
          │                    │
          ▼                    ▼
   ┌────────────┐       ┌────────────┐
   │  DynamoDB  │       │    RDS     │  ← Dois bancos para fins distintos
   └────────────┘       └────────────┘
          │
          ▼
   ┌────────────┐
   │  Kinesis   │  ← Streaming de eventos em tempo real
   └────────────┘

🗄️ Estratégia de Banco de Dados — O Trade-off na Prática

Aqui está um dos trade-offs mais interessantes do caso: eles usam dois bancos de dados com propósitos diferentes.

BancoTipoPara que serve
DynamoDBNoSQL (chave-valor)Transações de alta velocidade, acesso por chave, escala automática
RDSSQL RelacionalRelatórios, consultas complexas, dados relacionais

📡 Kinesis — Processamento de Eventos em Tempo Real

O Amazon Kinesis é o serviço de streaming de dados da AWS, similar ao Kafka. No sistema Temenos ele é usado para:

  • Capturar eventos de transações em tempo real
  • Alimentar pipelines de auditoria e compliance
  • Permitir processamento assíncrono sem bloquear a transação principal

🚀 Escalabilidade Serverless na Prática

O grande diferencial do design da Temenos é usar Lambda + Fargate para garantir escala automática e elástica:

ComponenteComportamento
AWS LambdaExecuta funções sob demanda — escala de 0 a milhares de execuções paralelas automaticamente
AWS FargateContainers que sobem e descem conforme a demanda — sem gerenciar servidores
API GatewayAbsorve picos de tráfego e roteia para os serviços certos
ELBDistribui carga entre as instâncias ativas

🔁 Conectando com o Teorema CAP

O sistema bancário da Temenos é um exemplo clássico de escolha CP (Consistency + Partition Tolerance):

  • Uma transação financeira nunca pode mostrar dados inconsistentes — o saldo tem que estar correto
  • O sistema prefere rejeitar uma operação a processar com dados potencialmente inconsistentes
  • DynamoDB, quando configurado com leituras fortemente consistentes, garante isso

💬 O que aprender com este caso

  • Serviços gerenciados e serverless reduzem drasticamente a complexidade operacional
  • A escolha do banco de dados deve ser guiada pelo padrão de acesso, não pela familiaridade da equipe
  • Streaming de eventos (Kinesis/Kafka) é fundamental em sistemas financeiros para auditoria e rastreabilidade
  • O domínio do negócio (banco) ditou a escolha CP no teorema CAP — sempre deixe os requisitos guiarem a arquitetura

🔗 Referências para Aprofundar

Sobre este Curso Gratuito de Aprenda System Design do ZERO

Este curso de Aprenda System Design do ZERO é oferecido gratuitamente pela Kipper Dev, fundada por Fernanda Kipper. O objetivo é democratizar o acesso ao conhecimento de programação e desenvolvimento, permitindo que qualquer pessoa aprenda sem custos.

Após assistir ao curso completo no YouTube, você pode validar seu conhecimento através de uma prova rigorosa. Ao ser aprovado com nota mínima de 60%, você receberá um certificado válido que pode ser usado como horas complementares em universidades brasileiras.

O certificado é emitido pela KipperDev Marketing e Treinamentos e possui uma chave de validação única que permite verificar sua autenticidade a qualquer momento.