Cloudflare Workflows 提供了管理异步、持久化流程的强大方法。通过使用 scheduled 处理程序显式计划任务以及通过 step.sleep 暂停执行,开发者能够构建复杂、具备时间感知的应用。
工作流允许您在不阻塞用户的情况下启动异步处理过程。这在 addInteraction 函数中得到了展示,该函数创建了 INTERACTION 工作流的一个新实例。
在 src/index.tsx 中找到 addInteraction 函数:
当用户与双关语进行交互时(例如点赞),就会调用此函数。它不是直接执行交互逻辑,而是将工作卸载到工作流中执行。
检查 src/workflows/interaction.ts 中的 InteractionWorkflow 定义。此工作流执行诸如检查用户/会话是否存在以及在数据库中记录交互等任务。
后台处理的一个常见用例是处理数据并缓存结果,例如构建排行榜。
检查 src/workflows/leaderboard.ts 中的 LeaderboardWorkflow。此工作流执行数据库查询以查找热门双关语,然后将结果存储在 Cloudflare KV(键值存储)中。
可以计划定期运行此工作流,以更新排行榜数据。
Wrangler 配置文件用于配置您的 Worker 和工作流。这包括定义到 KV 命名空间等资源的绑定,以及设置工作流的计划运行时间。
此项目仓库使用了较旧的模式,即在顶级具有一个 [triggers] 部分,并在主 Worker 中配有 scheduled 处理程序,以便在定时器触发时创建一个 LEADERBOARD_WORKFLOW 实例。
在当前的工作流项目中,您通常可以直接在其绑定上计划工作流:
{
"$schema": "./node_modules/wrangler/config-schema.json",
"workflows": [
{
"name": "leaderboard-workflow",
"binding": "LEADERBOARD_WORKFLOW",
"class_name": "LeaderboardWorkflow",
"schedules": [
"*/30 * * * *"
]
}
]
}[[workflows]]
name = "leaderboard-workflow"
binding = "LEADERBOARD_WORKFLOW"
class_name = "LeaderboardWorkflow"
schedules = ["*/30 * * * *"]仅当您在确定是否创建工作流实例之前需要自定义逻辑时,才使用单独的 Cron 触发器和 scheduled 处理程序。在配置工作流计划时,请使用最新的 Wrangler 版本。
工作流也可以用于更复杂的、多步骤的处理过程,包括与 AI 模型进行交互。PuntificatorWorkflow 就是一个利用 AI 生成和评估新双关语的例子。
检查 src/workflows/puntificator.ts 中的 PuntificatorWorkflow 定义。
此工作流包括以下步骤:
- 检索热门双关语。
- 使用 AI 模型基于趋势创建一个新的双关语。
- 使用另一个 AI 模型评判所创建双关语的质量。
- 如果双关语达到特定的评分阈值,则保存它。
关键的是,此工作流包含一个 step.sleep 调用:
此步骤将工作流的执行暂停指定的持续时间。这在基于已发布双关语的受欢迎程度采取进一步行动之前,等待并考虑用户对该双关语的反馈时非常有用。
工作流可以启动其他工作流,从而允许您将较小的模块化单元组合成复杂的处理流程。
在 PuntificatorWorkflow 中,找到其调用 PUBLISH 工作流的位置。
这展示了一个工作流如何触发另一个工作流,从而实现关注点分离和模块化设计。
检查 src/workflows/publish.ts 中的 PublishWorkflow。
此工作流处理发布双关语的逻辑,通常包括将其保存到数据库中并使其在网站上可见。
您可以使用 wrangler 命令行工具手动触发工作流,并检查其执行状态和输出。
手动触发 PuntificatorWorkflow:
npx wrangler workflows trigger puntificator该命令将对工作流的一个实例进行排队。您将收到成功消息和实例 ID。
描述工作流的最新实例:
npx wrangler workflows instances describe puntificator latest该命令将显示有关指定工作流最近一次运行的详细信息,包括其开始时间、结束时间、持续时间、状态以及工作流内每个单独步骤的状态。您可以观察到诸如 create-new-pun-based-on-trends、judge-pun、save-pun、publish 和 wait-for-publish(显示 'Sleeping' 状态)等步骤。