MÓDULO 08 · 2 SEMANAS · DISPONIBILIDADE & RESILIÊNCIA

Disponibilidade & Resiliência — do 99% ao cinco noves

SLO, error budgets, bulkhead, graceful degradation, feature flags, chaos engineering, incident response, postmortem culture, disaster recovery. A diferença entre sistema que sobrevive a falhas e sistema que aprende com elas.

Duração ~2 semanas
Conceitos 14 fundamentais
Projeto Resilience Lab
Pré-requisito Módulos 04, 05, 06, 07
Disponibilidade Confiabilidade Operação

Catorze conceitos para entender disponibilidade como propriedade que se mede, se projeta e se pratica — não como esperança. Da fundamentação em SLI/SLO/SLA (o que disponibilidade significa com precisão) ao error budget (o que fazer quando você está perdendo), dos padrões de resiliência (bulkhead, graceful degradation, feature flags) ao chaos engineering (testar a falha antes que ela te encontre), da resposta a incidentes ao aprendizado organizacional via postmortem. O fio condutor é uma pergunta: como construir sistema que falha graciosamente, aprende com cada falha, e fica mais confiável com o tempo?

01

SLI, SLO e SLA — definindo disponibilidade com precisão

Service Level Indicator como métrica, Service Level Objective como alvo, Service Level Agreement como contrato. Como escolher SLIs user-centric, calibrar SLOs e manter buffer para SLA.

estudar →
02

Error budgets — velocidade e confiabilidade no mesmo número

Budget derivado do SLO, política de freeze, burn rate alerts (rápido e lento). Como o error budget transforma a conversa entre produto e engenharia de conflito em parceria.

estudar →
03

Bulkhead e isolation patterns

Thread pools e semáforos dedicados por dependência downstream. Isolamento por tenant. Rate limiting como proteção de recurso compartilhado. A diferença entre falha contida e falha em cascata.

estudar →
04

Graceful degradation em profundidade

Hierarquia de features por criticalidade, dependências obrigatórias vs opcionais, fallbacks estáticos e cacheados, modo degradado como contrato explícito com o usuário.

estudar →
05

Feature flags & progressive delivery

Canary releases, blue-green, traffic splitting, kill switches operacionais. LaunchDarkly, OpenFeature. Feature flags para controle de risco em deploy, não só A/B de produto.

estudar →
06

Chaos engineering — fundamentos

A origem no Netflix (Chaos Monkey, 2011), os Princípios do Chaos Engineering (principlesofchaos.org), a steady state hypothesis. Por que "quebrar de propósito" é disciplina de engenharia, não vandalismo.

estudar →
07

Chaos tooling — do Chaos Monkey ao Chaos Toolkit

Chaos Monkey (Netflix OSS), Chaos Toolkit (Python, YAML experiments), Litmus (CNCF, Kubernetes), Gremlin, AWS FIS. Como estruturar um experimento reproduzível com hipótese, método e rollback.

estudar →
08

Fault injection — tipos, blast radius e abort conditions

Latência injetada, erros forçados, esgotamento de recurso, partição de rede, skew de clock. Injeção a nível de código vs rede vs infra. Abort conditions como safety net do experimento.

estudar →
09

Game days & resilience drills

Simulação de incidentes como prática recorrente. Estrutura do drill (prepare/execute/debrief). Tabletop vs live drill. DiRT (Google Disaster Recovery Testing). Como evitar que game days virem teatro.

estudar →
10

Production readiness review

O modelo PRR do Google SRE, launch criteria, quem pode barrar um deploy. Categorias: capacidade, dependências, monitoramento, rollback, documentação. Como fazer sem virar burocracia.

estudar →
11

Incident response — fases, papéis e comunicação

Detecção → triage → mitigação → resolução → pós-incidente. Incident commander, communications lead, scribe. War room, status pages, cadência de atualização. ITIL vs SRE approach.

estudar →
12

Blameless postmortem — aprendizado sem punição

Sidney Dekker e a Just Culture, Allspaw no Etsy (2012), Google SRE capítulo 15. Five Whys vs contributing factors. Estrutura de postmortem eficaz. Action items que não apodrecem no backlog.

estudar →
13

Disaster recovery formal — RTO, RPO e testes periódicos

RTO vs RPO como SLOs de recuperação. Tiers de DR: hot standby, warm standby, cold standby, pilot light. Runbook de DR. Por que DR sem teste periódico é ilusão operacional.

estudar →
14

Toil e confiabilidade como disciplina

Ben Treynor e a definição de toil. O modelo SRE: cap de 50%, eliminar trabalho manual repetível. Reliability roadmap: de reativo a proativo. Confiabilidade como atributo arquitetural, não papel de ops.

estudar →
princípio orientador

Disponibilidade não é ausência de falha — é capacidade de absorver falha sem que o usuário perceba (ou perceba minimamente). Todo sistema complexo falha; a questão é com que frequência, por quanto tempo, e o que acontece durante a falha. Sêniors que entendem esse módulo operam com dois instrumentos simultâneos: o SLO (o que prometemos ao usuário, com número) e o error budget (quanto espaço ainda temos para arriscar). Com esses dois instrumentos, a conversa sobre confiabilidade deixa de ser subjetiva e vira engenharia.

