01
Timeout por etapa esconde o estouro da cadeia
Quando cada etapa da cadeia define o próprio timeout sem olhar para as outras, a matemática trai. Retrieval com timeout de dez segundos, rerank com cinco, chamada ao modelo com sessenta, validação com dez: nenhum número parece absurdo, e a soma é oitenta e cinco segundos de pior caso para uma requisição que o cliente esperava em cinco. O pior caso parece raro até o dia em que o provedor do modelo degrada e todas as chamadas passam a encostar no próprio limite ao mesmo tempo. Nesse dia, a cadeia inteira anda no pior caso, o p99 da requisição vira a soma dos p99 das etapas, e o atendimento trava sem que nenhuma etapa individual tenha tecnicamente falhado. O timeout por etapa responde à pergunta errada: ele limita quanto cada peça pode demorar, quando a pergunta que importa é quanto a requisição inteira pode demorar.
A inversão correta é começar pelo orçamento da requisição e derivar os limites das etapas dele. O cliente tolera oito segundos? Esse é o orçamento total, e ele é gasto conforme a cadeia anda: se o retrieval consumiu três segundos, a chamada ao modelo não tem mais os sessenta do seu timeout local, tem os cinco que sobraram. Cada etapa recebe um deadline, um instante absoluto no relógio em que a resposta precisa existir, e calcula o próprio limite como a diferença entre o deadline e o agora. Uma etapa que recebe um deadline já vencido nem executa: falha rápido ou aciona a degradação, em vez de gastar tempo produzindo um resultado que chegará tarde demais. O deadline transforma um conjunto de timeouts locais desconectados num contrato único que a cadeia inteira respeita.
| Abordagem | Como limita | O que quebra |
|---|---|---|
| Timeout por etapa | Cada chamada tem limite próprio e isolado | A soma dos piores casos estoura o prazo do cliente sem nenhuma etapa falhar |
| Timeout global sem propagação | Um relógio na borda derruba tudo no fim | A cadeia trabalha até o fim e joga tudo fora; nada degrada no meio |
| Orçamento com deadline propagado | Cada etapa herda o tempo que sobrou | Exige passar deadline e signal por toda a cadeia, inclusive nas libs |