如何为您的用户实施有限的功能推出(与语言无关)?

Posted

技术标签:

【中文标题】如何为您的用户实施有限的功能推出(与语言无关)?【英文标题】:How to implement a limited feature rollout (language agnostic) to your users? 【发布时间】:2011-06-06 15:53:03 【问题描述】:

我想了解一些向选定用户群推出新网站功能的常见或最佳做法。

例如,用户可能仅基于您的整体用户群的百分比 (10%)。部署应该是可定制的(可配置的)并支持任意数量的功能。将推出与特定用户角色或权限 (ACL) 相关联也很有用。

那么,本质上,什么是可以合理扩展的架构?

至于与语言无关的部分,您可以提供伪代码、一般概念或想法,或者来自您喜欢的语言的 sn-ps 来表达您的观点。

欢迎提供任何示例或教程的链接。

【问题讨论】:

我记得前段时间有一篇关于 Twitter 战略的博文。如果有人可以挖掘它并发表评论,那也会很有帮助。 我最近发现了一个 github 库 rollout,它实现了大部分功能。它允许您定位所有用户、特定用户或一定比例的用户。 github.com/jamesgolick/rollout 在这里进行很好的讨论***.com/questions/7707383/what-is-a-feature-flag/… 【参考方案1】:

我的建议是,对于获得新功能的人来说,他们所在的网站应尽可能靠近该功能公开后每个人都会访问的网站。

换句话说,例如,我不会在页面上使用条件逻辑来确定按钮是否应该可见,如果该条件仅在此测试期间存在的话。相反,我会在登录时确定此人是否是 beta 参与者(该确定可能是随机的,可能参考他们的角色等)。如果他们是参与者,他们将被重定向到从版本控制分支部署的单独部署的站点。

部署完成后,分支将被合并,每个人都可以看到新功能。

这样,您不必担心公共测试版用户看到的代码库与最终发布的代码库不同(在某些方面可能会破坏某些东西)。

【讨论】:

感谢雅各布的快速回复。当我考虑登录时的条件检查时,一些快速的事情是确保会话在机器之间是全局的,以便正确处理重定向到相同功能的分支克隆。 非常好的解决方案,但我想知道应该如何处理案例,以及代码库数据库架构发生变化的地方。我想了一会儿关于单独的模式和数据迁移,但是当涉及到向所有用户发布某些功能时,数据合并可能是一项非常艰巨的任务。你有没有遇到过这样的情况? @mcveat:是的,这是一个潜在的问题。当然,一般来说,这是分支应用程序的问题。一些数据库方法,例如 Rails 迁移,允许您将模式规范与特定的代码库保持一致,但这仍然不能帮助您合并实际数据。我想我会建立一个具有新模式的新数据库,并设置一个数据迁移路径,将用户从旧模式转移到新模式。 Beta 用户立即被转移,最终每个人都被转移,新架构成为唯一的架构。 @cballou:如果重定向只发生在登录时,我认为只要有人登录就开始一个新会话是合理的。【参考方案2】:

在我上一份工作中,我们使用负载平衡器和当前修订 cookie 完成了这项工作。

负载平衡器设置了一个 cookie,用于标识用户正在使用的实例的修订号。如果该 cookie 已经存在,负载均衡器只会将该请求发送到具有相应修订的正在运行的实例。当我们部署一个新的修订版时,负载均衡器继续使用现有的修订版 cookie 将流量发送到其原始修订版,直到该修订版不再运行或用户关闭其浏览器。新流量将被发送到新部署的修订版。这使我们能够在现有用户继续在旧版本上运行时测试一下更改。我们还可以手动设置该 cookie 以在生产环境内部测试新的 rev,然后再将新流量转到它上面。当我们对新版本没有大问题感到满意时,我们可以降低旧版本,所有流量都会开始转到最新版本。

该设置不支持向后不兼容的数据库更改。几乎没有办法做到这一点,您可以让一部分用户在一个数据库架构上,而在另一个数据库架构上,并且能够对两者进行写入,然后在您确定新版本没问题后以某种方式将这些写入合并在一起.我的意思是,这是可能的,但这实际上取决于架构更改的确切内容以及它们如何影响您的应用程序,因此您无法在部署时以可靠、不可知的方式进行操作。对我们来说,我们通常只是尽量不做向后不兼容的模式更改。如果确实需要,我们会尝试将破坏性部分(删除列或表)推迟到以后的版本,我们可以迁移架构并让两个版本都运行,而不会对当前用户产生不利影响。

【讨论】:

【参考方案3】:

对于随机选择过程,我喜欢在成功登录时询问每位客户是否愿意参与 Beta 测试的概念,一旦达到所需或想要的用户总数,您就停止询问。在数据库中,我倾向于存储将用户重定向到的服务器,并运行一个标准脚本,在登录时将每个用户移动到正确的位置。

我们会提前几个月设计应用开发,避免更改现有架构。原因很明显,当然这并不总是可行的,所以当我们有这样的更改时,我们总是在编写更改时完整记录更改并尽早计划该字段的迁移。通过这种方式,我们制定了正在做出哪些改变的战斗计划,并且我们可以为我们制定最佳解决方案。不幸的是,这会根据情况发生变化。

我们总是运行多个环境,我们通常有生产、开发和测试版。这意味着我们 1 不会乱用等值钱的生产服务,我们不会有人破坏代码并在优化时将服务拉下线。

开发使用 GIT 进行版本监控,用户从来没有看到这一点,因为我们上传了各种奇怪而精彩的实验来玩。它还使用自己的数据库与实时数据。

使用测试版,我们通常会迁移特定的用户数据,但最近我们在复制整个数据库和计划测试版开始的特定日期方面有了更好的体验,这样做是允许用户选择退出测试版和其他选择支持此选项所需的最小更改。我们通常做的是每天在两个数据库之间迁移一次新数据,新的选择加入和选择退出仅在数据迁移到另一个平台时生效。

我们还使用现有的生产数据库进行了小规模的成功测试,测试了一些在自己的表之外运行的新功能,因此根据您正在做的数据明智地使用相同的实时数据库可能是一个不错的选择.

我希望这对你有用……祝你的测试伙伴好运。

【讨论】:

【参考方案4】:

Google 网站优化器似乎正是您所寻找的。

【讨论】:

不,不是,谷歌网站优化器更像A/B Testing,但@cballou 正在寻找一种方法将特定用户组暴露给新功能,例如新的评论系统或上传器,而不仅仅是一个布局变化

以上是关于如何为您的用户实施有限的功能推出(与语言无关)?的主要内容,如果未能解决你的问题,请参考以下文章

如何为特定用户实施旧密码和新密码?

您的首个iOS应用程序-实施视图

如何为您的网站制作自己的推送通知服务

如何为您的网站添加 google chrome 多功能框搜索支持?

如何为未知目的地实施 Google Directions API?

如何为人工智能编程选择语言? [关闭]