用途
本技能用于指导功能开关(Feature Flag,又称功能切换、功能门控)的实现、管理与最佳实践,核心目标是支持渐进式发布(gradual rollout)。当用户提到 feature flag、feature toggle、feature gate 等概念时适用。
开关类型
资料将开关分为四类,并给出用途、生命周期与示例:
- 发布(Release):门控未完成的功能,生命周期为天到周,示例 new-checkout-flow。
- 实验(Experiment):A/B 测试变体,生命周期为周到月,示例 pricing-page-variant。
- 运维/紧急关闭(Ops / Kill switch):运行时控制、紧急禁用,生命周期近乎永久,示例 disable-search-indexing。
- 权限(Permission):权益门控,生命周期永久,示例 premium-analytics。
实现模式
- 布尔开关:通过 isEnabled 判断返回新组件或旧组件。
- 多变量开关:通过 getVariant 获取变体,用 switch 分支渲染不同实现。
- 用户定向开关:构造包含 userId、email、plan、country 的上下文,传入 isEnabled 进行定向判断。
SDK 集成
资料提供了多个第三方 SDK 的集成代码示例:
- LaunchDarkly:使用 @launchdarkly/node-server-sdk,初始化客户端、等待初始化完成、用 variation 求值、监听 update 事件、在 SIGTERM 时关闭客户端。
- Unleash:使用 unleash-client 的 initialize,配置 url、appName、customHeaders,在 ready 事件中调用 isEnabled。
- Flagsmith:使用 flagsmith-nodejs,通过 environmentKey 初始化,用 getIdentityFlags 获取身份开关,再调用 isFeatureEnabled 与 getFeatureValue。
- Statsig:使用 statsig-node,initialize 后调用 checkGate。
- GrowthBook:使用 @growthbook/growthbook,配置 apiHost、clientKey、attributes 与 trackingCallback,init 后调用 isOn。
自建实现
- 环境变量:最简单的二值开关,修改需重新部署。
- 数据库支撑:给出 feature_flags 表结构(含 name、enabled、rollout_percentage、allowed_users、allowed_segments、metadata 等字段),以及带内存缓存(30 秒 TTL)的 FeatureFlagService 类,包含 isEnabled 判断逻辑与基于 userId 和 flagName 的哈希函数。
生命周期管理
- 创建:命名带归属,格式为 <team>.<feature>(如 payments.new-checkout),创建时记录类型、负责人、工单与预期移除日期。
- 灰度排期:第 1 天仅内部(白名单),第 3 天 1%(冒烟测试),第 5 天 10%(监控指标),第 8 天 50%(规模化验证),第 10 天 100%(全量),第 14 天移除开关与死代码。
- 清理:用 grep 搜索 isEnabled、getVariant、checkGate、isOn 等引用,与开关服务比对找出陈旧开关;对超期开关在求值时告警,并记录负责人与工单。
带开关的测试
- 单元测试:通过 override 覆盖开关值,测试开关开启与关闭两种渲染结果,afterEach 中 clearOverrides。
- 集成测试:遍历所有变体(如 single-page、multi-step、control)执行购买流程。
- 避免组合爆炸:不要为 n 个开关写 2^n 个测试,而是独立测试各开关,仅覆盖关键交互组合。
渐进发布策略
- 按百分比(粘性):使用确定性哈希(如 murmurHash3),保证同一用户始终获得相同体验。
- 用户分群:如 beta-testers、employees、power-users、new-users 等分群函数。
- 地域发布:分阶段开放区域,从 us-east-1 到 eu-west-1 再到全部区域。
主干开发配合开关
从第一次提交起就把未完成工作包在开关后,每日推送到 main,开关在生产环境保持关闭直到就绪;完成后提交清理,移除开关与旧路径。
反模式
- 永久发布开关:发布开关留存数月会变成隐形技术债,应在创建时设置过期并用 CI lint 规则强制执行。
- 开关依赖:开关依赖其他开关会产生未定义状态,应改用单一开关控制相关变更。
- 嵌套开关:2^3 会产生 8 个隐藏状态,应扁平化为显式变体。
- 把开关当配置:运维参数不应存为开关,应使用远程配置或环境变量。
运维关注点
- 性能与缓存:在内存中缓存开关并后台刷新,避免每请求延迟。
- 安全默认值:开关服务不可用时系统仍须工作,求值失败时返回安全默认值(如功能关闭)。
- 监控与审计:记录求值指标、在开关变更时告警,并提供 flag_audit_log 审计表用于合规与调试。
适用场景与限制
适用于需要渐进发布、A/B 测试、运行时控制或权益门控的团队,尤其是采用主干开发与持续部署的工程团队。资料未提供具体产品的收费、价格、平台支持范围或效果数据,这些信息暂未提供。