Nota de escopo · TG · ITA · Engineering Resilient Distributed Systems

A esteira e a espiral

Cinco etapas — modelo de falha, modelo de carga, cenário, observação, mitigação — percorridas em espiral sobre um serviço de exemplo, até reproduzir em bancada uma falha metaestável: o caso em que o sistema não volta sozinho depois que o gatilho já foi embora.

A esteira

O que o rascunho da professora descreve

O rascunho lista cinco coisas: modelos de falha e injeção de falha, modelos de carga, chaos engineering, teste e observabilidade, e mecanismos de mitigação. Lidas soltas, parecem cinco assuntos. Lidas na ordem, são uma esteira: cada etapa produz a entrada da seguinte, e o conjunto é um método de ponta a ponta para medir como um serviço responde a estresse.

Uma falha e uma carga se combinam num cenário. O cenário roda contra um sistema instrumentado. A instrumentação produz números. Os números dizem se o serviço aguentou. Quando não aguentou, entra um mecanismo de mitigação — e é aí que a esteira deixa de ser linha reta, porque o mecanismo novo muda o sistema e obriga a refazer os cenários. É a espiral que ela aponta no final do rascunho.

A última linha do rascunho — "e vamos ver se conseguimos demonstrar uma falha metaestável" — é o que dá destino à esteira. Sem um alvo, montar bancada e injetar falha rende um catálogo de gráficos de latência. Com o alvo, cada etapa existe por um motivo: a falha metaestável é justamente o fenômeno que só aparece se as cinco etapas estiverem certas ao mesmo tempo. Carga fechada em vez de aberta, e ela não aparece. Sem medir depois do gatilho, e ela não aparece. Sem retry no cliente, e ela não aparece.

Sob quais condições de carga e de configuração a própria estratégia de resiliência passa a ser a causa da indisponibilidade — e quais mitigações de fato quebram o laço de realimentação?

Essa é a pergunta que a esteira serve para responder. O que segue é cada etapa dela, com a ferramenta correspondente e a decisão que precisa ser tomada.

A esteira de cinco etapas e a espiral de realimentação Modelo de falha e modelo de carga se combinam num cenário. O cenário roda na bancada instrumentada, que responde se o goodput volta sozinho depois do gatilho. Se não volta, é a falha metaestável e entra uma mitigação — que devolve o trabalho para a etapa de cenário, fechando a espiral. Se volta, o cenário volta para os modelos de falha e de carga para ser endurecido. Modelo de falha crash · perda · delay Modelo de carga aberta · pico · retry combinações Cenário carga base × gatilho × configuração n repetições Bancada instrumentada goodput · p99 · fila · retries métricas o goodput volta sozinho? não — é a falha metaestável Mitigação backoff · budget · breaker · shed mecanismo novo → novos cenários sim
→ arraste o diagrama para o ladoA esteira não termina: cada mitigação adicionada muda o sistema e devolve o trabalho para a etapa de cenário — a espiral, em verde. O ramo pontilhado da direita é o caso em que o experimento não produziu o fenômeno: o goodput voltou sozinho, então o cenário estava fraco demais e é a carga ou a falha que precisa endurecer.
01 Falha

Escolher a taxonomia antes de escolher a ferramenta

A professora sugere reusar uma taxonomia existente, e essa é a decisão certa: inventar classificação de falha é trabalho perdido e indefensável na banca. A referência canônica é Avizienis et al., que separa falta (a causa injetada), erro (o estado interno corrompido) e falha (o que o usuário vê). A distinção importa muito aqui, porque o TG mede a terceira em função da primeira.

O corte prático é o que ela já indicou: processo (crash, crash com restart, e pausa longa) e comunicação (perda de mensagem, delay, partição). Vale acrescentar a pausa longa — docker pause — porque é a mais cruel das três de processo: o processo não morre, então nada detecta, e todos os clientes ficam pendurados até o timeout. É o gatilho clássico de metaestabilidade.

Falha bizantina fica fora, e é bom dizer isso explicitamente no texto: é outro modelo de ameaça, exige consenso tolerante a bizantinos para fazer sentido, e dobraria o trabalho sem tocar na pergunta.

02 Carga

Sistema aberto ou o fenômeno não aparece

