<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Fellipe Cotta</title>
    <description>The latest articles on DEV Community by Fellipe Cotta (@fellipe_cotta_5030).</description>
    <link>https://dev.to/fellipe_cotta_5030</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4194811%2F717edbd1-9159-4b5d-8e7a-72c9fff5568d.jpg</url>
      <title>DEV Community: Fellipe Cotta</title>
      <link>https://dev.to/fellipe_cotta_5030</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/fellipe_cotta_5030"/>
    <language>en</language>
    <item>
      <title>Quando Tudo Falha: Explorando a Engenharia do Caos com o ChaosEngineeringMasterDeck</title>
      <dc:creator>Fellipe Cotta</dc:creator>
      <pubDate>Mon, 19 Oct 2026 20:17:23 +0000</pubDate>
      <link>https://dev.to/fellipe_cotta_5030/quando-tudo-falha-explorando-a-engenharia-do-caos-com-o-chaosengineeringmasterdeck-47en</link>
      <guid>https://dev.to/fellipe_cotta_5030/quando-tudo-falha-explorando-a-engenharia-do-caos-com-o-chaosengineeringmasterdeck-47en</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Nota de transparência:&lt;/strong&gt; este artigo apresenta um cenário hipotético, elaborado para fins acadêmicos. O experimento, a arquitetura e os resultados descritos não foram executados nem medidos em uma infraestrutura real. Os valores numéricos são ilustrativos e servem para explicar como um teste de Engenharia do Caos poderia ser planejado e analisado.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  1 Introdução ao Chaos Engineering: da prevenção à mitigação
&lt;/h2&gt;

&lt;p&gt;Em sistemas distribuídos, falhas não são apenas uma possibilidade distante. Redes podem apresentar latência, bancos de dados podem ficar temporariamente indisponíveis, serviços externos podem responder lentamente e recursos computacionais podem se esgotar. Quando uma aplicação depende de vários componentes, uma falha localizada pode se propagar e afetar partes maiores do sistema.&lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;Engenharia do Caos&lt;/strong&gt; (&lt;em&gt;Chaos Engineering&lt;/em&gt;) é uma abordagem experimental usada para investigar como um sistema se comporta diante de falhas controladas. Em vez de esperar por um incidente real para descobrir fragilidades, a equipe formula hipóteses, introduz uma condição adversa de forma planejada e observa se o sistema continua operando dentro de limites aceitáveis.&lt;/p&gt;

&lt;p&gt;Testes unitários, testes de integração e revisões de código continuam sendo fundamentais, mas eles não revelam necessariamente todos os efeitos que surgem quando componentes distribuídos interagem sob condições inesperadas. Por exemplo, uma dependência lenta pode manter requisições abertas por muito tempo, consumir threads e conexões e provocar uma falha em cascata.&lt;/p&gt;

&lt;p&gt;Essa prática propõe uma mudança de mentalidade:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Abordagem centrada apenas na prevenção:&lt;/strong&gt; tentar impedir todas as falhas e reagir quando elas acontecem.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Abordagem orientada à resiliência:&lt;/strong&gt; reconhecer que falhas podem ocorrer e projetar, testar e monitorar mecanismos que limitem seus efeitos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Isso não significa provocar falhas sem critério ou começar diretamente em produção. Os experimentos precisam ter objetivos claros, limites de impacto, monitoramento e um procedimento de interrupção. Para um primeiro teste, um ambiente isolado ou de pré-produção costuma ser uma opção mais segura. Experimentos em produção exigem controles operacionais e autorização apropriados.&lt;/p&gt;

&lt;h2&gt;
  
  
  22 Dissecando o ChaosEngineeringMasterDeck
&lt;/h2&gt;

&lt;p&gt;A Engenharia do Caos precisa de método. Introduzir falhas aleatoriamente, sem hipótese nem limites, pode causar indisponibilidade sem produzir aprendizado útil.&lt;/p&gt;

