Cloudflare 工作流体验
cloudflare 又又又又有新玩意可以玩了,这不得马上试试。
Cloudflare Workers 的持久执行引擎
先看官方文档介绍:workflows
工作流是一个基于 Cloudflare Workers 的持久执行引擎。工作流允许你构建多步骤应用程序,这些应用程序可以自动重试、 持久化状态并运行数分钟、数小时、数天或数周。Workflows 引入了一种编程模型,可以更轻松地构建可靠、长期运行的任务,观察任务的进展情况,并根据服务中的事件以编程方式触发实例。
那跟着他的指南试试
新手入门
工作流允许你使用 Workers 平台构建持久的多步骤应用程序。工作流可以自动重试、持久状态、运行数小时或数天,并在第三方 API 之间进行协调。
你可以建立工作流程,对上传到 R2 对象存储空间的文件进行后处理,自动生成 Workers AI 嵌入到 Vectorize 矢量数据库,或使用你最喜欢的电子邮件 API 触发用户生命周期电子邮件。
本指南将指导你完成以下操作:
- 定义你的第一个工作流程并发布它
- 将工作流程部署到你的 Cloudflare 帐户
- 运行(触发)你的工作流程并观察其输出
在本指南结束时,你应该能够编写、部署和调试自己的工作流应用程序。
前提条件
- 有cloudflare账户
- 安装了Node.js
1. 定义你的工作流
要创建第一个工作流,请使用create cloudflare CLI 工具,指定工作流启动模板:
npm create cloudflare@latest workflows-starter -- --template "cloudflare/workflows-starter"
这将创建一个名为 workflows-starter 的新文件夹。在文本编辑器中打开 src/index.ts 文件。该文件包含以下代码,是工作流定义的最基本实例:
如果创建失败,很可能是克隆模板仓库失败,直接去 https://github.com/cloudflare/workflows-starter 下载,然后删除./git 目录就可以了
import { WorkflowEntrypoint, WorkflowStep, WorkflowEvent } from 'cloudflare:workers';
type Env = {
// 在这里添加你的绑定,例如Workers KV、D1、Workers AI 等
MY_WORKFLOW: Workflow;
};
// 传递到你的工作流的用户定义参数
type Params = {
email: string;
metadata: Record<string, string>;
};
export class MyWorkflow extends WorkflowEntrypoint<Env, Params> {
async run(event: WorkflowEvent<Params>, step: WorkflowStep) {
// 可以访问 `this.env` 上的绑定
// 可以访问`event.params`上的参数
const files = await step.do('my first step', async () => {
// 从 $SOME_SERVICE 获取文件列表
return {
inputParams: event,
files: [
'doc_7392_rev3.pdf',
'report_x29_final.pdf',
'memo_2024_05_12.pdf',
'file_089_update.pdf',
'proj_alpha_v2.pdf',
'data_analysis_q2.pdf',
'notes_meeting_52.pdf',
'summary_fy24_draft.pdf',
],
};
});
const apiResponse = await step.do('some other step', async () => {
let resp = await fetch('https://api.cloudflare.com/client/v4/ips');
return await resp.json<any>();
});
await step.sleep('wait on something', '1 minute');
await step.do(
'make a call to write that could maybe, just might, fail',
// 定义重试策略
{
retries: {
limit: 5,
delay: '5 second',
backoff: 'exponential',
},
timeout: '15 minutes',
},
async () => {
// 在这里做一些事情,可以访问我们之前步骤中的状态
if (Math.random() > 0.5) {
throw new Error('API call to $STORAGE_SYSTEM failed');
}
},
);
}
}
工作流程定义:
- 1.定义一个run方法,该方法包含工作流的主要逻辑。
- 2.至少有一个或多个对
step.do的调用,该调用封装了工作流的逻辑。 - 3.(可选)允许
step返回状态,这样即使后续step失败,工作流也能继续执行,而无需重新运行之前的所有step。
单个 Worker 应用程序可以包含多个工作流定义,只要每个工作流都有唯一的类名。这对于代码重用或定义概念上彼此相关的工作流程非常有用。 每个工作流在其他方面都是完全独立的:一个定义多个工作流的 Worker 与一组各自定义一个工作流的 Worker 没有什么不同。
2.创建你的工作流step
工作流中的每个step都是一个独立的可重试函数。
step是工作流的强大之处,因为你可以在工作流从一个step到另一个step的过程中封装错误并持久化状态,从而避免应用程序在失败时从头开始,并最终构建出更可靠的应用程序。
step可以执行代码 (step.do) 或休眠工作流 (step.sleep)。- 如果
step失败(引发异常),将根据你的重试逻辑自动重试。 - 如果
step成功,任何它返回的状态将保留在工作流程中。
最基本的step如下所示:
// Import the Workflow definition
import { WorkflowEntrypoint, WorkflowEvent, WorkflowStep } from "cloudflare:workers"
type Params = {}
// 创建你自己的实现工作流的类
export class MyWorkflow extends WorkflowEntrypoint<Env, Params> {
// 定义一个 run() 方法
async run(event: WorkflowEvent<Params>, step: WorkflowStep) {
// 定义一个或多个可选择返回状态的`step`。
let state = step.do("my first step", async () => {
})
step.do("my second step", async () => {
})
}
}