Pular para o conteúdo

Conceitos

Retries, sobrecarga e falhas metaestáveis

Intuição

Imagine um restaurante lotado em que a cozinha atrasa. Os clientes impacientes desistem sem avisar a cozinha e fazem outro pedido, e a cozinha passa a preparar pratos que ninguém mais está esperando; quanto mais atrasa, mais pedidos repetidos chegam, e o atraso piora. Mesmo que o motivo original do atraso já tenha sumido, o restaurante continua afogado, porque a própria reação dos clientes mantém o caos. Repetir o pedido ajuda quando o problema é pequeno e passageiro, mas piora tudo quando a casa já está sobrecarregada.

Como funciona

Uma falha metaestável acontece em sistemas abertos, em que clientes continuam chegando sem que o sistema controle a carga: um gatilho (pico de carga, falha breve, deploy) empurra o sistema para um estado ruim que persiste depois que o gatilho some. O que sustenta esse estado é um efeito sustentador, um ciclo de realimentação que amplifica trabalho e costuma esgotar algum recurso. Para Bronson et al., a causa-raiz é esse ciclo, não o gatilho: gatilhos diferentes levam ao mesmo estado, então tratar só o gatilho previne pouco. As retentativas são o exemplo central: filas crescem, a latência sobe, o cliente estoura o timeout e reenvia, e o servidor gasta capacidade em requisições que ninguém mais espera, ficando ativo porém entregando pouco trabalho útil. Muitos sistemas operam permanentemente em um estado vulnerável, porque operar perto do limite é mais eficiente do que ter folga, e basta uma sobrecarga temporária para disparar o ciclo. Sair do estado costuma exigir ação forte, como reduzir drasticamente a carga ou reiniciar, e não apenas esperar. O Tail at Scale mostra o outro lado: em sistemas com alto fan-out, uma fração pequena de requisições lentas é inevitável e domina a latência final, e por isso a redundância é útil, mas com técnicas desenhadas para limitar a carga extra: em hedged requests, a segunda cópia só é enviada para outra réplica depois de um tempo próximo ao percentil 95 esperado, a primeira resposta vence e a outra é cancelada, o que mantém a carga adicional em poucos por cento; em tied requests, as cópias se cancelam mutuamente nas filas. A diferença entre um retry que ajuda e um que derruba é, portanto, se a redundância é limitada e cancelável ou se cresce sem controle quando o sistema já está lento.

Na prática

Ao desenhar chamadas entre serviços, trate a política de retry como algo que precisa de limites explícitos, junto com controle de admissão e descarte de carga sob sobrecarga, e use hedging apenas com atraso calibrado e cancelamento da cópia redundante. Os papers também sugerem acompanhar sinais precoces, como outliers de latência e percentis altos (p99, p999), nos pontos de convergência de chamadas paralelas. É a lente certa em entrevistas e em revisões de design sempre que a pergunta for o que acontece quando o sistema já está lento e todos os clientes tentam de novo.

Use em um desenho

Pratique na escola de System Design os casos que dependem deste conceito.