Esta é a etapa em que dá mais fácil de errar, e o erro é silencioso. Gerador de carga tem dois modos. No modo fechado — no k6, os executores constant-vus e ramping-vus — existem N usuários virtuais e cada um só manda o próximo pedido depois de receber a resposta do anterior. No modo aberto — constant-arrival-rate e ramping-arrival-rate — a taxa de chegada é fixa e independe de quanto o serviço demora.

Se o teste usa modo fechado, o próprio gerador se autolimita quando o serviço fica lento, o laço de realimentação nunca fecha, e a falha metaestável é matematicamente impossível de reproduzir. O trabalho pode rodar seis meses de experimento e concluir que o fenômeno não existe, por causa de uma linha de configuração. Schroeder, Wierman e Harchol-Balter escreveram um paper inteiro sobre esse tipo de erro.

Um segundo ponto de enquadramento: o timeout e o retry do cliente fazem parte do modelo de carga, não do sistema sob teste. É o cliente que decide desistir e pedir de novo, e é essa decisão que amplifica λ. Tratá-los como parâmetro de carga, e não como detalhe de implementação do serviço, é o que torna o experimento controlável.

03 Cenário

A pergunta dela: como montar os cenários?

A resposta é não improvisar. Um cenário precisa de três partes. Primeiro, uma hipótese de estado estável declarada em número antes de rodar — por exemplo "goodput acima de 95% de λ e p99 abaixo de 400 ms". É o que a literatura de chaos engineering coloca no centro do método: o experimento existe para tentar refutar uma afirmação, não para ver o que acontece.

Segundo, um desenho de experimento em vez de uma lista de anedotas. Os fatores são carga base como fração de μ, tipo de gatilho, configuração de timeout e retry do cliente, e mitigação ativa. O fatorial completo explode, então o caminho é varrer um fator por vez em volta de um ponto de referência, e registrar por que cada ponto foi escolhido. É exatamente o assunto do livro do Raj Jain, e é o que separa um capítulo de resultados de uma coleção de prints do Grafana.

Terceiro, e é o que quase nenhum teste de carga faz: o cenário tem que continuar medindo depois que o gatilho termina. Metaestabilidade só existe na janela pós-gatilho. Um teste que injeta pico, mede o pico e para, não consegue distinguir um sistema que se recupera de um que ficou preso — os dois têm o mesmo gráfico durante o pico.

04 Observação

Duas métricas que quase ninguém coleta

O básico é conhecido: latência em percentis e não em média, taxa de erro, utilização e saturação de cada recurso. Sobre isso, duas medidas específicas fazem o trabalho.

A primeira é o fator de amplificação: pedidos que o servidor recebe divididos por pedidos que os clientes originaram. Em repouso vale 1. Quando o laço fecha, sobe. É a observação direta do mecanismo, e é o que transforma "o sistema caiu" em "o sistema caiu porque a carga triplicou sozinha".

A segunda é o tempo de recuperação após a remoção do gatilho. É a definição operacional de metaestabilidade: se o goodput não volta ao patamar anterior dentro de um múltiplo declarado da duração do gatilho, o sistema está no estado metaestável. Escolher esse múltiplo e defendê-lo é uma decisão de método que o TG precisa tomar cedo.

Vale registrar também que goodput se mede no cliente, não no servidor. Só o cliente sabe se ainda queria a resposta quando ela chegou. Um servidor a cem por cento de CPU produzindo respostas para pedidos abandonados reporta throughput excelente.

05 Mitigação

A espiral é onde está a contribuição

Os mecanismos estão descritos mais abaixo. O que a espiral acrescenta é o ponto interessante: medir um mecanismo isolado diz pouco. Já se sabe que backoff com jitter melhora as coisas. O que não está resolvido na literatura é o que acontece quando três mecanismos configurados de forma independente convivem no mesmo caminho de requisição.

Um exemplo concreto do problema: load shedding recusa trabalho rápido, produzindo erros rápidos; o circuit breaker do cliente lê erro rápido como falha e abre; com o breaker aberto, a carga cai e o shedding para de recusar; o breaker fecha, a carga volta de uma vez, e o shedding volta a recusar. O sistema oscila, e nenhum dos dois mecanismos está com defeito.

A professora escreve que a espiral aumenta a complexidade e exige mais teste. É verdade, e por isso ela precisa de um critério de parada declarado no escopo — proposta: duas voltas. Na primeira, um mecanismo medido antes e depois. Na segunda, dois mecanismos interagindo. Depois disso, congela e escreve.

