Workflow SDK ganha starts idempotentes com hooks atômicos no start()
Aprofundamento CEVIU
Aprofundamento
O Workflow SDK mudou a forma de iniciar runs com deduplicação. Antes, o padrão era chamar getHookByToken() para ver se já existia dono do token e, só depois, chamar start(). Entre uma chamada e outra havia uma janela, e duas requisições simultâneas podiam passar na consulta e iniciar duas runs. A documentação já tratava isso como uma race condition de start duplicado.
Agora o start() admite a run e reivindica o hook num único passo atômico. O token vem do seu domínio (ID de pedido, de fatura, de importação ou de requisição) e é a chave de idempotência. Exatamente uma run é dona dele. Um start() duplicado lança HookConflictError com o conflictingRunId do dono e nunca vira run. O hook existe desde a admissão, então resumeHook funciona antes de a run executar, e payloads precoces ficam em buffer e são entregues em ordem. Dentro do workflow, createHook({ token }) com o mesmo token se vincula ao hook já reivindicado, sem registrar nada novo, sem adicionar step, e getConflict() resolve para null. Com experimental_minRetention, o token continua indisponível depois do fim da run, contado a partir do start(), e duplicatas tardias seguem recusadas. A atualização é para o workflow 5.3.1.
Por que isso importa
Para quem opera fluxos disparados por webhooks ou filas com reentrega, isso tira da aplicação o código de deduplicação manual e o risco de run duplicada, como cobrança ou importação repetida. Na leitura editorial, o ponto prático é tratar HookConflictError como caminho esperado e, se fizer sentido, rotear o payload duplicado para a run dona do token.
Perguntas frequentes
O que acontece se eu chamar start() duas vezes com o mesmo token?
A segunda chamada lança HookConflictError e nunca se torna uma run. O erro traz o conflictingRunId, que identifica a run dona do token. Assim dá para tratar a duplicata com segurança.
Preciso abrir o hook dentro do workflow para ter idempotência?
Não. O token sozinho já garante que só uma run seja dona dele. Se o workflow nunca abrir o hook, o token serviu só como chave de idempotência e a run termina normalmente.
Posso chamar resumeHook antes de a run começar a executar?
Pode. O hook reivindicado existe desde que a run é admitida. Os payloads enviados antes são guardados em buffer e entregues em ordem.
Como evitar duplicatas que chegam depois de a run terminar?
Defina experimental_minRetention. Ele mantém o token indisponível após o fim da run, contado a partir do start(), então duplicatas tardias continuam sendo recusadas. A versão indicada é a workflow 5.3.1.
Fontes
- vercel.comfonte original
- Categoria
- CEVIU Web Dev
- Publicado
- 04 de novembro de 2026
- Editoria
- CEVIU Web Dev

