Workflows 可用于处理批量数据,确保批处理中的每个项目都通过包含可靠执行的确定流程。本节以 Punderful 应用程序为例,演示如何处理一批双关语(puns)。
Punderful 应用程序通过执行内容审核、创建嵌入、分类并将其添加到向量存储库中,来处理用户提交的双关语。此过程被定义为一个工作流(Workflow)。为了处理一批现有的双关语(来自名为 OPun 的开源数据集),我们创建了一个批处理端点,该端点遍历所有双关语并为每一个双关语触发定义好的工作流。
以下代码片段显示了负责批处理的端点:
此代码:
- 从 JSON 文件 (
puns.json) 中获取双关语列表。 - 记录正在处理的双关语数量。
- 设置用于跟踪的用户 ID。
- 循环遍历每个双关语。
- 对双关语执行基本的文本清理工作。
- 将双关语插入到数据库中(由
insertPun处理)。 - 使用
c.env.PUBLISH.create()为每个双关语触发PUBLISH工作流。工作流实例使用crypto.randomUUID()来分配唯一的 ID。
Cloudflare Wrangler CLI 提供了用于监控和管理工作流及其实例的命令。
列出与您的账户关联的可用工作流:
npx wrangler workflows list列出特定工作流的实例(例如,publish 工作流):
npx wrangler workflows instances list publish该命令将显示工作流实例列表、它们的状态(已排队、运行中、已完成、发生错误)以及时间戳。
要查看特定工作流实例的详细信息,包括其步骤和步骤状态、持续时间及输出:
npx wrangler workflows instances describe publish <instance-id>将 <instance-id> 替换为 list 命令输出中正在运行或已完成实例的实际 ID。
详细说明一个工作流实例将提供其执行过程的详细分解:
Workflow Name: publish
Instance ID: oPun-batch-aea07d75-95fa-448f-9573-6e435388eff7
Version ID: 75665fce-24a1-4c83-a561-088aabc91e5f
Status: Completed
Trigger: API
Queued: 10/24/2024, 1:43:45 AM
Success: Yes
Start: 10/24/2024, 1:43:45 AM
End: 10/24/2024, 1:43:49 AM
Duration: 4 seconds
Last Successful Step: update-status-to-published-1
Steps:
Name: content-moderation-1
Type: Step
Start: 10/24/2024, 1:43:45 AM
End: 10/24/2024, 1:43:45 AM
Duration: 0 seconds
Success: Yes
Output: "true"
Config: {"retries":{"limit":5,"delay":1000,"backoff":"exponential"},"timeout":"10 minutes"}
Attempts:
Status: Completed
Start Time: Oct 23, 2024 6:44:57 PM
End Time: Oct 23, 2024 6:44:57 PM
Wall Time: 180 ms
... (其他步骤如 create-pun-embedding-1、categorize-pun-1、add-embeddings-to-vector-store-1、update-status-to-published-1)此输出显示工作流实例中每个步骤的状态、开始/结束时间、持续时间、成功状态,甚至包括输出和配置信息。
您也可以直接在 Cloudflare 仪表板中监控工作流及其实例。
此仪表板视图提供了一种直观友好的方式来观察您的批处理作业的进度,识别失败的实例,并检查每个步骤的执行细节。
观看第 1 集:理解 Cloudflare Workflows
在本集中,我们将介绍 Cloudflare Workflows。它提供持久执行功能,允许开发者创建在后台运行且可靠、可重复的工作流。
观看第 2 集:监控与批量处理你的网站数据
在本集中,我们将介绍如何使用 Workflows 处理批量数据,确保批处理中的每个项目都通过包含可靠执行的确定流程。
观看第 3 集:使用 Cron 触发器开发基于时间感知的应用
在本集中,我们将回顾 Workflows 使用 Cron 触发器显式计划任务以及使用 `step.sleep` 暂停执行的能力,这允许开发者构建复杂的、时间感知的应用程序。