跳转到内容
搜索文档

百分比部署

最后更新 查看 MarkdownAgent 设置

百分比部署使您可以向一小部分用户逐步发布某项功能。任何目标定位规则都可以包含介于 0 和 100 之间的部署百分比。

当您希望限制影响范围 (blast radius)、运行实验或对请求进行采样而无需部署新代码时,请使用百分比部署。

百分比部署如何工作

当一条规则具有百分比部署时,只有在该规则条件和部署分桶均匹配时,该规则才会提供其变体。不匹配该规则的上下文会继续到下一条规则,或者如果后续没有匹配的规则,则接收默认变体。

例如,一条规则可以定位 enterprise 计划中的用户,然后只向这些用户的 10% 提供新体验。不在这 10% 内的用户将继续进入规则列表的其余部分。

{
	"priority": 1,
	"conditions": [
		{ "attribute": "plan", "operator": "equals", "value": "enterprise" }
	],
	"serve_variation": "on",
	"rollout": {
		"percentage": 10,
		"attribute": "userId"
	}
}

当百分比部署提供变体时,评估详细信息中的 reasonSPLIT

粘性分桶 (Sticky bucketing)

Flagship 使用对可配置属性的一致性哈希将用户分配到部署存储桶 (rollout bucket)。对于给定的部署配置,同一用户始终接收相同的标志值。这确保了跨重复评估的一致体验。

默认情况下,分桶属性是 targetingKey。您可以在仪表板中设置部署时配置要用于分桶的属性。

部署分桶在账户和标志之间是独立的。相同的标识符可能由于不同的标志而落入不同的存储桶,这有助于避免不相关功能之间的关联部署。

根据应保持稳定的内容选择分桶属性:

用例 建议属性
面向用户的发布 稳定的用户 ID 或 targetingKey
账户级别的部署 账户 ID
组织级别的部署 组织或工作区 ID
请求级别的采样 请求 ID 或其他每个请求专属的值

对于大多数功能发布和实验,请使用稳定的用户或账户标识符。仅当在请求之间发生变化是可以接受的(例如流量采样)时,才使用请求级别的值。

常见的部署模式

逐步部署

从较小规模的部署开始,监控您的应用程序,然后随着信心的增长而增加百分比。

  1. 以 5% 的部署规模创建标志。
  2. 监控错误、延迟、产品指标和用户反馈。
  3. 增加到 25%,然后到 50%,最后到 100%。
  4. 在部署达到 100% 后,移除临时目标定位规则并使获胜变体成为默认变体。
  5. 功能完全发布后,删除旧代码路径并删除该标志。

定向部署加百分比部署

假设有一个具有以下规则的标志 new-checkout

  1. 规则 1plan equals "enterprise" — 提供变体 on
  2. 规则 2:在 userId 上的 25% 部署 — 提供变体 on
  3. 默认变体off

在此配置中:

  • 所有企业用户都会看到新的结账流程。
  • 其他所有用户的 25%(由其 userId 决定)也会看到新的结账流程。
  • 其余 75% 的非企业用户看到标准的结账流程。

随着信心的增加,提高部署百分比,直到达到 100%。

A/B/n 测试

对于没有任何受众条件的纯 A/B/n 测试,请在 Cloudflare 仪表板中配置每个变体的流量份额。仪表板会为您计算累积阈值。

如果您直接通过 API 管理纯 A/B/n 测试,请为每个变体创建一个带累积部署百分比的规则。Flagship 按照优先级顺序评估规则。如果上下文与规则匹配,但未落入该规则的部署百分比内,则评估将继续进行到下一条规则。

在变体 A、B 和 C 之间以 30% / 40% / 30% 进行拆分:

