docs
workflows
@burand/workflows

Workflows

Um workflow é uma série de passos e ações que, quando combinados, completam uma tarefa específica.
A criação é semelhante à construção de uma função JavaScript, mas com a diferença de que os workflows geram uma representação interna de seus passos.
Esta representação interna oferece vários benefícios, tais como:

  • Monitoramento de progresso: Acompanhe o avanço do workflow em tempo real, identificando etapas concluídas e pendentes.
  • Retentativas automáticas: Em caso de falha em algum passo, o workflow pode ser configurado para realizar tentativas automáticas de reexecução, garantindo a resiliência do processo.
  • Retentativas manuais: Além das tentativas automáticas, o workflow também permite a reexecução manual de etapas específicas, oferecendo flexibilidade para lidar com falhas excepcionais.

A aplicação de workflows abrange um amplo espectro de possibilidades, desde a definição de fluxos com interações em diversos sistemas até a integração de serviços de terceiros em aplicativos comerciais ou a automatização de ações internas.
Em suma, qualquer processo que envolva uma sequência de passos pode ser implementado como um workflow.

Exemplo: Implementando um Workflow Básico

Para ilustrar a criação e utilização de workflows, utilizaremos o pacote @burand/workflows do npm e construiremos um workflow simples que imprime uma mensagem de saudação personalizada.

1. Criando um Passo

Um workflow é composto por uma série de passos, cada um representando uma ação específica. Para criar um passo, utilizaremos a função utilitária createStep.

Crie o arquivo src/workflows/hello-world/steps/helloWorldStep.ts com o seguinte conteúdo:

import { createStep } from "@burand/workflows";
 
import { HelloWorldInput } from "../index.js";
 
const step1 = createStep<HelloWorldInput>("step-1", ({ name }) => {
  console.log(`Hello ${name}!`);
});

Neste código, definimos um passo denominado step-1 que recebe um objeto como entrada, contendo a propriedade name. A função interna do passo simplesmente imprime uma mensagem de saudação personalizada utilizando o valor da propriedade name.

2. Criando um Workflow

Após criar o passo individual, podemos combiná-lo em um workflow utilizando a função createWorkflow:

import { createWorkflow } from "@burand/workflows";
 
import { step1 } from "./steps/helloWorldStep.js";
 
export interface HelloWorldInput {
  name: string;
}
 
export const [helloWorldWorkflow, helloWorldWorker] = createWorkflow<HelloWorldInput>(
  {
    name: "Hello",
    call: "locations/southamerica-east1/functions/helloWorker",
  },
  step1
);

Neste código, criamos um workflow denominado hello-world. O workflow recebe um objeto de entrada com a propriedade name e consiste em um único passo, step-1, definido anteriormente.

É importante destacar que a criação do workflow não implica na sua execução imediata. O workflow é construído, mas permanece em estado inativo até ser explicitamente acionado.

A função createWorkflow retorna um array com duas posições:

  1. Workflow: A primeira posição contém o próprio workflow, que será utilizado para sua execução.
  2. Worker: A segunda posição contém o worker, que é responsável pela execução do workflow na Google Cloud.

Ao nomear workflows e workers, siga as convenções de nomenclatura: utilize o sufixo Workflow para o nome do workflow e o sufixo Worker para o nome do worker.

O primeiro argumento para a função createWorkflow é um objeto contendo as propriedades name e call. A propriedade name define o nome descritivo do workflow, enquanto a propriedade call especifica a referência do worker que executará o workflow na Google Cloud.

3. Executando o Workflow

A execução de um workflow pode ser realizada a partir de diferentes pontos do projeto, como rotas de API, triggers ou cron jobs.

Para executar o workflow, importe a função de sufixo Workflow e invoque-a, passando o payload como parâmetro:

import { helloWorldWorkflow } from "@workflows/index.js";
 
const payload = {
  name: "John",
};
 
await helloWorldWorkflow({
  payload,
});

Neste exemplo, importamos o workflow helloWorldWorkflow e o executamos, fornecendo um payload {"name": "John Doe"}. O payload contém os dados que serão utilizados pelos passos do workflow.