01
A fila ilimitada é um adiamento, não uma solução
A intuição de que uma fila resolve descompasso de velocidade está certa, mas só para descompasso temporário. Uma fila é um amortecedor: ela absorve a diferença entre produção e consumo durante um intervalo, contando com um período posterior em que o consumidor está mais rápido que o produtor e drena o acúmulo. Se a taxa média de produção é maior que a taxa média de consumo, nenhum tamanho de fila resolve, porque não existe momento de drenagem. A fila só cresce. O que muda com o tamanho é quando o problema aparece, não se ele aparece.
O detalhe cruel é que uma fila crescendo piora ativamente o sistema antes de derrubá-lo. Cada item enfileirado ocupa memória, e em pipeline de IA os itens não são pequenos: carregam o histórico da conversa, o contexto recuperado, os anexos. Mil itens de cem kilobytes são cem megabytes de heap que o coletor de lixo precisa varrer a cada ciclo, e a pressão de GC deixa o consumidor mais lento, o que faz a fila crescer mais rápido, o que aumenta a pressão de GC. O sistema entra numa espiral em que a própria tentativa de absorver a carga é o que reduz a capacidade de processá-la.
E há o custo que ninguém contabiliza: o trabalho enfileirado envelhece. Uma mensagem que espera oito minutos numa fila para depois ser processada gera uma resposta que chega quando o cliente já saiu da conversa, já ligou para o telefone ou já desistiu. Você gastou tokens, gastou tempo de máquina e produziu uma resposta que não vale nada. Processar um item vencido é pior do que tê-lo recusado na entrada, porque a recusa é barata e honesta, enquanto o processamento tardio custa dinheiro e ainda entrega uma experiência ruim.
| Abordagem | O que acontece na sobrecarga sustentada | Como o sistema falha | O que o cliente vê |
|---|---|---|---|
| Fila ilimitada em memória | Heap cresce, GC pressiona, consumo desacelera | Processo morre e perde tudo que estava enfileirado | Sistema fora do ar sem aviso prévio |
| Fila limitada sem política | Fila enche e o enqueue começa a falhar | Erro genérico em ponto arbitrário do código | Falha aleatória, crítico e lote tratados igual |
| Fila limitada com descarte cego | O que chega depois é jogado fora | Perda silenciosa, sem registro do que caiu | Mensagem some sem explicação nem retorno |
| Fila limitada com backpressure declarado | Produtor desacelera, lote é recusado, crítico passa | Degradação anunciada e reversível | Espera estimada ou recusa rápida com retorno claro |