CEVIU Logo
Voltar
Como implementamos rollbacks baseados em saga no Cloudflare Workflows

Como implementamos rollbacks baseados em saga no Cloudflare Workflows

Aprofundamento CEVIU

Aprofundamento

O Cloudflare Workflows agora suporta rollbacks baseados no padrão saga de forma nativa, lançado após a atualização da versão 2 em maio de 2026. A implementação exige que o desenvolvedor passe um objeto de opções como terceiro argumento em step.do(), contendo uma função assíncrona em rollback, que recebe ctx, output (pode ser undefined se a etapa falhou antes de retornar) e error. Essa função é executada automaticamente em ordem inversa de início (não de conclusão) quando o workflow falha terminalmente, mesmo se a etapa falhosa tiver registrado um handler.

O rollback não é acionado por erros capturados localmente: só dispara se o workflow inteiro termina com falha. Os handlers são idempotentes por design, exigem uso de chaves de idempotência em sistemas externos (como provedores de pagamento) e suportam configurações próprias de retries (com limit, delay e backoff) e timeout. O status do rollback aparece como 'running' na API Workers e gera eventos específicos no painel de análise do Cloudflare.

Por que isso importa

Antes dessa atualização, equipes tinham de construir lógica de compensação manualmente, rastreando estados, orquestrando desfazimentos e lidando com falhas parciais fora do fluxo declarativo do workflow. Isso aumentava complexidade, risco de inconsistências e tempo de desenvolvimento. Agora, o padrão saga está integrado ao ciclo de vida nativo do Workflows, alinhando a ação primária e sua compensação no mesmo ponto de definição do código. Isso reduz a necessidade de estado externo para controle de rollback e melhora a confiabilidade em cenários críticos como transferências bancárias, reservas de estoque e provisionamento de infraestrutura distribuída.

Impacto para desenvolvedores

Desenvolvedores em Node.js ou TypeScript usam o novo recurso com sintaxe clara: step.do('nome', async () => {...}, { rollback: async ({ ctx, output, error }) => {...} }). Não há mudança na semântica de execução: step.do() ainda inicia imediatamente a etapa, mantendo compatibilidade com pipelining de promises. A ordem de execução dos rollbacks é previsível, baseada em ordem de início, não de conclusão, o que evita surpresas em workflows paralelos. A exigência de idempotência não é opcional: é uma garantia necessária, pois o sistema pode reexecutar handlers em caso de falha durante o próprio rollback. A visibilidade via eventos e status na API permite monitoramento programático e integração com alertas.

Perguntas frequentes

O que é o padrão saga no Cloudflare Workflows?

É um mecanismo nativo que permite definir, para cada etapa de um workflow, uma ação de compensação (rollback) que será executada automaticamente se o workflow falhar terminalmente. Cada step.do() pode receber um objeto com a propriedade 'rollback', uma função assíncrona que recebe ctx, output e error. O padrão é usado para manter consistência em transações distribuídas, como transferências entre bancos ou reservas de estoque.

Quando o rollback é executado no Cloudflare Workflows?

Apenas quando o workflow falha de forma terminal, ou seja, quando nenhuma parte do código captura e trata o erro, levando à interrupção final do processo. Erros capturados com try/catch não acionam rollback imediatamente. Se o workflow continuar e falhar depois, os handlers já registrados são executados em ordem inversa de início da etapa.

Como configurar retries e timeout para um rollback no Cloudflare Workflows?

O objeto de opções passado para step.do() pode conter 'rollbackConfig', com propriedades como 'retries' (objeto com 'limit', 'delay' e 'backoff') e 'timeout'. Essas configurações aplicam-se exclusivamente à execução do handler de rollback, independentemente das configurações da etapa principal.

Por que o rollback usa ordem inversa de início e não de conclusão?

Para garantir previsibilidade em workflows paralelos. Como etapas concorrentes podem terminar em ordens diferentes daquelas em que foram iniciadas, usar a ordem de início evita dependências ocultas e garante que compensações sejam executadas na sequência lógica esperada, por exemplo, liberar estoque antes de reembolsar o cartão, mesmo que o reembolso tenha terminado primeiro.

Fontes

Avalie este artigo:
Compartilhar:
Categoria
CEVIU DevOps
Publicado
29 de junho de 2026
Editoria
CEVIU DevOps

Quer receber mais sobre CEVIU DevOps?

Conteúdo curado diariamente, direto no seu e-mail.

Conteúdo curado diariamenteDiversas categoriasCancele quando quiser