导读:大型互联网公司推出新功能之前,会选择一小部分用户进行灰度及 A/B 测试,并根据这些反馈对功能进行改进。知名的有 facebook 的 Gatekeeper,LinkedIn 的 XLNT 等,最近 Dropbox 也公布了其灰度发布平台。 像 Dropbox 这样的 SaaS 公司需要持续升级迭代他们的系统,并且这会涉及整个架构栈的所有层。当需要调整某些基础架构,发布一个新功能,或是设置 A/B 测试时,最重要的是我们如何快速变更并体现在产品中。 对我们的代码进行更改,然后“简单地”推送出去不是一个好选择:因为推送变更代码到 Web 服务器这个流程可能需要数小时,而发布新的移动版或桌面版客户端则需更长时间。同时在任何情况下,完整的代码部署是非常危险的,因为它可能会引入新的代码缺陷: 我们想要把一些可配置的 “开关” 添加到我们的产品中,并且根据我们的需要来动态打开或关闭。这能带给我们很好的灵活性,以及安全的实时的调整能力。 为了满足这种需要,我们构建了一个名为 Stormcrow的平台,它允许我们编辑和部署 “feature gates”(可以称作功能门或开关)。它是一个可配置的代码路径,通过请求 Stormcrow 来确定如何执行。典型的代码使用看起来像这样:
可在更改后10分钟内于生产环境生效。 可用于所有 Dropbox 系统,从底层的基础架构到桌面版或移动版产品。 提供高级的用户投放功能,比如可以根据我们数据仓库中的用户画像来细分用户。 构建一个像这样通用的功能开关系统并不容易,因为它需要具有足够的表达或描述能力来处理不同的用例,同时要足够健壮来应对 Dropbox 巨大的流量。 接下来就让我一一描述系统的工作原理和我们的一些经验教训。 示例 假设我们想执行一项 A/B 测试,看看德国用户喜欢什么颜色的按钮。 进一步,假设我们已经知道英语为母语的用户喜欢蓝色按钮。那么在 Stormcrow UI 中,我们可以这样配置功能:
这表明我们将对“德语区域的用户”分别以 33% 和 33% 的比例显示红色按钮(RED_BUTTON)和蓝色按钮(BLUE_BUTTON),剩余 34% 的用户则不显示该按钮。同时,使用英语会话(译者注,指浏览器语言或客户端语言)的用户则 100% 显示蓝色按钮(BLUE_BUTTON)。除此之外的所有剩余用户并不参与这项 A/B 测试。 需要注意的是,对于给定的任意特性/功能,可以使用不同的群体(population)类型:上面例子分别使用“用户”和“会话”来定义群体,前者仅代表已登录的用户,后者代表对我们网站的任何访问者。 在 Stormcow 中,有一系列的群体,这些群体按照自顶向下的方式进行匹配:首先,我们将尝试匹配群体1,如果失败了,我们在匹配群体2,依此类推。一旦我们匹配一个群体,我们就选择一个变量(variant)应用到这个群体上。 通过用户的 ID 与种子(图中右上角的小灰色框)hash 而实现随机。Stormcrow 用户也可以通过种子来实现特殊的行为。例如,如果想要两个不同的特性/功能分配给完全相同的用户们,那可以指定相同的种子。 如何定义群体? 要了解群体是如何定义的,我们需要了解两个概念: 选择器(selector)是一个代码对象,它被传递进 Stormcrow 以帮助它做出判断。例如,user和 session对象都可以用作选择器。 数据字段(datafield)是一段代码,它接收一个或多个选择器,并提取指定类型的值:布尔值、日期、数字、集合或字符串。 然后将它们通过简单的规则引擎(使用这些值执行逻辑计算)组合成数据字段。 这里是一个真实的数据字段例子,user_email:
@dataField装饰器(decorator)指定该数据字段需要一个 USER对象,并且将产生一个 STRING。 它还包括一段帮助文本,由此我们可以自动生成文档。函数的实际主体只是将用户的电子邮件从对象中取出。 (责任编辑:本港台直播) |