&lt;p&gt;Neste artigo, o &lt;strong&gt;ChaosEngineeringMasterDeck&lt;/strong&gt; é tratado como um modelo conceitual de organização dos experimentos: um catálogo de cenários de falha, representados por “cartas”, acompanhado de um protocolo para planejar, executar e avaliar cada teste. Esta descrição é uma proposta para o estudo acadêmico, não uma afirmação de que exista uma ferramenta padronizada com essa implementação.&lt;/p&gt;

&lt;p&gt;Cada carta pode conter a categoria da falha, o componente-alvo, a hipótese, as métricas de controle, o limite de impacto e os critérios para interromper o experimento. Para orientar a análise, o protocolo é dividido em cinco elementos.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.1 Estado estável (&lt;em&gt;Steady State&lt;/em&gt;)
&lt;/h3&gt;

&lt;p&gt;É a descrição mensurável do funcionamento considerado normal. Não basta verificar se o servidor está ligado: é importante acompanhar indicadores técnicos e, quando pertinente, indicadores de negócio.&lt;/p&gt;

&lt;p&gt;Neste cenário hipotético, o estado estável poderia incluir:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;latência p99 do serviço de pedidos abaixo de 400 ms;&lt;/li&gt;
&lt;li&gt;utilização do pool de conexões abaixo de 60%;&lt;/li&gt;
&lt;li&gt;taxa de erros HTTP 5xx abaixo de 0,1%;&lt;/li&gt;
&lt;li&gt;capacidade de registrar pedidos sem perda de dados.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esses valores são metas ilustrativas para o cenário, não limites universais. Em um sistema real, eles precisariam ser definidos a partir dos requisitos e da linha de base observada.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.2 Hipótese
&lt;/h3&gt;

&lt;p&gt;A hipótese descreve o comportamento que se espera observar quando a falha for introduzida. Ela deve ser clara e verificável.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hipótese do cenário:&lt;/strong&gt; se o serviço de pagamentos apresentar latência elevada, o serviço de pedidos deverá limitar o tempo de espera, evitar a saturação de recursos e, quando o fluxo de negócio permitir, registrar o pedido para processamento posterior sem declarar que o pagamento foi concluído.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.3. Variável de injeção
&lt;/h3&gt;

&lt;p&gt;É a condição adversa introduzida no sistema. Exemplos incluem latência de rede, perda de pacotes, consumo elevado de CPU, encerramento de um contêiner ou indisponibilidade temporária de uma dependência.&lt;/p&gt;

&lt;p&gt;Neste caso, a variável escolhida é a latência artificial na comunicação com o serviço de pagamentos.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.4 Raio de explosão (&lt;em&gt;Blast Radius&lt;/em&gt;)
&lt;/h3&gt;

&lt;p&gt;O &lt;em&gt;Blast Radius&lt;/em&gt; define a extensão máxima do impacto permitido. Pode limitar o experimento a um serviço, a determinadas instâncias, a uma parcela do tráfego ou a um ambiente isolado.&lt;/p&gt;

&lt;p&gt;Quanto menor e mais controlado for o raio inicial, mais fácil será identificar a causa de um comportamento inesperado e reduzir o risco para usuários.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.5. Condição de aborto (&lt;em&gt;Stop Condition&lt;/em&gt;)
&lt;/h3&gt;

&lt;p&gt;A condição de aborto estabelece quando o teste deve ser interrompido. Ela pode considerar o aumento de erros, a elevação da latência, a saturação de recursos ou qualquer sinal de impacto além do limite aprovado.&lt;/p&gt;

&lt;p&gt;O plano também deve definir como remover a injeção de falha, verificar a recuperação e comunicar a interrupção. Um teste de caos seguro precisa ter um caminho claro para parar.&lt;/p&gt;

&lt;h2&gt;
  
  
  3 Estudo de caso simulado: latência no serviço de pagamentos
&lt;/h2&gt;

&lt;p&gt;Para aplicar o modelo, considere uma arquitetura hipotética de processamento de pedidos. O sistema utiliza microsserviços desenvolvidos em Java com Spring Boot, executados em Kubernetes na AWS EKS, com PostgreSQL para persistência e RabbitMQ para comunicação assíncrona.&lt;/p&gt;