Replicação, que ela cita junto com retry, merece uma nota crítica: ela protege contra falha de processo, mas também é amplificador sob sobrecarga. Requisição especulativa contra a segunda réplica, read repair e retry contra outro nó todos multiplicam λ justamente quando λ já é o problema. É um bom candidato a resultado do trabalho.

O fenômeno

Veja o laço fechar

Antes das ferramentas, o alvo. Um servidor com capacidade fixa recebendo pedidos. Quando um pedido espera demais, o cliente desiste e pede de novo — e esse pedido novo entra na mesma fila. Suba a carga base para perto da capacidade, injete um pico e observe o que acontece depois que o pico termina.

Goodput sob carga

trabalho útil entregue, % da capacidade

goodput — respostas dentro do prazo trabalho desperdiçado — feito tarde demais
Estável folga de capacidade confortável

Com retry imediato e carga base alta, o pico termina e o goodput não volta. Troque para backoff ou retry budget e repita o experimento: o sistema afunda durante o pico, mas se recupera sozinho depois. Essa diferença é o objeto do trabalho.

Este simulador é uma maquete. São cinquenta linhas de JavaScript com uma fila e um contador — não tem rede, não tem processo para matar, não tem contenção de recurso real. Ele serve para fixar a intuição e para escolher onde olhar. A esteira existe justamente para reproduzir o mesmo comportamento em containers de verdade, onde ele pode não aparecer, aparecer diferente, ou aparecer por outro motivo — e é essa diferença que vira resultado.

Em linguagem simples

Comece por uma distinção que sustenta o resto. Num sistema fechado, o número de clientes é fixo: se o servidor fica lento, cada cliente espera, e o trabalho novo diminui naturalmente. Num sistema aberto, a carga vem de fora e não te consulta — se o servidor fica lento, os pedidos continuam chegando no mesmo ritmo. Toda a web é sistema aberto. É a mesma distinção que reaparece na etapa 02 como uma escolha de configuração do k6, e é por isso que ela está aqui no começo.

Junte com capacidade. Um serviço processa até μ pedidos por segundo e recebe λ. Enquanto λ é menor que μ, a fila fica estável. Quando λ ultrapassa μ, a fila cresce sem limite e a latência explode. Isso é teoria de filas básica, e é a única matemática necessária para entender o resto.

O terceiro ingrediente é a diferença entre throughput e goodput. Throughput é quanto trabalho o servidor faz. Goodput é quanto desse trabalho serve para alguém. Um servidor pode estar cem por cento ocupado produzindo respostas que ninguém mais espera, porque o cliente já deu timeout e pediu de novo. Trabalho feito, jogado fora.

E aí vem o mecanismo. O cliente não recebe resposta a tempo e faz retry. Retry é uma feature de confiabilidade — existe justamente para tolerar falha transitória. Mas cada retry é um pedido novo, então o retry aumenta λ. Serviço lento leva a mais retries, que levam a λ maior, que leva a serviço mais lento. É realimentação positiva, e se auto-sustenta.

O ponto central: quando o laço fecha, o sistema para de depender da causa original. O pico pode ter acabado há vinte minutos e o λ externo já ter voltado ao normal — o sistema continua no chão, porque agora a carga que o mantém lá é a que ele mesmo gera.

Ele está num estado localmente estável, do qual só sai com um empurrão externo. Daí o nome, emprestado da física. É exatamente por isso que reiniciar tudo funciona: você drena as filas e quebra o laço à força.

Os três estados de uma falha metaestável Do estado estável ao vulnerável quando a carga cresce, e do vulnerável ao metaestável quando ocorre um gatilho. Uma seta tracejada indica que o sistema não retorna sozinho. Estável muita folga de capacidade carga cresce Vulnerável eficiente, pouca folga pico ou falha Metaestável retry alimenta retry o gatilho vai embora, mas o sistema não volta sozinho
→ arraste o diagrama para o ladoO estado do meio é o cruel: rodar com pouca folga é desejável, porque folga é hardware ocioso. Praticamente todo sistema bem operado passa a maior parte do tempo ali, de propósito. A vulnerabilidade é o preço da eficiência.

Retry não é o único amplificador

