首页/开发/Git 与协作速查/特性开关与主干开发

特性开关与主干开发

用开关解耦「合入主干」与「对用户放量」:代码尽早合入,功能默认关闭,按灰度逐步打开。

Git 与协作速查开发更新于 2026-10-13

特性开关是什么

特性开关(feature flag)把「代码合入主干」与「功能对用户放量」解耦:新功能随主干随时合入、默认关闭,通过灰度开关逐步放开。它是主干开发体系的常用组件,让主干保持可发布的同时降低上线风险。开关本身是临时债务,需要配套的清理计划。

基本信息

目的解除部署与发布节奏的耦合,随时可关
粒度功能级、用户级、百分比灰度
生命周期临时开关设清理计划;长期开关按产品能力管理
风险长期堆积形成两套代码路径的维护负担
回滚关掉开关等于即时下线,不必回滚整个发布

典型使用场景

  • 大型功能开发:多次小步合入主干,用户仍看不到未完成部分
  • 灰度上线:先小比例用户、再逐步放量,用数据决定继续或回滚
  • 紧急开关:线上故障时一键关掉可疑功能,不必回滚整个发布
  • 按环境差异:内部环境全开、生产默认关
  • 兼容性迁移:新旧实现并存一段时间,观察后删除旧路径

代码示意

代码示意
# 判断开关状态,默认关闭
if (flags.enabled('new-checkout')) {
  renderNewCheckout();     # 新路径
} else {
  renderLegacyCheckout();  # 旧路径,灰度期间保留
}
# 发布节奏:合入主干(默认关)→ 内部验证 → 按比例灰度放量

开关治理要点

要点做法原因
默认值默认关闭,按需开启误放量的影响面最小
命名与登记统一命名、登记负责人欠账可见、有人负责
清理计划创建时登记预计删除时间避免两条路径长期并存
灰度度量配套指标与回滚判据没有数据无法判断是否继续放量
开关判断要有一致性:同一用户在不同服务与多次请求中看到的状态应稳定,按用户分桶而不是每次随机。
开关系统本身也是故障点:拉取开关的代码要有本地缓存与默认值兜底,开关服务不可用时不能把整个功能拖垮。

易错点

  • 没有清理计划:开关长期留在代码里,两条路径都要维护与测试,复杂度只增不减
  • 默认值配置错误:判断写反或开关服务异常时会直接暴露未完成功能,上线前核对默认值与灰度策略
  • 把开关当长期配置用:权限、审计与命名会逐渐失控,长期能力应回归产品配置系统
  • 关闭后忘记删除旧路径:废弃代码与配置越积越多,清理动作要写进交付清单

数据来源与参考

  • Martin Fowler:Feature Toggles(martinfowler.com)
  • Trunk Based Development(trunkbaseddevelopment.com)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