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.

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

  1. More Details on Today's Outage Facebook Engineering (Wayback Machine snapshot of the original note) · web.archive.org ·
  2. How Facebook fixed the site: they turned it off and on again. Literally The Guardian · theguardian.com ·
  3. Massive Facebook outage caused by improper error handling, not improper Facebook flirting as previously feared Engadget · engadget.com ·