Cache é outro clássico: se um cache esvazia, todo o tráfego vai direto ao banco; o banco fica lento; como o banco está lento, o cache não consegue se repovoar; e o sistema fica preso com o cache frio indefinidamente. Tratamento de erro lento é outro — o caminho de exceção costuma ser mais caro que o caminho feliz, então mais erro gera mais lentidão, que gera mais erro. O próprio balanceador pode amplificar quando manda mais tráfego para o nó que respondeu rápido por acaso.

As mitigações atacam o laço, não o gatilho

Backoff exponencial com jitter faz o cliente esperar cada vez mais entre tentativas, com aleatoriedade para não sincronizar todo mundo. Retry budget limita retries a uma fração do tráfego normal, tipicamente via token bucket, de modo que o retry nunca multiplique a carga além de um fator conhecido. Circuit breaker é uma máquina de estados no cliente que, após N falhas, para de tentar por um tempo e depois testa o terreno com poucos pedidos. Load shedding é o servidor recusar trabalho na entrada para proteger o que já aceitou. E propagação de deadline faz o pedido carregar consigo quanto tempo ainda resta, para ninguém gastar CPU num trabalho que já perdeu a validade.

A bancada

O sistema de exemplo

O rascunho diz que provavelmente é preciso definir um sistema de exemplo, e que os componentes podem ficar mais complexos depois. A proposta é começar com o menor sistema que ainda tem um gargalo de verdade: quatro containers e um proxy, num docker compose, rodando num laptop.

Topologia da bancada e pontos de injeção O gerador de carga k6 envia requisições em modo aberto para a API, que chama o serviço. O serviço tem um pool fixo de workers que define a capacidade, consulta o cache Redis em cache-aside e o banco Postgres através do Toxiproxy. A falha de processo é injetada na API por crash e restart; a falha de comunicação é injetada no Toxiproxy como delay e perda. Prometheus e Grafana coletam métricas da API, do serviço e do banco. sistema aberto Carga k6 crash · restart API timeout + retry Cache Redis cache-aside Serviço pool fixo = μ delay · perda toxiproxy Banco Postgres Prometheus + Grafana goodput · amplificação de retry · tempo de recuperação falha injetada carga aplicada
→ arraste o diagrama para o ladoO pool fixo do serviço é o gargalo deliberado: é ele que torna μ conhecido e ajustável, e é contra μ que a carga base é calibrada para colocar o sistema no estado vulnerável. O Toxiproxy fica no caminho da dependência, e não dentro do serviço, para que delay e perda sejam injetados sem tocar em uma linha de código do sistema sob teste.

Por que este desenho e não outro

Três razões. O pool fixo é a mais importante: um serviço com número limitado de workers tem capacidade conhecida, o que permite comparar o que a teoria de filas prevê com o que a bancada mede — sem isso, μ é uma incógnita e não há modelo para confrontar. O cache entra porque é o segundo amplificador clássico, e tê-lo desde o início evita reconstruir a bancada quando o TG quiser mostrar que o fenômeno não é exclusivo do retry. E o proxy separa a injeção de falha do código da aplicação, o que é o que torna o experimento honesto: o serviço não sabe que está sendo testado.

Nada de nuvem paga. O fenômeno reproduz em meia dúzia de containers num laptop, e cloud gerenciada troca tempo de pesquisa por tempo de configuração de IAM. Se depois for preciso mostrar orquestração e réplicas, k3s ou kind resolvem localmente.

Não construir do zero no primeiro semestre

O artigo do OSDI '22 publicou o código dos reprodutores que ele usa — aplicações pequenas que já exibem cada tipo de falha metaestável em ambiente controlado. Rodar isso primeiro responde a pergunta mais arriscada do TG — "eu consigo reproduzir o fenômeno?" — antes de qualquer linha de código próprio, e dá um ponto de referência para saber se a bancada nova está funcionando ou apenas quieta. Trocar por um serviço próprio depois é barato; descobrir em agosto que o fenômeno não reproduz, não é.

Ferramental

k6 para carga, com executor de taxa de chegada. Toxiproxy para falha de rede, controlado por API HTTP — o que importa aqui é que o cenário fica scriptável e portanto reprodutível. Docker para falha de processo, com kill, restart e pause. Prometheus e Grafana para métricas. Tudo com documentação boa e curva de aprendizado de dias, não de meses.

Escopo

Etapas necessárias e desejáveis

