Pular para conteúdo

Arquitetura de Sistemas — 2027.1

A maioria dos sistemas que você vai construir ou manter na carreira precisa ser rápida, disponível, consistente o suficiente, segura e barata — ao mesmo tempo, sob carga, enquanto partes dela falham. Esta edição da disciplina trata de como projetar esses sistemas, como provar com números que um design funciona e como explicá-lo — para um time numa revisão de design e para um entrevistador numa entrevista de system design.

O que muda em 2027.1

A disciplina é reorganizada em torno dos blocos de construção das arquiteturas modernas — a mesma paleta de componentes que você encontra no System Design Playground: cliente, tráfego e borda, computação, armazenamento, mensageria, observabilidade, rede, IA e agentes e serviços externos.

  • Cada aula ensina um grupo de componentes, com os trade-offs, os números e os modos de falha que importam na prática e nas entrevistas.
  • Cada página de aula embute o playground, já carregado com um cenário, para você ver o conceito sob carga: mude um parâmetro, rode um teste de carga com aleatoriedade (quedas, picos, chaves quentes, queda de região) e leia o relatório.
  • Os labs práticos constroem um único sistema ao longo do semestre — o BoxOffice, uma plataforma de ingressos com uma venda relâmpago às 10:00 — e todo lab termina com uma etapa "Meça".
  • A seção Apoio traz o material de entrevista, um caderno de exercícios, uma folha de consulta, um mapa de conceitos e cartas de estudo.

O exemplo condutor: BoxOffice

Um show no estádio abre as vendas às 10:00. Dois milhões de fãs, sessenta mil lugares. O catálogo é dominado por leituras, o estoque de lugares nunca pode vender o mesmo lugar duas vezes, os pagamentos passam por um provedor externo que às vezes fica lento, as confirmações saem por e-mail, bots tentam comprar tudo e um assistente de IA responde "encontre dois lugares abaixo de R$ 300 para sábado e reserve". Quase todo tema da disciplina aparece neste único sistema.

flowchart LR
    U["fãs<br/>(web, mobile)"] --> DNS["DNS"] --> CDN["CDN"] --> WAF["WAF"] --> GW["API gateway"]
    GW --> AUTH["auth"]
    GW --> CAT["catalog"] --> CACHE[("cache")]
    CACHE --> SQL[("SQL")]
    GW --> Q["sala de espera<br/>(fila)"] --> INV["inventory<br/>(reservas de lugar)"] --> SQL
    INV --> ORD["order"] --> PAY["payment"] --> EXT["provedor de pagamento"]
    ORD --> K["stream de eventos"] --> NOTIF["notification"] --> MAIL["e-mail"]
    K --> AN["analytics / DWH"]
    GW --> AI["assistente<br/>(gateway de LLM, ferramentas, RAG)"]

A história da disciplina

As aulas não são uma lista de temas: são os capítulos de uma única história. O BoxOffice começa como um serviço e um banco de dados, e cada capítulo começa com o problema que o anterior deixou, expresso com um número. Um componente só entra no design quando um número o exige, e cada um traz um novo problema. Aperte play para seguir a cadeia:

flowchart TD
    C1["1. O que o BoxOffice precisa fazer, e quão bem?"] -->|"2 M de fãs, 60 mil lugares, p99 < 300 ms:<br/>um banco de dados basta?"| C2["2. Estime antes de construir"]
    C2 -->|"33.000 holds/s contra ~1.100:<br/>precisamos de mais de uma máquina"| C3["3. Mais máquinas, uma rede que mente"]
    C3 -->|"as réplicas existem: quem recebe<br/>as 2 M de requisições às 10:00?"| C4["4. Tráfego, borda e identidade"]
    C4 -->|"a borda espalha a carga entre réplicas:<br/>o que uma réplica precisa ser?"| C5["5. Computação e serviços"]
    C5 -->|"serviços stateless empurram todo<br/>o estado para o banco"| C6["6. Bancos de dados"]
    C6 -->|"as páginas de evento são lidas 100× mais<br/>do que mudam"| C7["7. Cache"]
    C7 -->|"o checkout ainda espera<br/>pelo provedor de e-mail"| C8["8. Mensageria"]
    C8 -->|"a assincronia esconde falhas:<br/>para onde foi aquele pedido?"| C9["9. Observabilidade"]
    C9 -->|"agora enxergamos: o provedor responde<br/>em 4 s e arrasta o checkout junto"| C10["10. Confiabilidade"]
    C10 -->|"um notebook com Compose não se cura,<br/>não escala nem faz deploy com segurança"| C11["11. Plataformas cloud-native"]
    C11 -->|"muitos serviços numa plataforma:<br/>quem pode falar com quem? o que entregamos?"| C12["12. Redes e segurança"]
    C12 -->|"os fãs perguntam em linguagem natural:<br/>'dois lugares abaixo de R$ 300, sábado'"| C13["13. Sistemas de IA"]
    C13 -->|"mais mudanças, mais rápido:<br/>quem revisa, testa, faz o release?"| C14["14. Entrega assistida por IA"]
    C14 -->|"o design inteiro aguenta<br/>a próxima abertura de vendas? prove"| C15["15. Engenharia de desempenho"]
    C15 -->|"os mesmos blocos, outros sistemas"| C16["16. Estudos de caso"]

