View on GitHub

manual-da-engenharia-para-codar

Este é o manual para compromissos de "código com" a engenharia.

Teste de Injeção de Falhas

O teste de injeção de falhas é a introdução deliberada de erros e falhas em um sistema para validar e fortalecer sua estabilidade e confiabilidade. O objetivo é melhorar o design do sistema para resiliência e desempenho sob condições intermitentes de falha ao longo do tempo.

Quando Usar

Problema Abordado

Os sistemas precisam ser resilientes às condições que causam interrupções inevitáveis na produção. Aplicações modernas são construídas com um número crescente de dependências; em infraestrutura, plataforma, rede, software de terceiros ou APIs, etc. Tais sistemas aumentam o risco de impacto de interrupções de dependência. Cada componente dependente pode falhar. Além disso, suas interações com outros componentes podem propagar a falha.

Métodos de injeção de falhas são uma forma de aumentar a cobertura e validar a robustez do software e o tratamento de erros, seja no momento da construção ou em tempo de execução, com a intenção de “abraçar a falha” como parte do ciclo de vida do desenvolvimento. Esses métodos auxiliam as equipes de engenharia no projeto e na validação contínua para falhas, contabilizando condições de falha conhecidas e desconhecidas, arquitetura para redundância, emprego de mecanismos de repetição e retrocesso, etc.

Aplicável a

Como Usar

Arquitetura

Terminologia

Fundamentos do Teste de Injeção de Falhas

A injeção de falhas é uma forma avançada de teste em que o sistema é submetido a diferentes modos de falha, e onde o engenheiro de teste pode saber antecipadamente qual é o resultado esperado, como no caso de testes de validação de lançamento, ou em uma exploração para encontrar problemas potenciais no produto, que devem ser mitigados.

Injeção de Falhas e Engenharia do Caos

O teste de injeção de falhas é uma abordagem específica para testar uma condição. Ele introduz uma falha em um sistema para validar sua robustez. A engenharia do caos, cunhada pela Netflix, é uma prática para gerar novas informações. Há uma sobreposição de preocupações e muitas vezes de ferramentas entre os termos, e muitas vezes a engenharia do caos usa injeção de falhas para introduzir os efeitos necessários no sistema.

Passos de Alto Nível

Teste de injeção de falhas no ciclo de desenvolvimento

A injeção de falhas é uma forma eficaz de encontrar bugs de segurança no software, tanto que o Ciclo de Desenvolvimento de Segurança da Microsoft exige fuzzing em todas as interfaces não confiáveis de cada produto e teste de penetração, que inclui a introdução de falhas no sistema, para descobrir vulnerabilidades potenciais resultantes de erros de codificação, falhas de configuração do sistema ou outras fraquezas operacionais de implantação.

A cobertura automatizada de injeção de falhas em um pipeline de CI promove uma abordagem Shift-Left de teste mais cedo no ciclo de vida para possíveis problemas. Exemplos de realização de injeção de falhas durante o ciclo de vida do desenvolvimento:

Teste de injeção de falhas no ciclo de lançamento

Muito parecido com Testes de Monitoramento Sintético, o teste de injeção de falhas no ciclo de lançamento faz parte da abordagem de teste Shift-Right, que usa métodos seguros para realizar testes em um ambiente de produção ou pré-produção. Dada a natureza das aplicações distribuídas baseadas em nuvem, é muito difícil simular o comportamento real dos serviços fora de seu ambiente de produção. Os testadores são incentivados a executar testes onde realmente importa, em um sistema ao vivo com tráfego de clientes.

Os testes de injeção de falhas dependem da observabilidade de métricas e geralmente são estatísticos; Os seguintes passos de alto nível fornecem uma amostra de como praticar injeção de falhas e engenharia do caos:

Teste de injeção de falhas em Kubernetes

Com o avanço do Kubernetes (k8s) como plataforma de infraestrutura, o teste de injeção de falhas em Kubernetes tornou-se inevitável para garantir que o sistema se comporte de maneira confiável no caso de uma falha ou falha. Pode haver diferentes tipos de cargas de trabalho rodando dentro de um cluster k8s que são escritas em diferentes linguagens. Por exemplo, dentro de um cluster K8s, você pode executar um microserviço, um aplicativo web e/ou um trabalho agendado. Portanto, você precisa ter um mecanismo para injetar falhas em qualquer tipo de carga de trabalho rodando dentro do cluster. Além disso, os clusters Kubernetes são gerenciados de forma diferente da infraestrutura tradicional. As ferramentas usadas para teste de injeção de falhas dentro do Kubernetes devem ter compatibilidade com a infraestrutura k8s. Estas são as principais características que são necessárias:

Melhores Práticas e Conselhos

Experimentar na produção tem o benefício de executar testes contra um sistema ao vivo com tráfego real de usuários, garantindo sua saúde ou construindo confiança em sua capacidade de lidar com erros de forma elegante. No entanto, tem o potencial de causar dor desnecessária ao cliente. Um teste pode ter sucesso ou falhar. No caso de falha, é provável que haja algum impacto no ambiente de produção. Pensar sobre o Raio de Explosão do efeito, caso o teste falhe, é um passo crucial a ser realizado previamente. As seguintes práticas podem ajudar a minimizar esse risco:

Frameworks e Ferramentas de Teste de Injeção de Falhas

Fuzzing

Caos

Conclusão

A partir dos princípios do caos: “Quanto mais difícil é perturbar o estado estável, mais confiança temos no comportamento do sistema. Se uma fraqueza é descoberta, agora temos um alvo para melhoria antes que esse comportamento se manifeste no sistema como um todo”.

As técnicas de injeção de falhas aumentam a resiliência e a confiança nos produtos que enviamos. Elas são usadas em toda a indústria para validar aplicações e plataformas antes e enquanto são entregues aos clientes. A injeção de falhas é uma ferramenta poderosa e deve ser usada com cautela. Casos como o apagão global de 30 minutos da Cloudflare, que foi causado devido a uma implantação de código que deveria ser “lançada às escuras”, destacam a importância de limitar o raio de explosão no sistema durante experimentos.

Recursos