Cloudflare 中文文档
Workers
Workers
编辑这个页面
跳转官方原文档
Set theme to dark (⇧+D)

渐进式部署

Beta

渐进式部署通过在不同版本之间拆分流量,让你能够渐进式地部署 Workers 的新 版本

渐进部署

通过渐进式部署,你可以

  • 逐步将流量转移到更新版本的 Worker 上。
  • 使用 analytics and logging工具监控各版本的错误率和异常情况。
  • 如果在部署新版本时发现问题,可回滚 到先前的稳定版本。

​​ 使用渐进式部署

以下部分将指导你使用渐进部署的示例。你将选择使用 WranglerCloudflare dashboard

  • 创建新Works。
  • 发布该 Worker 的新版本,而不进行部署。
  • 在两个版本之间建立渐进式部署。
  • 将新版本的部署进度提高到 100% 流量。

​​ 通过 Wrangler

​​ 1. 创建并部署新的 Worker

使用 create-cloudflare CLI (C3) 创建一个新的 Hello World Worker 并进行部署。

回答 yes no 使用 TypeScript。请回答 yes 部署应用程序。这是 Worker 的第一个版本。

​​ 2. 创建新版本的Works

要创建新版本的 Worker,请编辑 Worker 代码,将 Response 内容改为所需文本,然后使用 wrangler versions upload命令上传 Worker。

这将创建一个不会自动部署的新版本 Worker。

​​ 3.创建新的部署

使用wrangler versions upload命令来 创建一个新部署,在两个版本的 Worker 之间分配流量。按照交互式提示,使用 步骤 #1步骤 #2中上传的版本创建部署。为每个版本选择所需的百分比。

​​ 4.测试分拆部署

在 Worker 上运行 cURL 命令来测试拆分部署。

你应该会看到 10 个回复。回复将反映部署中各版本返回的内容。响应将根据 步骤 #3中配置的百分比而有所不同。

你还可以使用 版本覆盖,针对特定版本进行测试。

​​ 5.将新版本设置为 100% 部署