Cada linha da tabela é um capítulo: o problema que o abre, a aula que o responde, o lab em que você constrói a resposta no BoxOffice (e o arquivo para ler primeiro) e o cenário do playground em que você o vê falhar e se recuperar. O planejamento põe os capítulos no calendário.

O problema (BoxOffice) Aula Construído em Código para ler Veja
1 Ninguém escreveu o que "funcionar" significa: quantos fãs, quão rápido, quão disponível. O que é Design de Sistemas Lab 0 scripts/check-env.sh monolith, flash-sale
2 Um único PostgreSQL aguenta a abertura de vendas das 10:00? A demanda é de ~33.000 holds/s; um banco faz ~1.100 numa utilização sensata. Estimativas Lab 1, Lab 2 load/stress.js, scripts/sweep.sh monolith (ponto de ruptura)
3 Uma diferença de 30× significa muitas máquinas, e entre máquinas a rede perde, atrasa e duplica mensagens: um "comprar" repetido pode cobrar duas vezes. Sistemas Distribuídos Lab 2 (o joelho, medido) — db-replicas, multi-region
4 Dois milhões de celulares apertam atualizar às 10:00:00. A maior parte dessas requisições nunca deve chegar a um serviço, o resto deve chegar a uma réplica saudável, e todo chamador precisa provar quem é. Tráfego e Borda Lab 3, Lab 4 infra/nginx/nginx.conf, TokenService.java scale-out, cdn-static, rate-limiter
5 Atrás da borda, réplicas vêm e vão: uma réplica que guarda a sessão ou a reserva em memória a perde. O que um serviço precisa ser para escalar horizontalmente? Computação e Serviços Lab 4 SecurityConfig.java (gateway) microservices, serverless-burst
6 Serviços stateless empurram toda decisão para o banco, e 2 fãs clicam no mesmo lugar no mesmo milissegundo. Bancos de Dados Lab 6 HoldService.java db-replicas, sharding, db-failover
7 As páginas de evento são lidas ~100× mais do que mudam; o banco gasta sua capacidade respondendo à mesma pergunta. Cache Lab 5 EventCache.java read-heavy-cache
8 O checkout espera pelo e-mail e pelo provedor; quando o servidor de e-mail cai, ninguém consegue comprar. 30× mais fãs do que a capacidade precisam de uma fila justa. Mensageria Lab 7 Outbox.java, WaitingRoom.java async-queue, event-fanout
9 A assincronia esconde falhas: um pedido some entre o Kafka e o e-mail, e os dashboards ficam verdes enquanto os fãs não conseguem pagar. O que exatamente prometemos (o SLO), e como sabemos que cumprimos? Observabilidade Lab 8 slo-catalog.yaml observability-stack
10 Agora conseguimos ver: às 10:02 o provedor de pagamento responde em 4 s em vez de 200 ms. Nada está fora do ar, mas toda thread do order fica esperando por ele e o checkout morre junto. Confiabilidade Lab 9 PaymentClient.java cascading-failure, retry-storm, db-failover
11 O Compose numa única máquina não reinicia uma réplica morta em outro nó, não escala às 09:45 nem faz rollback de um release ruim. Cloud-Native Lab 10, Lab 11 catalog-hpa.yaml, catalog-rollout.yaml k8s-node-failure, serverless-burst
12 Muitos serviços agora dividem uma plataforma: bots compram os melhores lugares, um token vaza, todo serviço confia em todos os outros e ninguém verifica o que o pipeline entrega. Redes e Segurança Lab 11 (cadeia de suprimentos) .github/dependabot.yml payment-system, flash-sale
13 Os fãs perguntam "dois lugares abaixo de R$ 300 no sábado?": a resposta vem de uma dependência lenta, cara e não determinística, que lê o catálogo e o mapa de lugares por ferramentas e nunca pode inventar um lugar nem obedecer a um texto escondido numa página. Sistemas de IA Lab 12 agent.py, tools.py ai-assistant
14 Com a IA escrevendo código, as mudanças chegam mais rápido do que as pessoas conseguem revisá-las, testá-las e fazer o release. Entrega Assistida por IA Lab 13 review.py ai-assistant
15 Cada capítulo acrescentou uma caixa. O design inteiro aguenta a próxima abertura de vendas, e quanto custa? Engenharia de Desempenho Lab 11, Projeto load/budget.js flash-sale
16 Um sistema diferente amanhã (um feed, um chat, um app de corridas): os mesmos blocos, outros números. Estudos de Caso Exercícios — um por caso