&lt;p&gt;O fluxo principal envolve um &lt;code&gt;order-service&lt;/code&gt;, responsável pelos pedidos, e um &lt;code&gt;payment-gateway-service&lt;/code&gt;, responsável pela integração com o pagamento. Uma dependência lenta pode fazer com que o serviço de pedidos mantenha requisições abertas, acumule trabalho e consuma recursos que seriam necessários para outras operações.&lt;/p&gt;

&lt;p&gt;O objetivo do experimento proposto é avaliar se o sistema limita essa espera e preserva a capacidade de responder a outras requisições.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.1 Carta selecionada
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Identificação:&lt;/strong&gt; NET-04&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Nome:&lt;/strong&gt; Latência em dependência crítica&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Categoria:&lt;/strong&gt; Rede e dependências síncronas&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Atributo&lt;/th&gt;
&lt;th&gt;Especificação proposta&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Componente observado&lt;/td&gt;
&lt;td&gt;Comunicação entre &lt;code&gt;order-service&lt;/code&gt; e &lt;code&gt;payment-gateway-service&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Falha injetada&lt;/td&gt;
&lt;td&gt;Latência artificial de 2.500 ms, com variação (&lt;em&gt;jitter&lt;/em&gt;) de até 200 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hipótese&lt;/td&gt;
&lt;td&gt;O serviço de pedidos limitará o tempo de espera e evitará que a lentidão se propague para outros endpoints&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Métricas&lt;/td&gt;
&lt;td&gt;Latência p50/p95/p99, erros HTTP 5xx, threads ocupadas, conexões do pool e estado do Circuit Breaker&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Duração máxima&lt;/td&gt;
&lt;td&gt;5 minutos, caso todos os critérios de segurança sejam respeitados&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ambiente inicial recomendado&lt;/td&gt;
&lt;td&gt;Ambiente de teste isolado, sem tráfego real de clientes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Os valores acima são parâmetros ilustrativos do estudo de caso. Uma execução real exigiria validar a configuração da ferramenta de injeção, os seletores dos componentes e a compatibilidade com a versão do ambiente.&lt;/p&gt;
&lt;h3&gt;
  
  
  3.2 Definição do Blast Radius
&lt;/h3&gt;

&lt;p&gt;Para manter o experimento limitado, o plano considera um ambiente de teste isolado e uma instância canário do &lt;code&gt;order-service&lt;/code&gt;. A injeção deve afetar apenas a comunicação definida para o teste, sem atingir outros serviços ou tráfego não relacionado.&lt;/p&gt;

&lt;p&gt;O plano de execução deve confirmar previamente:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;que o seletor identifica somente o componente-alvo;&lt;/li&gt;
&lt;li&gt;que o tráfego de teste está separado do tráfego de usuários;&lt;/li&gt;
&lt;li&gt;que a injeção pode ser removida imediatamente;&lt;/li&gt;
&lt;li&gt;que as métricas e os alertas estão funcionando;&lt;/li&gt;
&lt;li&gt;que existe um procedimento de aborto testado.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Em uma implantação real, a restrição a uma instância canário e a uma porcentagem específica de tráfego precisaria ser implementada e validada por mecanismos de roteamento e seleção adequados. Apenas declarar que o teste atinge 5% do tráfego não garante esse isolamento.&lt;/p&gt;
&lt;h3&gt;
  
  
  3.3 Exemplo ilustrativo de configuração
&lt;/h3&gt;

