Skip to main content
O Processador de Liquidação de Custos é o estágio final do pipeline de faturamento baseado em uso. Ele lê as janelas de custo que foram despachadas para o Redis pelo Dispatcher de Liquidação de Custos, cria registros CostBatch no banco de dados e reporta o uso agregado ao billing meter externo (ex.: Stripe Billing Meters). Isso fecha o ciclo do faturamento baseado em uso — desde os eventos brutos de custo até o provedor de pagamento. O processador opera com concorrência controlada (5 workers paralelos, buffer de 50) para balancear throughput contra rate limits de APIs externas.
Agendamento: A cada 15-30 minutos, após o dispatcher. O processador usa operações atômicas HGETDEL no Redis para garantir que cada janela de custo seja processada exatamente uma vez — mesmo se duas instâncias do processador executarem simultaneamente.
Monitore compensações de Saga com status FAILED. Se a chamada ao billing meter é bem-sucedida mas a escrita no banco falha, a Saga tentará deletar o evento do billing meter como compensação. Rastreie esses rollbacks na sua stack de observabilidade — compensações repetidas podem indicar um problema de conectividade com o banco que precisa de atenção.

Objetivo

O processador lê janelas de custo despachadas do cache, cria um registro CostBatch, reporta o uso agregado ao billing meter e vincula a referência externa de volta ao lote. Este é o passo final no pipeline de faturamento baseado em uso.

Fluxo

1

Escanear chaves do cache

Listar todas as chaves que correspondem a cost_batch_window_ref:* e filtrar aquelas que terminam com um UUID válido (ignorando chaves de controle).
2

Ler e deletar do cache

Para cada chave, ler atomicamente o hash (quantity, amount) e deletá-lo junto com sua chave de controle via HGETDEL. Isso previne processamento duplicado.
3

Parsear referência da janela

A chave do cache codifica organizationId, customerExternalRef, customerCurrency e eventName. O valor do hash fornece o quantity e amount agregados.
4

Criar CostBatch

Dentro de uma transação, criar um registro CostBatch com um identificador determinístico (hash SHA-256 do windowRef).
5

Reportar ao billing meter

Enviar o uso agregado ao billing meter, passando a referência do cliente, nome do evento, identificador e valor.
6

Vincular referência externa

Salvar o ID do evento do billing meter de volta em CostBatch.externalRef, marcando o lote como liquidado.

Tratamento de Erros

A liquidação executa dentro de uma Saga. Se a chamada ao billing meter é bem-sucedida mas um passo subsequente falha, a Saga compensa deletando o evento do billing meter. Lotes não liquidados permanecem no cache e são retentados na próxima execução.

Agendamento Recomendado

A cada 15-30 minutos, após o dispatcher.