O e-mail pede exatamente isso: definir melhor as etapas necessárias e as desejadas. A separação abaixo é uma proposta para a reunião — a lista de cima é o que precisa existir para o trabalho fechar, e a de baixo é o que agrega se sobrar tempo. A intenção é ter um TG defensável mesmo no cenário em que nada da segunda lista acontece.

Necessário

  1. Taxonomia de falhas escolhida e justificada, com duas classes efetivamente injetáveis: processo e comunicação.
  2. Modelo de carga em sistema aberto, com carga base parametrizada em fração de μ, gatilho definido e janela de medição depois do gatilho.
  3. Bancada de quatro containers e um proxy, com μ conhecido e ajustável, congelada a partir de uma data.
  4. Plano de experimentos escrito antes de rodar, com hipótese de estado estável em número e justificativa de cada ponto do espaço de fatores.
  5. Observabilidade cobrindo goodput medido no cliente, fator de amplificação e tempo de recuperação, com repetições e variabilidade reportada.
  6. Uma volta completa da espiral: um mecanismo de mitigação, medido antes e depois, nos mesmos cenários.
  7. Uma falha metaestável reproduzida em bancada — ou, se não reproduzir, a demonstração fundamentada de qual condição faltou. Esse resultado negativo também é resultado, e é o que protege o trabalho.

Desejável

  1. Modelo analítico de fila que prevê o ponto de virada, confrontado com a medição.
  2. Segunda volta da espiral, com dois mecanismos interagindo — onde está a parte mais original do trabalho.
  3. Cache frio como segundo amplificador, mostrando que o fenômeno não é exclusividade do retry.
  4. Orquestração e replicação, incluindo o caso em que a réplica amplifica em vez de proteger.
  5. Diretrizes de configuração como entregável final, no lugar de apenas um capítulo de resultados.

A camada analítica

Vale destacar por que o item 1 da lista desejável é mais interessante do que parece. O trabalho de outubro de 2025 no arXiv aponta que modelos de fila padrão como o M/M/c simplesmente não exibem metaestabilidade — falta neles alguma coisa, e a candidata natural é justamente o laço de realimentação do retry, que um modelo com λ exógeno não tem como representar. Modelar antes de medir transforma a tese de "medimos e deu isso" em "o modelo prevê X, a bancada faz Y, e a diferença se explica por Z". É o que dá espinha dorsal a um trabalho experimental.

Calendário

Proposta a validar na reunião, assumindo entrega no fim de 2027.

Set – Out 2026Investigação inicial: leituras, rodar os reprodutores do OSDI '22, escolher taxonomia e ferramental.
Nov – Dez 2026Fechar escopo com a professora e definir o sistema de exemplo.
Jan – Mar 2027Construir e instrumentar a bancada. Congelar em março e não mexer mais.
Abr 2027Escrever o capítulo de metodologia. Não deixar para setembro.
Abr – Ago 2027Rodar as voltas da espiral.
Set – Nov 2027Escrever.

Toda vez que bater vontade de melhorar a aplicação, é sinal de fuga do experimento. O que mata TG de quem trabalha não é a bancada — é a escrita empurrada para o fim.

Leituras

Por onde começar

Começar aqui

Metastable Failures in Distributed Systems

Bronson, Aghayev, Charapko e Zhu. Onde o termo nasce, a partir de anos operando sistemas em escala. Sete páginas, vale ler inteiro. Fecha dizendo que construir sistemas robustos a falhas metaestáveis desconhecidas segue um problema em aberto.

HotOS 2021 · ACM
Evidência

Metastable Failures in the Wild

Huang et al. Estudo de 22 falhas em 11 organizações a partir de relatórios públicos de incidente; ao menos 4 dos 15 maiores outages da AWS na década se encaixam no padrão. Traz também aplicações que reproduzem cada tipo em ambiente controlado.

OSDI 2022 · USENIX · código aberto no GitHub
Leve

Metastability and Distributed Systems

Marc Brooker, engenheiro principal da AWS. A leitura mais acessível das três, boa para fixar a intuição antes de encarar os papers.

Blog · 2021
Taxonomia

Basic Concepts and Taxonomy of Dependable and Secure Computing

Avizienis, Laprie, Randell e Landwehr. A taxonomia que a professora pede para reusar, e a fonte da distinção entre falta, erro e falha. É um artigo longo e de leitura seca, mas basta a parte de classificação de faltas para fundamentar o capítulo de modelo de falha.

IEEE Transactions on Dependable and Secure Computing · 2004
Carga

