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:
- Workflow: A primeira posição contém o próprio workflow, que será utilizado para sua execução.
- 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.