← 中文资源

简体中文版本

功能开关

功能开关把部署与发布解耦:代码可先进入生产,是否对用户可见由产品决策控制,并提供快速止损手段。

阅读英文原文

解耦部署与发布

功能开关让代码进入生产却不被用户看到。部署是技术事件,发布是产品决策。功能异常时,关闭开关比回滚部署更快——前提是旧路径仍然存在且经过测试。

if (flags.isEnabled('checkout_v2', { userId, tenantId })) {
  return checkoutV2(cart);
}
return checkoutV1(cart);

分清开关类型

发布开关隐藏未完成工作,应在全量后移除。运维开关是依赖或功能的长期 kill switch。实验开关把用户分配到不同分组,需要分析纪律。权限开关执行访问控制,必须一致且安全地求值。混用这些用途,会产生没人敢删除的开关。

保持求值一致

在请求的明确边界只求值一次,并把决策向下传递。多个服务用不同用户上下文求值同一个开关,会产生不一致行为。缓存开关值时要限定陈旧时间并提供兜底默认值;开关服务不可用时,系统仍须做出安全选择。

清理

每个发布开关都是有截止日期的技术债。记录负责人、发布状态和移除日期。功能全量后,删除旧路径和开关,并清理开关配置。拥有数百个陈旧开关的代码库会变成组合爆炸的测试难题。

何时使用

当部署与发布需要独立、kill switch 有价值,或实验需要分组时,使用功能开关。优点是控制力和快速止损;代价是分支复杂度和配置漂移。与重新部署相比,开关更快,但增加了运行时依赖和清理义务。