&lt;p&gt;O trecho abaixo serve para demonstrar como um manifesto YAML pode ser apresentado no artigo. &lt;strong&gt;Ele não deve ser tratado como uma configuração pronta para execução&lt;/strong&gt;: os seletores, o namespace e os campos necessários precisam ser ajustados e validados para o ambiente e a versão da ferramenta utilizados.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Exemplo conceitual de injeção de latência&lt;/span&gt;
&lt;span class="c1"&gt;# Validar os seletores e os campos antes de qualquer execução.&lt;/span&gt;
&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;chaos-mesh.org/v1alpha1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;NetworkChaos&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;payment-latency-injection&lt;/span&gt;
  &lt;span class="na"&gt;namespace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;test-canary&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;action&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;delay&lt;/span&gt;
  &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;one&lt;/span&gt;
  &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;namespaces&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;test-canary&lt;/span&gt;
    &lt;span class="na"&gt;labelSelectors&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;payment-gateway-service&lt;/span&gt;
  &lt;span class="na"&gt;delay&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;latency&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2500ms"&lt;/span&gt;
    &lt;span class="na"&gt;correlation&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;100"&lt;/span&gt;
    &lt;span class="na"&gt;jitter&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;200ms"&lt;/span&gt;
  &lt;span class="na"&gt;duration&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;5m"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O manifesto é apresentado como referência didática. A seleção do alvo e a direção do tráfego devem corresponder à hipótese do experimento; não se deve presumir que esse exemplo, sem validação adicional, implemente sozinho todo o isolamento descrito.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.4 Condições de aborto
&lt;/h3&gt;

&lt;p&gt;Para este cenário, o teste seria interrompido se a taxa de erros ultrapassasse o limite definido pela equipe, se a latência de endpoints não relacionados aumentasse de forma significativa ou se os recursos se aproximassem de níveis críticos.&lt;/p&gt;

&lt;p&gt;Como exemplo acadêmico, poderia ser definido um limite de 1% de erros HTTP 5xx durante a janela de observação. Em uma execução real, o limiar precisaria ser justificado pela linha de base e pelos objetivos de serviço. O plano também deveria incluir a remoção da injeção e a confirmação de que as métricas retornaram aos níveis esperados.&lt;/p&gt;

&lt;h2&gt;
  
  
  4 Observabilidade e padrões de resiliência
&lt;/h2&gt;

&lt;p&gt;A observabilidade permite entender não apenas que houve degradação, mas onde ela começou, como se propagou e quais recursos foram afetados. Para o cenário proposto, três fontes de informação seriam úteis:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Métricas com Prometheus e Grafana:&lt;/strong&gt; acompanhar latência p50, p95 e p99, taxa de erros, CPU, memória, threads ocupadas, conexões do pool e estado do Circuit Breaker.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rastreamento distribuído com OpenTelemetry e Jaeger:&lt;/strong&gt; identificar quanto tempo cada etapa da requisição consome e localizar a dependência que introduz a demora.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Logs centralizados, por exemplo com a stack ELK:&lt;/strong&gt; investigar timeouts, exceções, tentativas repetidas e acionamentos de fallback.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As ferramentas citadas são exemplos de uma possível implementação. O cenário não pressupõe que elas tenham sido instaladas ou utilizadas em um ambiente real.&lt;/p&gt;

&lt;h3&gt;
  
  
  4.1 Comportamento esperado da arquitetura
&lt;/h3&gt;

&lt;p&gt;O fluxo hipotético pode ser resumido assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Cliente]
    |
    | POST /orders
    v
[order-service]
    |
    | chamada com limite de tempo
    v
[Circuit Breaker / TimeLimiter]
    |
    +---- chamada normal ----&amp;gt; [payment-gateway-service]
    |
    +---- falha ou timeout ---&amp;gt; [tratamento alternativo]
                                      |
                                      v
                              [RabbitMQ, se aplicável]
                                      |
                                      v
                          [processamento posterior]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O desenho representa uma possibilidade de arquitetura, não um resultado observado. A utilização de uma fila depende das regras de negócio e da garantia de que o pedido possa ser registrado com segurança antes da confirmação do pagamento.&lt;/p&gt;

&lt;h3&gt;
  
  
  4.2 Primeira etapa: identificar o risco das novas tentativas
&lt;/h3&gt;

