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çãoO 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.