Disponibilidade está cheia de falsas dicotomias ("velocidade vs confiabilidade", "chaos em prod vs staging só") e de práticas que parecem boas mas degeneram em teatro (postmortem sem action items, game days que ninguém repete). Cada decisão abaixo força a articular o trade-off real.

SLO conservador ou agressivo?

SLOs conservadores (99% quando você sustenta 99.9%) geram error budget farto mas sinalizam baixa ambição ao time. SLOs agressivos (99.99% quando você mal atinge 99.9%) criam ansiedade permanente, freeze de mudanças, e postmortems de todo micro-incidente. O alvo correto é ligeiramente mais difícil que o histórico — o suficiente para sentir pressão, não o suficiente para paralisar. Regra prática: comece com o percentil 95 da disponibilidade histórica como SLO inicial. Revise a cada trimestre. O SLA para o cliente deve ter buffer de pelo menos 0.1% abaixo do SLO interno.

Chaos engineering em produção ou só em staging?

Staging nunca replica produção com fidelidade suficiente para ser o único ambiente de chaos. Tráfego real, dependências reais, dados reais — só prod tem isso. O caminho maduro é começar por staging para calibrar experimentos (acertar blast radius, validar abort conditions), depois graduar para prod com escopo mínimo: um servidor de um pool, uma porcentagem de tráfego, horários de baixo risco. Netflix, Amazon e Google rodam chaos em produção continuamente. O critério de maturidade para migrar para prod é: "sabemos observar o steady state e temos rollback automático confiável".

Feature flags: centralizado (LaunchDarkly) ou por serviço?

Centralizado (LaunchDarkly, Flagsmith, Unleash) ganha em visibilidade — um lugar para ver todos os flags ativos, quem os ligou, quando. Perde em latência de lookup (SDK faz chamada externa ou mantém cache local) e em dependência de terceiro. Por serviço (flags em banco de dados ou config do próprio serviço) é simples de operar mas vira bagunça em escala: 20 serviços com flags em 20 lugares diferentes. A decisão muda conforme tamanho: <5 serviços, flags locais são aceitáveis; >5 serviços, um sistema centralizado amortiza o custo de coordenação.

Postmortem: quando fazer e quão formal?

Regra simples: todo incidente que violou SLO ou que, se repetido, violaria — merece postmortem. Nível de formalidade proporcional ao impacto: incidente menor com resolução óbvia → postmortem de 1 página (timeline + 2 action items); incidente P0 com impacto a cliente → postmortem completo com seção de contributing factors, owner por action item, e data de entrega. O erro mais comum é fazer postmortem de tudo de forma igualmente pesada — o time esgota, a qualidade cai, e o processo vira formulário. Calibrar o esforço ao risco é parte da cultura.

RTO vs RPO: qual priorizar quando não dá para ter os dois?

Depende da natureza do sistema. Sistemas financeiros (banco, e-commerce, billing) têm RPO baixo como requisito inegociável — perder dados de transação é catastrófico; aceita-se downtime maior (RTO mais alto) em troca de zero perda de dados. Sistemas de mídia, conteúdo ou logging têm tolerância maior a RPO (perder alguns eventos é aceitável) mas RTO precisa ser baixo — usuário sem acesso é pior que dado levemente desatualizado. A regra: RPO é ditado pela tolerância do negócio à perda de dados; RTO é ditado pela tolerância à indisponibilidade. Ambos devem ser SLOs formais, não intuições.

O projeto força a construir resiliência em três camadas simultâneas: o serviço que se defende (bulkheads, degradação, feature flags), os experimentos que o exercem (chaos controlado com fault injection), e o feedback loop que aprende com falhas simuladas (error budget tracking + postmortem automático).

PROJETO PRÁTICO

Resilience Lab

API de pedidos com dependências externas (serviço de estoque, serviço de pagamento, serviço de notificação) que implementa bulkheads por dependência, degradação progressiva por criticidade de feature, e feature flags operacionais. Sobre essa API, uma bateria de experimentos de chaos (latência injetada, erro forçado, esgotamento de recurso) valida que o sistema sobrevive graciosamente. Um dashboard de error budget mostra consumo em tempo real. Quando um experimento cruza o threshold, gera rascunho de postmortem preenchido.

REQUISITOS
  • API REST de pedidos com 3 dependências downstream (estoque, pagamento, notificação)
  • Bulkhead por dependência: pool de conexão isolado; falha em notificação não afeta pagamento
  • Feature flags operacionais: notificação e recomendações podem ser desligadas via flag
  • Graceful degradation: pedido sem recomendações ainda funciona; pedido sem estoque falha explicitamente
  • SLO definido: 99.9% de disponibilidade, P99 < 500ms, medidos por janela de 7 dias
  • Error budget dashboard: consumo em tempo real (quantos nines restam?)
  • Experimento 1: latência injetada no serviço de estoque (500ms extra) — sistema deve completar pedido dentro do SLO
  • Experimento 2: erro forçado em 50% das chamadas ao serviço de notificação — pedido deve completar, notificação degrada
  • Experimento 3: esgotamento do pool de conexão do banco — sistema deve rejeitar com 503, não travar
  • Abort condition: qualquer experimento que faça taxa de erro > 5% é automaticamente abortado
  • Quando experimento viola SLO: gerar rascunho de postmortem com timeline e contributing factors preenchidos
  • Suíte de chaos deve ser idempotente e repetível (CI-friendly)