&lt;p&gt;No cenário proposto, uma chamada ao serviço de pagamentos demora 2.500 ms. Se o cliente realizar três tentativas sequenciais, cada uma com essa duração e sem considerar outros tempos de processamento, a espera acumulada pode chegar a aproximadamente 7,5 segundos.&lt;/p&gt;

&lt;p&gt;Essa demora pode manter requisições ocupadas por tempo excessivo. Se muitas requisições se acumularem, o serviço pode sofrer saturação de threads e de conexões. O efeito exato dependeria da implementação, dos timeouts, do tipo de processamento e da concorrência.&lt;/p&gt;

&lt;p&gt;Por isso, as novas tentativas (&lt;em&gt;retries&lt;/em&gt;) precisam ser limitadas e configuradas em conjunto com os demais mecanismos de resiliência. Repetir uma chamada indiscriminadamente pode ampliar a sobrecarga justamente quando a dependência já está degradada.&lt;/p&gt;

&lt;h3&gt;
  
  
  4.3 Segunda etapa: aplicar mecanismos de resiliência
&lt;/h3&gt;

&lt;p&gt;No cenário simulado, três mecanismos poderiam reduzir o impacto da falha.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;TimeLimiter e timeout:&lt;/strong&gt; estabelecer um tempo máximo de espera para a operação. Um limite ilustrativo de 1.000 ms faria com que a aplicação tratasse a chamada como excedida antes de aguardar os 2.500 ms completos, desde que o timeout estivesse corretamente aplicado à operação e que o cliente subjacente pudesse ser controlado conforme necessário.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Bulkhead:&lt;/strong&gt; limitar os recursos dedicados às chamadas para a dependência problemática. Por exemplo, um limite hipotético de 15 execuções concorrentes poderia ajudar a impedir que essa integração consumisse todos os recursos disponíveis para outros endpoints. O valor correto dependeria de testes de carga e da capacidade do serviço.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Circuit Breaker e tratamento alternativo:&lt;/strong&gt; interromper temporariamente chamadas a uma dependência considerada degradada, segundo critérios configurados, para evitar novas esperas desnecessárias. Um exemplo de configuração poderia avaliar uma janela de 20 chamadas e abrir o circuito quando a proporção de chamadas lentas ou com falha ultrapassasse o limiar estabelecido. A configuração real precisa definir quais eventos são contabilizados e como o circuito se recupera.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Se a regra de negócio permitir, o sistema poderá registrar o pedido como pendente e encaminhar o processamento do pagamento para uma fila. A resposta ao cliente deve deixar claro que o pagamento ainda não foi confirmado. Um HTTP &lt;code&gt;202 Accepted&lt;/code&gt; pode indicar que a solicitação foi aceita para processamento, mas não significa que a transação financeira foi concluída.&lt;/p&gt;

&lt;h3&gt;
  
  
  4.4 Exemplo didático em Java
&lt;/h3&gt;

&lt;p&gt;O trecho seguinte ilustra a ideia de delimitar uma chamada e tratar uma falha. Ele é esquemático e não constitui uma implementação completa: assinaturas de fallback, execução assíncrona, configuração do Resilience4j e integração com a fila precisam ser ajustadas ao projeto.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@CircuitBreaker&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"paymentService"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;fallbackMethod&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"queuePaymentForLater"&lt;/span&gt;
&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nd"&gt;@Bulkhead&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"paymentService"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Bulkhead&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Type&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;THREADPOOL&lt;/span&gt;
&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nd"&gt;@TimeLimiter&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"paymentService"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;CompletableFuture&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;PaymentResponse&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;processPayment&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
        &lt;span class="nc"&gt;OrderRequest&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;CompletableFuture&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;supplyAsync&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
        &lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;paymentClient&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;charge&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Em uma implementação real, o método de fallback deve ter uma assinatura compatível com o método protegido e com a exceção recebida. Também é necessário garantir que o pedido seja persistido de forma consistente, que a mensagem possa ser processada com segurança e que falhas de publicação na fila sejam tratadas.&lt;/p&gt;

