Cortando o custo de API de LLM: medir, rotear e cachear
A fatura triplicou sem o uso triplicar. Como atribuir custo por funcionalidade e quais alavancas realmente rendem, na ordem de retorno.
- Node 22
- Postgres 15
- API de LLM compatível com OpenAI
Webhooks, filas, rate limit e tudo que falha de forma intermitente.
A fatura triplicou sem o uso triplicar. Como atribuir custo por funcionalidade e quais alavancas realmente rendem, na ordem de retorno.
ERROR: deadlock detected — Process 18442 waits for ShareLock on transaction 9912
Dois workers pegando a mesma tarefa é o defeito clássico de fila caseira. A cláusula que resolve, e quando vale trocar o banco por um serviço.
Cron job failed: GET /api/cron/faturas returned 401 Unauthorized
As três opções resolvem agendamento de formas incompatíveis. O critério de escolha, e os quatro erros que aparecem em qualquer uma delas.
RateLimitError: 429 Rate limit reached. Limit: 30000 tokens/min. Try again in 1.28s
Promise.all sobre quinhentos itens não é paralelismo, é um ataque. Como respeitar os dois limites que essas APIs impõem sem serializar tudo.
TypeError: fetch failed { cause: Error: read ECONNRESET (code: ECONNRESET, syscall: read) }
A mensagem do fetch nativo não diz nada sozinha. O erro real está em err.cause, e a causa quase sempre é uma conexão reaproveitada tarde demais.
HTTP 503 Service Unavailable: upstream connect error or disconnect/reset before headers
Repetir na hora piora a queda que você está tentando contornar. As quatro regras que separam um retry útil de um ataque contra o seu próprio fornecedor.
504: GATEWAY_TIMEOUT Code: FUNCTION_INVOCATION_TIMEOUT
Aumentar o maxDuration só empurra a falha para um arquivo maior. A correção é a requisição iniciar o trabalho em vez de executá-lo até o fim.
Webhook signature verification failed: No signatures found matching the expected signature for payload
Todo provedor de webhook entrega pelo menos uma vez, o que significa às vezes duas. A trava que resolve é uma constraint de banco, não um if.