01
O timeout do cliente não interrompe o trabalho do servidor
A primeira coisa a entender é que timeout é uma decisão do lado que espera, não do lado que trabalha. Quando o cliente estoura três segundos e fecha a espera, o que acontece na prática é que ele para de ler a resposta. A consulta continua rodando no banco, a transação continua segurando o lock, o pool continua com a conexão ocupada, o handler continua alocando memória. Do ponto de vista do servidor, nada mudou: ele ainda está processando um pedido que já não tem destinatário. Esse trabalho órfão é a matéria-prima da cascata, porque ele consome recurso e não produz nem sucesso nem erro visível.
A consequência prática aparece na aritmética. Suponha um endpoint que normalmente responde em duzentos milissegundos, com timeout de cliente em três segundos e uma tentativa extra. Sob degradação, a resposta passa a levar oito segundos. O cliente desiste aos três, tenta de novo, e a segunda tentativa também desiste aos três. Ao fim de seis segundos, o cliente reporta falha e o servidor está com duas execuções vivas do mesmo pedido, ambas destinadas ao descarte. Se o volume de entrada for de mil requisições por segundo, o servidor não está processando mil, está processando algo entre duas e três mil, precisamente enquanto tenta se recuperar do que causou a lentidão inicial.
SEM PROPAGACAO DE CANCELAMENTO
cliente |--espera 3s--|X (desiste, tenta de novo)
|--espera 3s--|X (desiste, reporta erro)
servidor |=========trabalho 1 (8s, orfao apos 3s)=========|
|=========trabalho 2 (8s, orfao)=========|
^ a partir daqui o servidor
processa 2x a carga real
e nenhum dos dois resultados
tem quem receba
COM PROPAGACAO DE CANCELAMENTO
cliente |--espera 3s--|X
servidor |==trabalho 1==|X <- abortado junto, libera conexao e lockVale nomear o efeito com precisão, porque ele costuma ser confundido com sobrecarga comum. Sobrecarga é quando chega mais tráfego do que a capacidade. Aqui a carga externa não mudou: o que aumentou foi a carga interna gerada pelo próprio mecanismo de tolerância a falha. O sistema está se atacando com o comportamento que existia para protegê-lo, e por isso a lentidão inicial de quarenta segundos vira um incidente de vinte minutos: mesmo depois de o banco se recuperar, a fila de trabalho acumulada e as tentativas em voo mantêm a saturação por conta própria.