Disponibilidade Confiabilidade Operação
STACK SUGERIDA POR LINGUAGEM
STACK
.NET 10 + ASP.NET Core + Polly v8 (bulkhead/retry/breaker) + LaunchDarkly SDK (ou Flagsmith self-hosted) + OpenTelemetry + Chaos Toolkit (experimentos YAML chamando endpoints) + Prometheus + Grafana
ESTRUTURA / NOTAS
  • Orders.Api/ com endpoints de pedido e health checks por dependência
  • Orders.Resilience/ com políticas Polly: BulkheadPolicy por serviço downstream
  • Orders.FeatureFlags/ com wrapper LaunchDarkly/Flagsmith
  • Orders.Chaos/ com experimentos Chaos Toolkit em YAML + runner em C#
  • Orders.Metrics/ com SLO tracker: sliding window 7 dias, burn rate por hora
  • Polly v8: usar ResiliencePipeline com BulkheadStrategyOptions (maxConcurrentCalls por serviço)
  • WireMock.Net para simular dependências com fault injection controlada
STACK
Python 3.13 + FastAPI + tenacity (retry) + anyio (semaphore/bulkhead) + Flagsmith Python SDK + OpenTelemetry + Chaos Toolkit (chaostoolkit.org) + httpx (clients async) + Prometheus client
ESTRUTURA / NOTAS
  • orders/api/ com routers FastAPI e lifespan para inicializar pools
  • orders/resilience/ com decorators de bulkhead usando asyncio.Semaphore por dependência
  • orders/flags/ com wrapper Flagsmith SDK e cache local
  • chaos/ com experimentos .json do Chaos Toolkit (latência, abort, esgotamento)
  • orders/slo/ com SLO tracker: RollingWindowCounter com deque de eventos
  • Simular dependências com respx (mock httpx) ou servidores FastAPI mínimos
  • pytest-chaostoolkit para rodar experimentos como testes automatizados
STACK
Go 1.23 + chi + golang.org/x/sync (semaphore) + Unleash Go SDK (ou Flagsmith) + OpenTelemetry Go + Chaos Toolkit (chamado via subprocess) ou experimentos Go nativos + Prometheus client_golang
ESTRUTURA / NOTAS
  • cmd/api/ com handler de pedidos e /health endpoint por dependência
  • internal/resilience/ com Bulkhead struct usando semaphore.Weighted por serviço
  • internal/flags/ com wrapper SDK de feature flags e TTL cache
  • internal/chaos/ com experimentos: injetor de latência, injetor de erro, saturador de goroutines
  • internal/slo/ com SLOTracker usando ring buffer para janela deslizante
  • httptest.Server para simular dependências com fault injection
  • Makefile com targets: make chaos-run, make slo-report, make postmortem-draft
entregável

Repositório com README documentando: o diagrama de dependências da API com os bulkheads marcados, os 3 experimentos de chaos com hipótese e resultado observado, o gráfico de error budget antes e depois de cada experimento, o rascunho de postmortem gerado pelo experimento que violou SLO (com timeline e contributing factors preenchidos), e o ADR justificando a política de feature flags escolhida. Bonus: um quarto experimento inventado pelo aluno que testa um cenário que o time real teme — e o resultado.

Disponibilidade e resiliência são tópicos canônicos em entrevistas de sênior para vagas com on-call, para posições de staff, e para empresas que operam com SLAs formais. As perguntas abaixo cobrem a faixa que diferencia quem repete a teoria de quem já operou um sistema em produção.

Q.01

Explique a diferença entre SLI, SLO e SLA com um exemplo concreto. Se o SLO é 99.9% e o cliente pergunta "qual é a disponibilidade garantida?", o que você responde e por quê?

Q.02

O que é error budget e como ele muda a dinâmica entre time de produto e time de engenharia? Descreva o que acontece quando o budget está esgotado a 15 dias do fim do mês.

Q.03

Explique a steady state hypothesis no contexto de chaos engineering. Dê um exemplo de experimento de chaos que você desenharia para um serviço de checkout — hipótese, método, abort condition.

Q.04

Um incidente P0 começou às 14h32. Você é o incident commander. Descreva as primeiras ações nos primeiros 10 minutos — quem você chama, o que você comunica, o que você NÃO faz.

Q.05

Sistema tem 99.9% de uptime histórico. Você precisa chegar a 99.99% sem reescrever. Quais são as primeiras três coisas que você avaliaria — e como você escolheria por onde começar?