解耦部署与发布
功能开关让代码进入生产却不被用户看到。部署是技术事件,发布是产品决策。功能异常时,关闭开关比回滚部署更快——前提是旧路径仍然存在且经过测试。
if (flags.isEnabled('checkout_v2', { userId, tenantId })) {
return checkoutV2(cart);
}
return checkoutV1(cart);
分清开关类型
发布开关隐藏未完成工作,应在全量后移除。运维开关是依赖或功能的长期 kill switch。实验开关把用户分配到不同分组,需要分析纪律。权限开关执行访问控制,必须一致且安全地求值。混用这些用途,会产生没人敢删除的开关。
保持求值一致
在请求的明确边界只求值一次,并把决策向下传递。多个服务用不同用户上下文求值同一个开关,会产生不一致行为。缓存开关值时要限定陈旧时间并提供兜底默认值;开关服务不可用时,系统仍须做出安全选择。
清理
每个发布开关都是有截止日期的技术债。记录负责人、发布状态和移除日期。功能全量后,删除旧路径和开关,并清理开关配置。拥有数百个陈旧开关的代码库会变成组合爆炸的测试难题。
何时使用
当部署与发布需要独立、kill switch 有价值,或实验需要分组时,使用功能开关。优点是控制力和快速止损;代价是分支复杂度和配置漂移。与重新部署相比,开关更快,但增加了运行时依赖和清理义务。