跳转到内容
搜索文档

Workflows 简介

最后更新 查看 MarkdownAgent 设置

Cloudflare Workflows 提供持久执行功能,允许开发者创建在后台运行的可靠、可重复的工作流。即使底层计算发生故障,Workflows 也被设计为能够恢复执行,确保任务最终完成。它们构建在 Cloudflare Workers 之上,并自动处理扩展和资源筹备。

Workflows 由事件触发,例如从队列中消费的事件通知、HTTP 请求、另一个 Worker,甚至是计划定时器。Workflow 中的各个步骤被设计为可重试的工作单元。状态在各步骤之间持久化,允许工作流在失败后从上一个成功的步骤继续执行。Workflows 会自动为每个步骤生成指标,有助于调试和可观测性。

Punderful 是一个示例应用程序,展示了如何使用各种 Cloudflare 基元,包括 Workers、D1、Vectorize、Workers AI 和 Workflows。该应用程序显示存储在 D1 数据库中的双关语列表。

首页列出了存储在 D1 中的最新双关语。该应用程序还包括由 Vectorize 提供支持的语义搜索功能。要执行搜索:

  1. 前往 Punderful 搜索页面。
  2. 在“Search for a pun...”输入框中输入搜索词。
  3. 观察搜索结果立即显示在搜索框下方。

为了演示添加新的双关语:

  1. 前往 Punderful 创建页面。
  2. 在“Enter your pun here...”文本区域中输入一个新的双关语。
  3. 观察您输入时双关语预览的实时更新。
  4. 单击“Submit Pun”按钮。

当提交一个新的双关语时,它需要被索引到 Vectorize 中,以便语义搜索能够正常工作。该索引过程包括从双关语文本中创建嵌入 (embeddings)。这是一个非常适合使用 Cloudflare Workflows 进行后台处理的任务,从而避免在请求-响应循环中给用户带来延迟。

实现工作流以处理新的双关语

已实现一个工作流,用来处理提交新双关语时所需的后台处理任务。

触发工作流

当通过 /api/puns 端点提交新的双关语时,数据首先被插入到 D1 数据库中。然后,创建并触发一个新的 Workflow 实例以执行随后的后台任务。

参见此处 ↗

在此处理程序中,c.env.PUBLISH.create(crypto.randomUUID(), { punId, pun: payload.pun }) 创建了一个绑定为 PUBLISH 的工作流新实例,为其分配一个唯一 ID,并将 punId 和 pun 文本作为有效负载 (payload) 传入。

定义 Workflow 类

工作流逻辑定义在一个继承自 WorkflowEntrypoint 的类中。

参见此处 ↗

run 方法是工作流执行的入口点。它接收包含有效负载的 event 以及一个用于定义各个持久步骤的 step 对象。

工作流步骤

工作流中的每个离散且可重试的任务都使用 await step.do() 定义。

内容审核

(可选)如果环境中存在 API 密钥,工作流可以使用外部服务(如 OpenAI 的审核 API)来执行内容审核。

参见此处 ↗

此步骤调用 OpenAI 审核 API。如果内容被标记为不当内容,数据库中的双关语状态将被更新,并抛出 NonRetryableError。抛出 NonRetryableError 可以防止工作流重试此步骤,因为该内容已被永久判定为不当内容。

创建嵌入 (Embeddings)

接下来,使用 Workers AI 模型为双关语文本创建向量嵌入。

参见此处 ↗

此步骤使用 Workers AI 的 @cf/baai/bge-large-en-v1.5 模型来为双关语 (pun) 文本生成向量嵌入。结果(嵌入向量)将由该步骤返回,并可供后续步骤使用。step.do() 确保此步骤在失败时将进行重试,从而保证最终能成功创建嵌入。

对双关语进行分类

(可选)使用 Workers AI 语言模型对双关语进行分类。

参见此处 ↗

此步骤使用 @cf/meta/llama-3.1-8b-instruct 模型与特定的系统提示词来为该双关语生成类别。生成的类别字符串将由该步骤返回。此步骤同样受益于 step.do() 的可靠性。

将嵌入添加到 Vectorize

将创建的双关语嵌入(以及可能生成的类别嵌入)插入到 Vectorize 数据库中。

参见此处 ↗

此步骤使用 this.env.VECTORIZE.upsert() 将生成的嵌入和关联元数据添加到 Vectorize 数据库中。这使得该双关语能够被语义化搜索。step.do() 确保这个关键的索引步骤能够可靠地完成。

更新数据库状态

最后一步更新 D1 数据库中该双关语的状态,以表示它已被发布并被工作流处理。

参见此处 ↗

此步骤将对应双关语 ID 在 D1 数据库中的 status 列更新为 "published"。一旦此步骤完成,双关语即被视为完全处理完毕,并准备好显示在主页上。

工作流绑定

为了使 PublishWorkflow 类能够被主 Worker 访问并提供所需资源(如 D1、AI、Vectorize)的访问权限,需要在 Wrangler 配置文件中配置绑定。

参见此处 ↗

此配置定义了一个名为 publish 的工作流,将其绑定到环境变量 PUBLISH,并将其链接到 src/index.ts 中的 PublishWorkflow 类。它还展示了 Workers AI (AI) 和 Vectorize (VECTORIZE) 的绑定,这些绑定在工作流中可以通过 this.env 进行访问。

用于语义搜索的 Vectorize

Vectorize 是此应用程序中用于启用双关语语义搜索的向量数据库。它存储由 Workers AI 创建的向量嵌入。搜索功能通过查询此 Vectorize 索引来查找与用户查询含义相似的双关语。

主页上显示最近发布的双关语(状态为 "published")。特定双关语的详细信息页面会显示“相似的双关语”,这些相似的双关语是通过使用当前双关语的向量嵌入查询 Vectorize 来获取的。

可扩展性

Cloudflare Workers 和 Workflows 被设计为根据需求自动扩展,无需手动配置资源即可高效处理并发请求和后台任务。

这篇文档对您有帮助吗?