Em setembro de 2010, o Facebook ficou fora do ar por aproximadamente duas horas e meia. A equipe de engenharia da empresa, em um raro post-mortem público publicado no mesmo dia pelo diretor de engenharia de software Robert Johnson, classificou-o como a pior queda que o site sofrera em mais de quatro anos. Todos os visitantes, em todas as páginas, recebiam erros até que o site voltasse.
A causa raiz era um sistema automatizado destinado a manter os valores de configuração saudáveis: ele comparava os valores em cache com um armazenamento persistente e substituía tudo o que julgasse inválido. Naquele dia, uma alteração deixou um valor ruim no próprio armazenamento persistente. Todos os clientes viram o valor "inválido" e tentaram repará-lo e, como o reparo exigia consultar um cluster de banco de dados, o cluster foi atingido por centenas de milhares de consultas por segundo.
O tratamento de erros piorou a situação. Quando a consulta de um cliente falhava, ele interpretava a falha como "valor ainda inválido" e excluía a chave de cache correspondente — gerando mais uma consulta de reparo. Mesmo depois de o valor ruim original ser corrigido, o ciclo continuava a se alimentar. A única saída foi interromper todo o tráfego para o cluster de banco de dados, o que significou desligar o site por completo, deixar os bancos de dados se recuperarem e então permitir que os usuários voltassem lentamente.
Site totalmente fora do ar por cerca de 2,5 horas — os próprios engenheiros do Facebook classificaram como a pior queda em mais de quatro anos
O verificador presumia que o armazenamento persistente estava sempre correto; quando ele continha o valor ruim, todos os clientes recebiam a mesma instrução de reparo envenenada.
O tratamento de erros confundia "banco de dados sobrecarregado" com "valor inválido", de modo que cada falha gerava mais carga — um ciclo de retroalimentação amplificador.
A exclusão de chaves de cache em caso de erro removeu a única camada que poderia ter absorvido a tempestade de novas tentativas.
Não havia disjuntor entre os clientes e o cluster, então a única alavanca restante era o desligamento total do site.
A lição
Código autorreparável que trata todo erro como "vá corrigir" amplifica falhas em vez de absorvê-las. Limite as novas tentativas por cliente, amorteça os ciclos de retroalimentação e mantenha uma alavanca de recuperação que não exija o desligamento total.
O Facebook desativou o sistema de configuração autocorretivo no mesmo dia e disse que o estava redesenhando com base em padrões que toleram picos transitórios e ciclos de retroalimentação. O serviço foi totalmente restaurado naquele dia e a empresa, então a maior rede social do mundo, publicou os detalhes técnicos em poucas horas. O incidente ainda é citado como um caso clássico de tratamento de erros que transforma uma pequena falha em uma tempestade autossustentável.
CONFIRA AS EVIDÊNCIAS
As fontes
- More Details on Today's Outage Facebook Engineering (Wayback Machine snapshot of the original note) · web.archive.org ·
- How Facebook fixed the site: they turned it off and on again. Literally The Guardian · theguardian.com ·
- Massive Facebook outage caused by improper error handling, not improper Facebook flirting as previously feared Engadget · engadget.com ·