再次运行 wrangler versions deploy 并按照交互式提示操作。选择 [步骤 2] 中上传的版本(/workers/configuration/versions-and-deployments/gradual-deployments/#2-create-a-new-version-of-the-worker),并将其设置为 100% 部署。

​​ 通过 Cloudflare 仪表板

  1. 登录 Cloudflare 仪表板 并选择你的账户。
  2. 转到Workers & Pages
  3. 选择 Create application> Hello World模板 > 部署 Worker。
  4. 部署好 Worker 后,通过编辑代码进入在线代码编辑器。编辑 Worker 代码(更改 Response 内容)并上传 Worker。
  5. 要保存更改,请选择部署> 保存旁边的向下箭头。这将创建一个新版本的 Worker。
  6. 进入 部署,选择 部署版本,创建一个新的部署,在步骤 3 和步骤 5 中创建的两个版本之间分割流量。
  7. cURL 你的 Worker 以测试拆分部署。

你应该会看到 10 个responses。responses将反映部署中各版本返回的内容。响应将根据步骤 #6 中配置的百分比而有所不同。

​​ 版本亲和性

默认情况下,使用渐进部署时配置的百分比是按请求进行操作的,即一个请求调用 [部署] 中两个 Worker 版本之一的概率为 X%(/workers/configuration/versions-and-deployments/#deployments)。

你可能希望与特定标识符(如用户、会话或任何唯一标识符)相关联的请求由统一版本的 Worker 处理,以防止版本偏移。如果部署的应用程序有多个版本,而这些版本之间不能正向/反向兼容,就会出现版本偏移。你可以配置版本亲和性,以防止 Worker 的版本按请求来回变化。

你可以通过在向 Worker 发出的传入请求中设置 Cloudflare-Workers-Version-Key header来做到这一点。例如

对于给定的 部署,版本密钥设置为 foo 的所有请求都将由相同版本的 Worker 处理。版本密钥 foo 所对应的 Worker 具体版本由你在部署中为每个 Worker 版本配置的百分比决定。

你既可以在从互联网向你的 Worker 发出外部请求时设置 Cloudflare-Workers-Version-Key header,也可以在使用 service binding从一个 Worker 向另一个 Worker 发出子请求时设置 Cloudflare-Workers-Version-Key header。

​​ 使用规则集引擎设置 `Cloudflare-Workers-Version-Key

你可能希望从请求的某些属性(如 URL、标题或 cookie)中提取版本密钥。你可以在区域上配置Ruleset Engine规则来实现这一目的。这样,你就可以根据这些属性指定版本亲和性,而无需修改发出请求的外部客户端。

例如,如果你的 Worker 在 URI 路径/assets/下提供视频资产,而你希望通过一致的版本处理对每个唯一资产的请求,那么你可以定义以下 request header modification 规则:

Expression Editor 中的文本:

修改请求header下的选定操作:Set dynamic

Header name: Cloudflare-Workers-Version-Key

Value: regex_replace(http.request.uri.path, "/asset/(.*)", "${1}")

​​ 版本覆盖

你可以使用版本重载向渐进部署中特定版本的 Worker 发送请求。

要在请求中指定版本覆盖,可在向 Worker 发出的请求中设置 Cloudflare-Workers-Version-Overrides 头。例如

Cloudflare-Workers-Version-Overrides 是一个 字典结构header

字典可以包含多个键值对。每个键表示覆盖应适用的 Worker 名称。值表示应使用的版本 ID,必须是 String

只有在当前部署中存在指定版本时,才会应用版本覆盖。当前部署中的版本可使用 wrangler部署列表 --experimental-versions 命令或在 Worker > Deployments > Active Deployment 下的 Workers Dashboard 上找到。

​​ 示例

你可能希望先在生产中测试新版本,然后再逐步将其部署到比例越来越高的外部流量中。

在此示例中,部署的初始配置是将所有流量路由到单一版本:

Version ID Percentage
db7cd8d3-4425-4fe7-8c81-01bf963b6067 100%

使用 wrangler versions deploy --experimental-versions 创建一个新的部署,并为新版本指定 0%,同时将以前的版本保持为 100% 。

Version ID Percentage
dc8dcd28-271b-4367-9840-6c244f84cb40 0%
db7cd8d3-4425-4fe7-8c81-01bf963b6067 100%

现在,先用版本覆盖测试新版本,然后再将新版本逐步升级到 100%:

​​ 渐进式部署耐用对象

由于 全局唯一性,每个 Durable Object 一次只能运行一个版本。这意味着渐进部署对 Durable Objects 的作用略有不同。

当你为 Durable Object Worker 创建新的渐进部署时,每个 Durable Object 实例都会根据你在 部署中配置的百分比分配一个 Worker 版本。在创建新部署之前,该版本不会改变。

渐进部署耐用对象

​​ 示例

本例假定你先前已创建了 3 个耐用对象,并从名称导出了它们的 ID foobar baz

你的 Worker 目前使用的版本我们称之为 A 版,而你希望渐进式部署新的 Worker B 版。

以下是耐用对象版本在渐进式部署过程中可能发生的变化:

Deployment config “foo” “bar” “baz”
Version A: 100%
A A A
Version B: 20%
Version A: 80%
B A A
Version B: 50%
Version A: 50%
B B A
Version B: 100%
B B B

这只是一个示例,因此分配给你的耐用对象的版本可能会有所不同。不过,以下内容是可以保证的:

  • 对于给定的部署,对每个持久对象的请求将始终使用相同的 Worker 版本。
  • 当你以与之前部署相同的顺序指定每个版本,并增加某个版本的百分比时,之前分配给该版本的耐用对象将不会被分配到不同的版本。在此示例中,耐用对象 foo 永远不会从版本 B 恢复到版本 A
  • 只有当持久对象被分配到不同的版本时,它才会被 重置,因此在本例中,每个持久对象只会被重置一次。

​​ 可观察性

在使用渐进式部署时,你可能希望将Works调用归因于特定版本,以便了解部署新版本的影响。

​​ Logpush

Workers Logpush](/workers/observability/logging/logpush/) 中新增了一个 ScriptVersion 对象。现在只能通过 Logpush API 添加 ScriptVersion 对象。示例 API 调用:

ScriptVersion 是一个具有以下结构的对象:

​​ 运行时绑定

使用版本元数据绑定 访问 Worker 中的版本 ID 或版本标记。

​​ Limits

​​ 部署限制

你只能使用最近 10 个上传的 Worker 版本创建新部署。

​​ 不支持的功能

这些Works功能将在不久的将来得到支持。