Desenvolvimento

13 abr, 2016

Como prevenir falhas catastróficas em sistemas distribuídos complexos

Publicidade

Em seu agora famoso documento How Complex Systems Fail, Dr. Richard Cook explica como e por que falhas acontecem em sistemas complexos:

Algumas regras de falha em sistemas complexos

  1. Sistemas complexos contêm misturas de falhas latentes dentro deles. A complexidade desses sistemas torna impossível para eles serem executados sem múltiplas falhas estarem presentes. Pelo fato de elas serem individualmente insuficientes para causar falhas, elas são consideradas fatores menores durante as operações.
  1. Catástrofe exige várias falhas – falhas pontuais não são suficientes. Falha catastrófica aberta ocorre quando pequenas falhas, aparentemente inócuas, juntam-se para criar uma oportunidade de um acidente sistêmico. Cada uma dessas pequenas falhas é necessária para causar uma catástrofe, mas apenas a combinação é suficiente para permitir a falha.
  1. Mudança introduz novas formas de falha. A baixa taxa de acidentes evidentes em sistemas confiáveis ​​pode incentivar mudanças, especialmente o uso de novas tecnologias, para diminuir o número nas falhas de alta frequência, mas de baixa consequência. Essas mudanças talvez possam criar oportunidades para novos acidentes de grandes consequências mas de baixa frequência. Pelo fato de esses novos acidentes de grandes consequências ocorrerem a uma taxa baixa, várias alterações do sistema podem ocorrer antes de um acidente, o que torna difícil ver a contribuição da tecnologia para a falha.

Concluindo: Os sistemas complexos são essencialmente e inevitavelmente frágeis. Podemos tentar, mas não podemos impedi-los de falhar – há muitas peças móveis, muitas variáveis ​​e combinações para compreender e testar. E até mesmo a menor mudança ou erro pode provocar uma falha catastrófica.

Uma nova esperança

Mas uma nova pesquisa da Universidade de Toronto sobre falhas catastróficas em sistemas distribuídos complexos oferece alguma esperança – uma maneira potencialmente simples de reduzir o risco e o impacto dessas falhas.

Os investigadores analisaram sistemas online distribuídos que tinham sido extensivamente revistos e testados, mas mesmo assim falharam de forma espetacular.

Eles descobriram que a maioria das falhas catastróficas foram inicialmente desencadeadas por pequenos erros não fatais: erros de configuração, pequenos bugs, falhas de hardware que deveriam ter sido toleradas. Então, seguindo a regra número 3 acima, uma sequência específica e incomum de eventos teve que ocorrer para a catástrofe se revelar.

A má notícia é que essa sequência de eventos não pode ser prevista – ou testada – com antecedência.

A boa notícia é que as falhas catastróficas em sistemas distribuídos complexos podem ser mais fáceis de resolver do que qualquer um pensava anteriormente. Olhando mais de perto, os pesquisadores descobriram que quase todas (92%) as falhas catastróficas são o resultado da manipulação incorreta de erros não fatais. Esses erros na manipulação de erro fez com que o sistema se comportasse de forma imprevisível, causando outros erros, que nem sempre foram tratados corretamente ou previsivelmente, criando um efeito dominó.

Mais da metade (58%) das falhas catastróficas poderiam ser evitadas por meio de uma cuidadosa revisão e teste de código de manipulação de erro. Em 35% dos casos, as falhas no código de tratamento de erros foram triviais: o manipulador de erro estava vazio, apenas registrava a falha ou a lógica estava claramente incompleta. Erros fáceis de encontrar e corrigir. Tão fáceis que os pesquisadores construíram um verificador de análise estática disponível gratuitamente para código Java, o Aspirator, para capturar muitos desses problemas.

Em outros 23% dos casos, o erro de manipulação lógica de um erro não fatal estava tão errado que um teste básico de cobertura ou uma revisão cuidadosa nos códigos teria capturado os erros.

O próximo desafio que os pesquisadores encontraram foi convencer os desenvolvedores a levar esses erros a sério. Eles tiveram que explicar aos desenvolvedores e fazê-los entender por que pequenos erros no tratamento de erros, erros que “nunca realisticamente acontecem”, necessitam ser corrigidos – e por que manipulação de erro cuidadosa é tão importante.

Esse é um desafio que todos nós precisamos assumir se esperamos evitar uma falha catastrófica em sistemas distribuídos complexos.

***

Jim Bird faz parte do time de colunistas internacionais do iMasters. A tradução do artigo é feita pela redação iMasters, com autorização do autor, e você pode acompanhar o artigo em inglês no link: http://swreflections.blogspot.com.br/2015/08/how-to-prevent-catastrophic-failures-in.html