Fluxo de Trabalho & Entrega de Eventos · Sete Lagoas Transportes LTDA

Orquestração de Ciclos de Avaliação

O motor de avaliação de desempenho dentro de uma plataforma de RH interna. Ativar um ciclo tranca sua lista de participantes, transiciona cada avaliação dependente e enfileira as notificações dos avaliadores em uma única transação — e então um relay as entrega depois, com retentativas, em vez de enviar qualquer coisa dentro da requisição que as originou.

Em Produção
Resultados
Relay de outbox transacionalEntrega
FOR UPDATE SKIP LOCKEDReivindicação
Índice único parcialDeduplicação
Cinco tentativas, backoff limitadoRetentativas
Arquitetura
Requisição de Dispatch connects to Autenticação. Autenticação connects to Transação de Dispatch via Verificação de papel e política. Transação de Dispatch connects to Ciclo → Ativo. Transação de Dispatch connects to Avaliações → Pendentes. Ciclo → Ativo connects to Eventos do Outbox via Mesma transação. Avaliações → Pendentes connects to Eventos do Outbox. Eventos do Outbox connects to Relay do Outbox via Reivindicado um por vez. Relay do Outbox connects to Avaliador Notificado. Relay do Outbox connects to Retentar ou Falhar via Até cinco tentativas.
Notas de Engenharia

O dispatch é uma única transação. Um lock de linha no ciclo recusa a transição se ele não estiver mais em rascunho, o ciclo e cada avaliação dependente mudam de estado juntos, e as notificações dos avaliadores são gravadas em um outbox no mesmo commit — de modo que uma queda no meio do dispatch não deixa nem um ciclo meio ativado nem uma notificação sem a mudança de estado por trás dela.

Nada é entregue dentro da requisição. Um relay consulta o outbox e reivindica trabalho em uma única instrução — um CTE que seleciona uma linha elegível com FOR UPDATE SKIP LOCKED, marcando-a como em processamento e incrementando a contagem de tentativas na mesma ida ao banco — então workers concorrentes não se bloqueiam nem processam o mesmo evento duas vezes.

A deduplicação é uma restrição do banco, não lógica de aplicação. Um índice único parcial sobre tenant, tipo de evento, agregado e o id do avaliador lido de dentro do payload JSONB torna impossível inserir uma notificação de dispatch duplicada, faça o código chamador o que fizer.

A falha é limitada e legível. Um evento é retentado até cinco vezes com backoff limitado a cinco minutos, carrega o último erro na própria linha e termina em um estado final de falha em vez de girar para sempre — enquanto seu carimbo de disponibilidade funciona como o relógio de visibilidade adiada pelo qual o relay ordena a fila.

Toda tabela do pipeline é delimitada por tenant via chave estrangeira, e a consulta de reivindicação é servida por um índice exatamente sobre as colunas que ela filtra e ordena.

Traces e métricas são exportados via OTLP, com um middleware que atribui os spans ao usuário, ao tenant e ao papel que fizeram a requisição — e os normaliza para o padrão de rota correspondente em vez do caminho bruto, mantendo os nomes de span com baixa cardinalidade.

Tecnologias Principais
TypeScriptNode.jsExpressPostgreSQLOpenTelemetrybetter-authReactDocker