跳转到内容

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 一样。

删除一个 flag 是可逆的——在一定范围内。归档会把它从你的应用里移除:在每一台在线设备上,这个 flag 会在大约一分钟内停止解析,你代码里的默认值接管。已归档的 flag 可以在保留窗口内被完整恢复,或者在窗口过后被永久清除。归档列表就在每个项目里,紧挨着它所持有的 flag。

如果一个 flag 已经 90 天没有人动过,控制台会给它打上陈旧标记——这是一个归档它的提醒,绝不会自动归档。你忘掉的 flag,是你的代码库仍在为之付出代价的复杂度。