部署不等于暴露
特性开关把发布代码与向用户展示分开。代码可以在开关关闭时部署并验证,然后分阶段扩大暴露,同时保留无需重新部署的 kill switch。
const enabled = await flags.isEnabled('new-checkout', {
userId,
environment: 'production',
});
if (enabled) {
return renderNewCheckout();
}
return renderLegacyCheckout();
步骤
- 创建开关,明确名称、负责人、默认值和移除日期;生产默认关闭。
- 暗发布:关闭开关部署代码,确认启动与后台路径正常,然后对内部用户或测试群组开启。
- 分阶段扩大:1% → 10% → 50% → 100%,每阶段比较特性指标与 SLO。
- 根据证据继续、暂停或关闭,并记录决策与使用的指标。
- 全量与观察期后删除开关、死分支和定向规则。
验证
- 处理组与对照组在错误率、延迟和业务指标上被比较。
- kill switch 无需部署即可关闭特性。
- 开关有负责人与过期日期。
- 移除后旧分支被删除,测试覆盖唯一保留的行为。
决策点
回滚优先关闭开关,前提是关闭时路径安全;否则重新部署旧版本。全量后等待覆盖特性使用周期的观察期再移除开关。
风险
每个开关都是临时的。没有负责人和移除日期,开关会变成未测试的分支和意外的永久配置。应在注册表中跟踪开关并定期审查过期项。