变体 份额 累积阈值
A 30% 30
B 40% 70
C 30% 100
[
	{
		"priority": 1,
		"conditions": [],
		"serve_variation": "variant-a",
		"rollout": { "percentage": 30, "attribute": "targetingKey" }
	},
	{
		"priority": 2,
		"conditions": [],
		"serve_variation": "variant-b",
		"rollout": { "percentage": 70, "attribute": "targetingKey" }
	},
	{
		"priority": 3,
		"conditions": [],
		"serve_variation": "variant-c",
		"rollout": { "percentage": 100, "attribute": "targetingKey" }
	}
]

在 API 管理的配置中,第一条规则涵盖了 0-30 号存储桶。第二条规则涵盖 31-70。最后一条规则覆盖剩余的到 100 为止的存储桶。如果每个合格的上下文都应接收某个变体,则始终将最后一条规则设置为 100。

在实验的每条规则中使用相同的分桶属性。如果每条规则使用不同的属性,则用户可能无法留在预期的划分中。

定向的 A/B/n 测试

您可以将受众定位与多变体部署相结合。例如,您可能希望只有高级用户(premium users)进入实验,然后将这些高级用户分为三个变体。

对于定向的 A/B/n 测试,在每个变体规则上重复相同的受众条件,并使用累积的部署阈值。当您使用这种定向的多规则模式时,无论是使用仪表板还是 API,都需明确配置每条规则的累积阈值。

对于仅限高级用户(premium-only)的划分,其中 20% 接收变体 A,40% 接收变体 B,其余 40% 接收变体 C,使用的阈值为 20、60 和 100:

[
	{
		"priority": 1,
		"conditions": [
			{ "attribute": "plan", "operator": "equals", "value": "premium" }
		],
		"serve_variation": "variant-a",
		"rollout": { "percentage": 20, "attribute": "targetingKey" }
	},
	{
		"priority": 2,
		"conditions": [
			{ "attribute": "plan", "operator": "equals", "value": "premium" }
		],
		"serve_variation": "variant-b",
		"rollout": { "percentage": 60, "attribute": "targetingKey" }
	},
	{
		"priority": 3,
		"conditions": [
			{ "attribute": "plan", "operator": "equals", "value": "premium" }
		],
		"serve_variation": "variant-c",
		"rollout": { "percentage": 100, "attribute": "targetingKey" }
	}
]

不匹配 plan equals "premium" 的用户会跳过所有三条规则,并接收标志的默认变体,除非后续的规则与他们匹配。

请求采样

通过选择每次请求 (per-request) 的分桶属性,您可以使用百分比部署进行请求级别的采样。例如,1% 的部署可以为一小部分请求启用额外的日志记录或诊断。

仅当同一用户在不同的请求中收到不同的结果是可以接受的时候,才使用此模式。

故障排除

部署结果在请求之间发生变化

如果同一用户在不同请求中收到不同的值,则评估上下文可能缺少 targetingKey 或配置的分桶属性。

在每次评估中传递相同的稳定标识符:

const enabled = await env.FLAGS.getBooleanValue("gradual-rollout", false, {
	userId: session.user.id,
});

然后将部署配置为由 userId 进行分桶。

部署从未触及某些用户

检查规则顺序。优先级数字较低的包罗万象规则 (catch-all rule) 可以在后续部署规则运行之前返回变体。请将宽泛的包罗万象规则置于较特定的规则之后。

A/B/n 拆分与预期的百分比不符

对于普通的受仪表板管理的 A/B/n 测试,请输入每个变体的流量份额,并让仪表板计算阈值。

对于 API 管理的 A/B/n 测试,或对于配置为多条规则的定向 A/B/n 测试,请使用累积阈值。30% / 40% / 30% 的划分应使用 30、70 和 100 作为阈值,而不是 30、40 和 30。

默认变体在部署期间出现

当上下文匹配了规则条件但未落入部署百分比以内,且后续没有规则与其匹配时,就可能发生这种情况。如果每个匹配的上下文都应收到非默认变体,请添加一条后续规则,或者使用 100% 作为最后规则的比例。

这篇文档对您有帮助吗?