Flag 与类型
一个 flag 是你的应用请 FortressFlag 做出的一个有名字的决定:这台设备该看到新的结算流程吗?购买按钮上用哪句文案?重试多少次之后放弃?本页给你文档其余部分所依赖的那套词汇。
Flag 属于项目,并且每个环境有一个值
Section titled “Flag 属于项目,并且每个环境有一个值”每个 flag 都属于一个项目,并由它的 key 标识——一个像 new-checkout 这样的简短小写名字。key 是你的代码要请求的东西,而且创建之后不可变:你已发布的应用把 key 写死在代码里,所以改名会把它们弄坏。你可以随时修改 flag 的显示名称;key 是永久的。
一个 flag 没有一个值——它是每个环境一个值。new-checkout 可以在 dev 里开启,在 staging 里灰度中,在 production 里关闭,三者同时成立。你对每个环境独立地切换和定向。
每个 flag 都有一个类型,在创建时选定,之后不可变:
| 类型 | 值 | 适合 |
|---|---|---|
| Boolean | true / false |
紧急开关、功能门控、灰度发布 |
| String | 具名文本变体 | 文案实验、算法选择、主题 |
| Number | 具名数值变体 | 限额、超时、阈值 |
类型不可变的原因和 key 一样:你的代码通过带类型的调用(isEnabled、stringValue、numberValue)读取 flag,一个在已发布应用底下改变了类型的 flag,对它来说会变得不可理解。
字符串和数字 flag 提供的是变体——有名字的值,比如 control → "buy-now" 和 treatment → "start-free"。名字是给你和你的控制台用的;你的用户的设备只会收到值。变体名称永远不会离开管理平面。
默认值,以及默认值背后的默认值
Section titled “默认值,以及默认值背后的默认值”有两样不同的东西都被叫做默认值,值得把它们分开:
- flag 的默认值是当没有定向规则匹配时,一个环境所提供的值。对布尔 flag 来说,那就是它的开/关状态;对多变体 flag 来说,那是你选作默认的那个变体。
- 你代码里的默认值是你在调用处传入的值——
isEnabled("new-checkout", default: false)。这是回退链的最底层:当你的应用从未连上过 FortressFlag,或者这个 flag 在那个环境里不存在(或没有可提供的值)时,应用用的就是它。
一个尚未选定默认变体的全新多变体 flag 什么也不提供——在你做出决定之前,由你代码里的默认值来回答。这是有意为之:一个你还没配置完的 flag,行为应该和一个不存在的 flag 一样。
生命周期:归档、恢复、清除
Section titled “生命周期:归档、恢复、清除”删除一个 flag 是可逆的——在一定范围内。归档会把它从你的应用里移除:在每一台在线设备上,这个 flag 会在大约一分钟内停止解析,你代码里的默认值接管。已归档的 flag 可以在保留窗口内被完整恢复,或者在窗口过后被永久清除。归档列表就在每个项目里,紧挨着它所持有的 flag。
如果一个 flag 已经 90 天没有人动过,控制台会给它打上陈旧标记——这是一个归档它的提醒,绝不会自动归档。你忘掉的 flag,是你的代码库仍在为之付出代价的复杂度。
- 定向——规则、细分和百分比灰度
- 环境与项目——flag 住在哪里
- Flag 如何到达你的应用——设备实际收到的是什么