Feature Flags和版本管理
Feature Flags和版本管理
1)如果有发行版,为什么要悬挂旗帜?
Feature Flags (fiche flags)允许解锁和启用功能:代码以稳定和提前的方式进入插件,业务启用由config/console管理-针对细分市场、流量百分比、市场、VIP/监管小组、设备等:- 发行速度和安全性:小插件+即时回滚。
- 病变半径控制:渐进式滚动,环,SLO塞。
- 实验和A/B:多战标记,效果统计。
- 操作场景:用于风险支付/游戏路径的杀手开关。
关键原则:"ship dark,enable bright"-提前交付,有意识地打开。
2)国旗类型
Boolean:打开/关闭fichi,紧急停车标志(kill-switch)。
多重性:行为选择(算法A/B/C,限制,系数)。
Config/Remote Config:参数(时间戳、投注限制、奖金大小)。
Permission/Entitlement: 按角色/tiers访问功能/限制。
操作:流量路由(影子查询,启用新服务)。
3)体系结构和数据流
控制平面:控制台/标志服务器、规则/段存储、审核。
数据平面(SDK/Proxy/Edge):接收和悬挂标志、评估本地(潜伏率最低)规则、在不可用时后退。
- Pull: SDK定期同步config (ETag/stream)。
- 推送/流:服务器正在推送更新(Server-Sent Events/WebSocket)。
- Edge Cache/Proxy:更接近用户,减少p99。
- 本地规则评估(热路径中没有网络跳跃)。
- Taymauts和folbacks(没有"阻止"国旗阅读)。
- 签名/翻新configs snapshot。
4)定向和细分
属性:国家/地区,语言,平台,KYC级别,VIP级别,风险等级,帐户年龄,付款方法,责任游戏限制。
片段:保留的版本规则;"软"(营销)和"硬"(合规性)。
优先级/冲突:明确规则顺序,禁止在没有测试的情况下进行"最后匹配"。
地理/监管:跨辖区产品可用性复选框;不可变谓词(例如,禁止特定国家/地区的奖金)。
json
{
"flag": "new_withdrawal_flow",
"default": false,
"rules": [
{"when": {"country": "CA", "kyc_level": "FULL"}, "rollout": 25},
{"when": {"segment": "vip_tier_3_plus"}, "rollout": 100},
{"when": {"country": "DE"}, "force": false}
],
"expiresAt": "2026-03-31T00:00:00Z"
}
5)渐进式滚动: 策略
金丝雀%:1% → 5% → 25% → 50% → 100%与SLO的自动停靠。
Rings:内部团队→ Beta用户→一个地区在全球范围内→。
按设备/客户端进行采样:计入稳定性(哈希ID)。
影子交通:将请求复制到新路径而不会影响用户。
黑暗启动:包括但不明显(收集指标,加热缓存)。
- 在10分钟内恶化p95潜伏期API "withdraw">+15%。
- 错误5xx> 0。5%或支付提供商故障增加>+0。3个百分点。
- Alert Froda/风险评分高于细分市场的阈值。
6) Kill-switch(紧急标志)
SRE/On-Call可见的单独标志类别。
保证使用TTL键进行本地评估(毫秒)。
不退款停机:require reason+postmortem ticket。
集成的自动操作:关闭奖金,将付款转换为手动模式,禁止X提供商的存款。
7)与CI/CD和GitOps的集成
CI:通过匿名样本验证标志方案,规则线,"干运行"目标。
CD:宣传国旗作为文物(semver),敏感国旗(付款/合规性)的"approval gates"。
GitOps:在单独的config存储库中的标志,merge recvest=更改事件,"开箱即用"审核。
8)安全和合规性
RBAC/ABAC:谁可以创建/启用/提高百分比;职责分工(开发人员≠生产者≠产品所有者)。
审计:谁/何时/何时/为什么;理由(ticket/JIRA),与事件匹配。
PII最小化:定向的属性通过经络匿名/散列。
snapshot签名:在SDK/Proxy上验证完整性。
糖果交付的SLA:降级为"安全违约"。
9)可观察性和指标
运营:- 标志传播时间(p50/p95),本地腰果的命中率,更新频率。
- 活动标志/过时/"悬挂"的数量(未按时删除)。
- SLO保护器:潜伏期,错误,转换,提供商的稳定性。
- DORA:报销频率,报废前时间,报废后故障百分比,MTTR。
- A/B指标:CR,ARPPU,LTV信号,对额定得分的影响。
10)国旗生命周期
1.设计:目标/指标/所有者/有效期('expiresAt'),回滚脚本。
2.实现:SDK呼叫,后退,"曝光"/"决策"遥测。
3.Rollout:渐进式进站+SLO门。
4.Stabilize:提交效果,更新文档/例程。
5.清除:删除代码分支、关闭标志、审核"残余"。
11)实施示例
11.1 Web/Node。js
ts
// Инициализация SDK (псевдо)
const flags = await sdk.init({ sdkKey: process.env.FLAGS_KEY, user: { id: userIdHash, country, vipTier } });
// Не блокировать рендер:
const showNewCashout = flags.bool("new_withdrawal_flow", false);
if (showNewCashout) {
renderNewFlow();
} else {
renderClassic();
}
11.2 Kotlin / JVM
kotlin val client = FlagsClient(sdkKey = System.getenv("FLAGS_KEY"))
val context = UserContext(id = userHash, country = country, kycLevel = kyc)
val enabled = client.getBoolean("risk_guard_withdrawals", default = true, context = context)
if (!enabled) {
// аварийный режим: все выводы в manual review routeToManual()
}
11.3 NGINX(通过地图进行外部连接)
nginx map $http_x_feature $cashout_new {
default 0;
"~enabled" 1;
}
location /withdraw {
if ($cashout_new) { proxy_pass http://new_flow; }
if (!$cashout_new) { proxy_pass http://classic_flow; }
}
12)风险管理和渐进步骤
包括步骤:1%的员工→ 5%的"beta" → 10%的RU → 25%的EU → 100%,但DE(监管机构)除外。
限制器:最大1步/30分钟;每个窗口15分钟的指标稳定性要求。
自动停止:平台级别的政策(请参见下面的OPA)。
rego package flags.guard
deny[msg] {
input.flag == "new_withdrawal_flow"
input.metrics["withdraw_5xx_rate"] > 0.5 msg:= "Stop rollout: withdraw 5xx too high"
}
13)访问控制和批准
Change Types:标准(安全)vs敏感(付款/付款/限额)。
Approvals:产品所有者+技术。负责+合规性(适用于司法管辖区)。
时间窗口(freeze):禁止在高风险时期(黄金时段、大型赛事)进行夹具/扩展。
14)实验和统计
Exposure events(曝光事件):我们用属性来构造标志解决方桉。
分析:当前滚动值、段、转换效果/误差。
统计检查:正确分离,控制协变量(设备/地质)。
伦理和监管:避免地方法律限制的分割。
15)反模式
代码中没有"expiresAt"("分支墓地")的长寿旗帜。
在热路径中阻止SDK网络调用。
根据PII进行过多的定位,没有属性匿名。
启用,没有SLO保安/自动停止。
对于高风险流(存款/收款/奖金)没有杀手开关。
未经审核和证明的"秘密"手动旗帜编辑。
16)实施清单(0-60-90)
0-30天
选择标志平台/准备主机(SDK、proxy、kesh)。
输入电路("flag","owner","purpose","expiresAt","risk_level")。
将SLO指标连接到平台(关键API的潜在性/错误)。
31-60天
在敏感标志上添加approvals,OPA警卫。
自定义渐进策略(percent/rings),杀手开关面板。
在CI 中嵌入国旗方案linter;开始清理第一个"挂起"。
61-90天
与GitOps完全集成(MR标记编辑、审核)。
视觉dashbords:coverage SDK,发行时间,%kesh命中。
常规"Flag Debt Day":删除代码并关闭旗帜。
17)成熟度量
技术:p95接受配置<5 c;cache hit-rate SDK> 95%;使用'expiresAt'> 90%的标志百分比。
过程:100%带有前瞻性的敏感旗帜;"回滚前平均时间"<3分钟。
代码卫生:全球包容后30天内封闭旗帜的比例>80%。
业务效果:改进DORA(发布频率↑, MTTR ↓),减少发布事件。
18)应用程序: 模板和策略
国旗方案(YAML)
yaml flag: new_withdrawal_flow owner: payments-team risk_level: high purpose: "Новый поток вывода средств"
expiresAt: "2026-03-31T00:00:00Z"
sla:
propagation_p95_ms: 3000 slo_guards:
withdraw_p95_ms_increase_pct: 15 withdraw_5xx_rate_pct: 0.5 approvals:
required: ["product_owner","tech_lead","compliance"]
"没有永恒的旗帜"政策(林特的惯例)
yaml rules:
- check: expiresAt max_days_from_now: 180 action: error
事件的SDK合同(曝光)
json
{
"event": "flag_exposure",
"flag": "new_withdrawal_flow",
"variant": "on",
"userKey": "hash_abcdef",
"context": {"country":"CA","vipTier":"3"},
"traceId": "9f1c...a2",
"ts": 1730623200000
}
19)结论
Feature Flags是用于更改的"音量旋钮"。连接渐进式夹杂物、SLO保护器、严格的审核和定期扫除,并在CI/CD和GitOps上悬挂标志。结果,发布将变得频繁,可管理且安全,并且事件风险是可预测和可控制的。