Como ler uma aula com a história em mente

Toda aula abre com "A história até aqui" (onde o BoxOffice está e qual número força esta aula) e termina com "O que quebra a seguir" (o limite do que você acabou de aprender, que abre o próximo capítulo). Toda subpágina tem um mapa "Como se conecta", um quadro "Boas práticas" (os hábitos que um revisor espera, ao lado das armadilhas a evitar) e, quando um lab implementa a ideia, um quadro "No código do BoxOffice" com o arquivo real; todo lab lista as boas práticas que seu código aplica. Quando você souber dizer, para cada componente, qual número o colocou ali e quanto ele custa, você consegue defender o design — numa revisão ou numa entrevista.

Mapa da disciplina

Parte Aulas Labs (BoxOffice)
Fundamentos 1. O que é Design de Sistemas · 2. Estimativas e Matemática de Desempenho · 3. Sistemas Distribuídos 0. Ambiente · 1. Primeiro serviço · 2. Meça primeiro
Blocos de construção 4. Tráfego e Borda · 5. Computação e Serviços · 6. Bancos de Dados · 7. Cache · 8. Mensageria 3. Borda · 4. Gateway e identidade · 5. Cache · 6. Dados em escala · 7. Assíncrono
Operando em escala 9. Observabilidade · 10. Confiabilidade · 11. Cloud-Native · 12. Redes e Segurança 8. Observabilidade · 9. Resiliência e caos · 10. Kubernetes · 11. Entrega
IA 13. Sistemas de IA e Agentes · 14. Entrega Assistida por IA 12. Assistente de IA · 13. IA no CI/CD
Prove 15. Engenharia de Desempenho · 16. Estudos de Caso Exercícios · Projeto

O plano semana a semana está na página de planejamento.

Encontros

Aula A definir A definir
Aula A definir A definir
Atendimento A definir A definir

Professores

  • Professor


    Humberto Sandmann

    GitHub

  • Monitor


    A definir

Nota

\[ \text{Final Grade} = \left\{\begin{array}{lll} \text{Individual} \geq 5 \bigwedge \text{Team} \geq 5 & \implies & \displaystyle \frac{ \text{Individual} + \text{Team} } {2} \\ \\ \text{Otherwise} & \implies & \min\left(\text{Individual}, \text{Team}\right) \end{array}\right. \]
2026-11-01T21:55:12.540577 image/svg+xml Matplotlib v3.11.2, https://matplotlib.org/ Exercises Quizzes Midterm exam Final exam 50% 10% 15% 25% Individual M1 Design 10% M2 Core 10% M3 Cache 10% M4 Async 10% M5 K8s+CI/CD 10% M6 Load test 15% M7 Game day 10% M8 Cost 10% M9 Present. 10% Docs 5% Team (project)
  1. Exercícios (individuais): sete exercícios — estimativas, relatório de teste de carga, cache e banco de dados, orientado a eventos, autoscaling no Kubernetes, design no playground e documento de design — cada um avaliado com um conceito (A–I) e uma rubrica. Pesos e regras estão na página de exercícios.

  2. Quizzes: três quizzes; o menor é descartado e a nota é a média dos dois melhores:

    \[ \text{Quizzes} = \frac{\text{Q}_1 + \text{Q}_2 + \text{Q}_3 - \min(\text{Q}_1, \text{Q}_2, \text{Q}_3)}{2} \]
  3. Provas: uma prova intermediária e uma prova final, individuais, cobrindo as aulas e os labs. Parte de cada prova é uma questão curta de system design no formato do método da entrevista.

  4. Projeto em equipe: equipes de 2 ou 3 estudantes constroem, medem, quebram de propósito e defendem um sistema, em nove marcos (documento de design, caminho principal, escala e cache, assíncrono e resiliência, Kubernetes + CI/CD, campanha de testes de carga, game day de caos, relatório de custos, apresentação). A nota da equipe é a mesma para todos os membros. Detalhes na página do projeto.

    Inscrição das equipes

    Prazo: fim da semana 3 (data na página de planejamento).

    Equipes de 2 a 3 membros, um repositório GitHub por equipe, documentação no GitHub Pages.

PROVA ORAL

TODAS AS NOTAS desta disciplina estão sujeitas a uma prova oral para validação. Se o resultado da prova oral for negativo, aquela nota específica será ZERADA.

Uso de ferramentas de IA

Ferramentas de IA são permitidas e fazem parte da disciplina (as aulas 13 e 14 e o lab 13 tratam de construir com elas). Você é responsável por cada linha e cada número que entrega; as medições precisam vir de execuções que você fez. As regras estão na página de exercícios.

Repositórios

Repositório da disciplina (código dos labs e projetos iniciais): repo-classes/pma271 (a ser publicado).