&lt;h3&gt;
  
  
  4.5 Resultados hipotéticos e critérios de avaliação
&lt;/h3&gt;

&lt;p&gt;Como o experimento não foi executado, não existem medições reais a relatar. A tabela abaixo descreve resultados que seriam desejáveis e as evidências que precisariam ser coletadas para verificar a hipótese.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Indicador&lt;/th&gt;
&lt;th&gt;Comportamento de risco esperado antes dos ajustes&lt;/th&gt;
&lt;th&gt;Resultado desejado após os ajustes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Latência da chamada de pagamento&lt;/td&gt;
&lt;td&gt;Espera prolongada devido à dependência lenta&lt;/td&gt;
&lt;td&gt;Chamada limitada pelo timeout configurado&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Uso de threads&lt;/td&gt;
&lt;td&gt;Acúmulo de requisições em espera&lt;/td&gt;
&lt;td&gt;Concorrência limitada pelo Bulkhead&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Circuit Breaker&lt;/td&gt;
&lt;td&gt;Pode demorar a abrir se os critérios forem inadequados&lt;/td&gt;
&lt;td&gt;Abre conforme a configuração e os sinais observados&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Endpoints independentes&lt;/td&gt;
&lt;td&gt;Podem ser afetados pela saturação de recursos compartilhados&lt;/td&gt;
&lt;td&gt;Mantêm desempenho dentro dos objetivos definidos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Processamento do pedido&lt;/td&gt;
&lt;td&gt;Risco de falha ou resposta ambígua&lt;/td&gt;
&lt;td&gt;Estado pendente e processamento posterior, se permitido pela regra de negócio&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Para comprovar esses resultados em um teste real, seria necessário comparar métricas antes, durante e depois da injeção, registrar as configurações usadas e verificar a recuperação após a retirada da falha. Até que isso seja feito, os itens da coluna final devem ser entendidos como objetivos de validação, não como resultados comprovados.&lt;/p&gt;

&lt;h2&gt;
  
  
  5 Conclusão
&lt;/h2&gt;

&lt;p&gt;O cenário simulado demonstra como a Engenharia do Caos pode ajudar a investigar fragilidades em sistemas distribuídos. Uma dependência lenta pode causar efeitos que vão além do componente afetado, especialmente quando novas tentativas, timeouts e limites de concorrência não são coordenados.&lt;/p&gt;

&lt;p&gt;O ChaosEngineeringMasterDeck, entendido aqui como um catálogo conceitual de experimentos, oferece uma maneira organizada de documentar hipóteses, variáveis de injeção, estado estável, raio de explosão e condições de aborto. Esse processo transforma um teste de falha em uma atividade planejada, observável e orientada ao aprendizado.&lt;/p&gt;

&lt;p&gt;Entre os benefícios esperados estão:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Melhor diagnóstico:&lt;/strong&gt; métricas, rastreamento e logs ajudam a localizar gargalos e entender a propagação de falhas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Maior isolamento:&lt;/strong&gt; limites de concorrência e de impacto reduzem a chance de uma falha localizada afetar todo o sistema.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recuperação mais previsível:&lt;/strong&gt; timeouts, Circuit Breakers e tratamentos alternativos podem tornar o comportamento diante de falhas mais controlado.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Colaboração entre desenvolvimento e operações:&lt;/strong&gt; critérios compartilhados aproximam as decisões de arquitetura, monitoramento e resposta a incidentes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esses benefícios dependem de planejamento, implementação correta e validação. O exercício apresentado não comprova que uma arquitetura real tenha resistido ao teste; ele demonstra como um experimento poderia ser estruturado e quais evidências seriam necessárias para avaliar sua eficácia.&lt;/p&gt;

&lt;p&gt;A resiliência não deve ser presumida apenas porque uma aplicação utiliza ferramentas ou padrões conhecidos. Ela precisa ser avaliada por meio de hipóteses claras, observação sistemática e testes seguros, com resultados documentados de forma honesta.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>sre</category>
      <category>testing</category>
    </item>
  </channel>
</rss>