Open Versus Closed: A Cautionary Tale

Schroeder, Wierman e Harchol-Balter. Mostra que sistema aberto e sistema fechado se comportam de forma qualitativamente diferente sob a mesma carga nominal, e que escolher o modelo errado no gerador de carga inverte conclusões. É a referência que justifica a escolha de executor do k6 na etapa 02 — a decisão de método mais barata e mais fácil de errar de todo o TG.

NSDI 2006 · USENIX
Chaos

Chaos Engineering

Basiri et al., do time da Netflix. O artigo que formaliza a prática como experimento científico em vez de "quebrar coisas em produção": hipótese de estado estável declarada antes, variável independente controlada, e refutação. É o que responde à pergunta de como montar os cenários. Complementa os princípios, que são mais curtos e mais citáveis.

IEEE Software 33(3) · 2016
Matemática

Formal Analysis of Metastable Failures in Software Systems

Teoria de filas e cadeias de Markov em tempo contínuo aplicadas ao fenômeno, com cálculo de tempos de recuperação. Traz uma observação que pode sustentar um TG inteiro: modelos de fila padrão como o M/M/c simplesmente não exibem metaestabilidade — descobrir o que falta neles é pergunta de pesquisa.

arXiv · out. 2025
Método

A declarative approach and benchmark tool for controlled evaluation of microservice resiliency patterns

Aderaldo et al. Desenho experimental reutilizável: cenários especificados declarativamente para medir o impacto de desempenho de retry e circuit breaker sob carga e falha variadas. O mais próximo que existe de um molde pronto para a esteira deste TG.

Software: Practice and Experience · 2025
Prático

Addressing Cascading Failures e Handling Overload

Dois capítulos do livro de SRE do Google, livres na web. São a descrição mais concreta que existe de retry budget, load shedding e propagação de deadline em operação real, incluindo os números que eles usam. Não são artigo científico, mas são a fonte primária dos mecanismos que o TG vai medir.

O'Reilly / Google · 2016
Panorama

Resilient Microservices: A Systematic Review of Recovery Patterns

Revisão sistemática de circuit breakers, retries, sagas, idempotência, bulkheads, backpressure e chaos testing entre 2014 e 2025. A conclusão — evidência fragmentada, resultados conflitantes, engenheiros sem base consolidada para escolher a tática certa — é o parágrafo de justificativa pronto.

arXiv · 2025

Livros de apoio

Harchol-Balter, Performance Modeling and Design of Computer Systems, é a referência de teoria de filas aplicada a sistemas e aparece citada em quase todos esses papers. Raj Jain, The Art of Computer Systems Performance Analysis, é o clássico de desenho de experimento — importante porque metade dos trabalhos experimentais morre por medir errado, e é dele que sai o método da etapa 03. Nygard, Release It!, cobre o lado prático dos padrões de resiliência.

Nas buscas aparecem "papers" em periódicos como IJRAI e IJIRMPS. Não citar. São publicações de baixíssimo rigor, muitas predatórias. Ficar em ACM, USENIX, IEEE e nos preprints do arXiv que correspondam a artigos aceitos nesses veículos.
Reunião

Perguntas para levar

O rascunho já converge o escopo. O que falta decidir é o tamanho de cada etapa — e três dessas decisões mudam bastante o trabalho.

  1. Demonstrar a falha metaestável é critério de sucesso ou objetivo esticado? Se for critério, o risco do TG sobe muito, porque depende de o fenômeno reproduzir na bancada. A proposta aqui é tratar como objetivo, com o resultado negativo fundamentado valendo como entrega.
  2. O sistema de exemplo pode começar sendo um reprodutor do artigo do OSDI '22, ou ela prefere algo construído do zero? A primeira opção derruba o risco do primeiro semestre; a segunda dá mais autoria.
  3. Quanto ela espera da camada analítica frente ao puramente empírico? Modelar filas e confrontar com a medição é o que dá tese ao trabalho, mas é meio capítulo a mais.
  4. Duas voltas da espiral são suficientes como critério de parada, ou ela tem outro corte em mente?
  5. A taxonomia do Avizienis serve, ou ela prefere alguma referência mais específica de sistemas distribuídos que já use em aula?
  6. Havia preferência por HAProxy no rascunho original de escalabilidade. Ele continua no escopo, ou o balanceamento sai agora que o foco é o laço de realimentação?