什么是“功能标志”?

时间:2011-10-09 23:52:19

标签: architecture scalability

此处提及高度可用性标记:

http://www.iheavy.com/2011/08/26/5-things-are-toxic-to-scalability/

功能标志究竟是什么?

由于

12 个答案:

答案 0 :(得分:80)

“功能标记”(或Feature Toggle)可以轻松打开/关闭应用程序的功能(子部分):

  • 可能通过重新部署或
  • 可以实时切换页面/功能的内部页面。

我想有一个例子,如果你需要,比如说如果负载太高就减少数据库查询,那么让控件减少功能集是很方便的。

heaps of other reasons你想要使用这个 - 其中一个主要是启用Continuous Delivery:将内容推入生产/现场,但功能已禁用/切换,直到完成为止。我们经常使用我们称之为'dev cookie'的方式向开发团队展示未完成的功能。通过这种方式,我们可以在多次发布/部署之前测试部分完成的生产工作(哦,是否有更好的集成?),然后我们“解开”(完成)它,并且公众可以看到它。

这是一个简单的包,可以帮助您在ASP.NET MVC中执行此操作:https://github.com/cottsak/DevCookie(完全披露:我是作者)

福勒也有much longer article than the one linked above with a lot more details

This post (on Fowler's site also) explains the various types of toggle strategiesDevCookie支持基于主线/主干的策略,在文章中称为“Release Toggle”。

Adil's answer强调,您可能需要一些此基础架构的条款和理由很多。请记住,您可能只需要其中一些东西。例如,我可能只想启用简单,灵活的部署/交付工作流程,因此简单的基础架构就足够了。如果您选择要进行完整的#leanstartup A / B实验,群组测试和控制推出之类的事情,您应该考虑一种促进这些数据的分析工具(例如Heap) - 驱动开发方法作为一种独特的解决方案。执行上述所有操作的切换基础设施将导致膨胀和不必要的复杂性。

答案 1 :(得分:22)

功能标志是一种通过配置关闭应用程序某些功能而无需部署新代码的技术。

功能标志在CI方案中发挥关键作用,其中功能不断被部署,但不一定“发布”到生产中。

更多信息:

- 编辑:

Feature Flags java implementation

答案 2 :(得分:15)

功能标志,功能切换,实验和受控推出是一个简单而强大的想法的同义词:从功能推出中单独部署代码。简而言之,它是能够将您的功能提交到生产中,同时选择您的客户中的哪些人 - 如果有人 - 可以看到该功能。

他们部分地由Facebook's Gatekeeper推广。 LinkedIn的LiX是另一个很好的例子。

拥抱这个简单的想法为许多最佳实践奠定了基础,包括:

持续部署/交付 - 多个代码在一天内投入生产。

中继/主线开发 - 应仅为拉取请求创建功能分支,而不是为长期功能开发创建功能分支。

不再释放列车让事情陷入困境。

生产中的QA / Perf测试 - 真正的质量保证和性能测试是针对具有生产流量的生产基础架构。不要浪费时间建立广泛的性能实验室和临时环境。

实验 - 了解新功能如何改变您的KPI。

在出现问题时避免修补程序或代码回滚 - 修补程序和代码回滚都很紧张,需要很长时间,并且会导致更多问题。相反,请关闭此功能或将其降低。

其他人提到了开源库。完整解决方案的一个很好的例子 - 如Gatekeeper和LiX--是Split。我在斯普利特工作。

答案 3 :(得分:8)

功能标记(也称为功能翻转或feature toggle)是一个开关,可根据需要启用或禁用潜在的昂贵功能(例如,当网站受到意外流量的攻击时)。这会给你一点时间,直到你扩大规模,或直到负载峰值消失为止。

这是an example from the SWIG documentation

答案 4 :(得分:7)

这里有很多很棒的答案,所有这些都是在Martin Fowler帖子中推广的重要基本定义:

它们是“允许团队在不改变代码的情况下修改系统行为的代码”。

所以我们历史上认为它们是伪代码所代表的:

if(app_settings["beta-mode"] == "true")
  showAwesomeNewGui();
else
  sameOldSnoozeFeset();

这是一种完全准确的思考方式,而Matt和Adil都很好地扩展了功能标志的各种战术用例。

但我想提供一个修订的定义,反映现实在六年内的演变以及自dotnetdev提出原始问题以来的变化。我为Rollout.io工作,这是一个功能标志平台,所以我已经有了这个演变的前排座位。

简而言之,功能标志不再仅仅是一种在应用程序中打开和关闭功能的方法。这就像回答“什么是发票行项目”,说“这是一个描述和一定数量的货币”。没错,但它不会在发票本身的更广泛的位置上推动。

功能标志是现代软件中总体战略解决方案的战术位。当您有更多信息时,它们是您将代码中的重要决策逻辑推迟到运行时的方法。而且,也许最重要的是,它们不再只是孤立地发生,只需检查版本号是否大于2.7;使用它们的组织通常将它们作为全面的系统范围产品方法的一部分。

正如其他人所提到的,Facebook和LinkedIn率先推出了这一点,但在2018年,很多组织都在这样做。他们将运行时的决策逻辑问题推迟作为开发战略,运营战略(或DevOps战略,如果您需要)和产品战略的一部分。以下是此类问题的示例。

  • 谁应该看到我们推出的新管理界面,何时推出?
  • 解锁这个复活节彩蛋需要多少会员资格?
  • 我们什么时候应该切换到新数据库?
  • 我们是否应该在结帐按钮上放置猎豹或老鹰的图片以增强转化效果?

要让应用程序在运行时推迟大量此类决策,您不能以临时方式将功能标记放入应用程序中,否则您将陷入技术债务之中。如今,您需要拥有全面的功能标记管理策略,其中包括一些不同的组件。

  • 切换点用于切换新功能的行为。
  • 多个切换点组合在一起形成切换路由器。切换路由器确定功能的状态。
  • 切换上下文为切换路由器提供必要的上下文信息(例如,特定用户)。
  • 切换配置提供切换路由器有关环境的信息。

那么,最后,什么是特征标志?

嗯,它们是更广泛战略的重要组成部分,使应用程序能够适应技术和市场需求。

答案 5 :(得分:5)

在我的公司,我们曾经有自己的解决方案。我们创建了一项服务,为每个应用程序提供可下载的配置(.json)文件。 在该配置中,我们存储了功能的标志。基于该配置,应用程序可以显示或隐藏当前功能。 (例如,在边栏上显示或隐藏菜单项。)

我们还创建了一个内部管理页面,可以在其中配置功能标记。 一段时间以来,它的效果相当好,但之后我们希望进行用户定位和A / B测试。 自行开发似乎太费力了,所以我们选择了第三方解决方案。 正如这里已经提到的,有很多解决方案。

我们选择ConfigCat是因为它一次支持自定义的目标组和基于百分比的部署。您可以在github上查看受支持的开源sdks。

答案 6 :(得分:3)

功能标志(或功能切换)允许您在应用程序上远程启用功能,而无需重新构建/重新部署应用程序。 这允许您将代码部署到生产中,但在准备好之前不会释放该功能。 您可以定位特定用户,因此您可以为测试版用户启用新功能进行测试。

在我们公司,我们之前使用过LaunchDarklyFeatureFlags.io的其他建议。我们也尝试使用Firebase's Remote config来尝试使用它,但我们发现它并不适合这个目的。

我们最终开发了我们自己的版本Bullet Train,我们已经开源了。它结合了Feature Flags / Toggles和Remote Config。

答案 7 :(得分:3)

功能标志用于多种目的。 总体思路是将控制权授予哪些用户可以在远程仪表板或某种后台系统中看到哪些功能。

一旦代码中标记了某个功能,您现在可以使用多种方法来确定哪个用户在您的应用程序中看到该功能:  1. 打开/关闭-向所有用户或不向任何用户显示该功能。  2. 逐步发布-仅向部分用户显示该功能,然后逐步向所有用户显示该功能。  3. 定位-根据特定用户的属性或特征向该特定用户显示该功能。

有助于控制功能标志(布尔值)和功能配置(字符串,数字等)的工具通常称为功能管理平台 功能管理提供了一项很棒的服务,名为Configz.io

答案 8 :(得分:1)

我的理解是,功能标记可以帮助您通过决定哪些用户获得某些功能来启用功能。

例如,假设您只希望测试用户看到新功能。您可以为测试用户“切换”该功能,而其他用户则不会看到它。

LDUser user = new LDUser("user@test.com");

boolean showFeature = ldClient.toggle("your.feature.key", user, false);

if (showFeature) {
     // application code to show the feature 
 }
else {
     // the code to run if the feature is off
 }

我正在测试LaunchDarkly's feature flags进行一些前端JS A / B测试 - 似乎运行良好。您还可以查看this site for feature toggles and feature flag libraries

答案 9 :(得分:1)

从编码的角度来看,功能标记可以像if语句一样简单,该语句将您正在编写的新代码包裹起来。当if语句的计算结果为true(功能标志打开)时,将执行新代码。

在实际的软件交付示例中,上述if语句根据软件所运行的环境的不同而评估。例如,如果应用程序在您的质量检查服务器上执行,则功能标志将返回true,将看到新功能。如果正在生产服务器上执行该功能,则功能标志将返回false,并且该功能将被隐藏。

根据我在职业生涯中的亲身经历,我已通过以下方式使用功能标记:

  1. 将代码部署与向客户发布功能脱钩。这是我在开发过程中首次使用功能标志。我们使用它消除了营销和产品团队与进行开发和发布的工程团队之间的依赖。功能标记允许我们在发布前几周就部署代码,而以前我们是在发布前一晚部署代码!

  2. 在生产中进行测试。在发布代码时使用功能标记之前,这是一个全有或全无的事件,要么我们所有的客户都获得了功能,要么没有。我们使用功能标志来允许我们一次向一小部分用户推出新功能。这使我们能够收集有关新功能的宝贵反馈和数据,而不会给整个客户群带来任何潜在风险。

  3. 在开发生命周期中为每个环境启用/禁用功能。我们在开发中广泛使用了此功能,以允许更顺畅的部署过程-我们拥有一条CI / CD管道,其中使用功能标记至关重要。

  4. 创建一个终止开关。我们已经用一个功能标记包装了我们应用程序的某些功能,当我们遇到任何问题时,该功能标记使我们可以“终止”该功能。当时的申请。例如,如果我们发现自己承受了沉重的负担,则可以关闭网站的某些非必要功能来解决此问题。

您可以在此处阅读更多about feature flags

您可以通过多种方式向代码添加功能标记。

  1. 您可以创建自己的或使用第三方功能标志库,然后将功能标志数据添加到配置文件中,该文件可以包含在部署包中。
  2. 您可以创建自己的或使用第三方功能标志库,并将功能标志数据添加到可在运行时加载的配置文件中。
  3. 您可以使用基于云的功能标记管理服务来为您管理所有功能标记需求。

首先编写自己的库似乎是一个好主意,通常可以从这种方式开始。但是,当您要实现功能标记的更高级用例(例如扩展到一定比例的用户或针对特定用户组)时,很快就会遇到问题。创建自己的功能标志实现的另一个问题是,如果您使用多种语言,则需要多次实现代码。

使用功能标记的最佳和最简便的方法是使用在线功能标记管理服务,例如Floodgate。这样,您就可以利用平台上的所有繁重工作,从而使您可以专注于为应用程序创建功能。

这里是如何使用.NET SDK向应用程序添加Floodgate功能标志的示例。

using FloodGate.SDK;

var floodgateClient = new FloodGateClient("API-KEY");

var flag = floodgateClient.GetValue("a-new-feature", false);

if (flag)
{
  // Execute the code for my new feature here...
}

如果您在开发团队中工作,并且没有使用功能标记,并且在团队内部的部署和代码管理中遇到问题。使用功能标志可能是解决这些问题的好方法。功能标记还具有很好的副作用,可以加快团队的发展速度。

马丁·福勒(Martin Fowler)对功能标记here作了非常深入的介绍,我建议您阅读。

答案 10 :(得分:0)

功能标志基本上使您能够打开和关闭功能,而无需对代码进行任何更改或发布新版本。 这是一个重要的解决方案,特别是对于移动应用程序开发人员,因为他们无法控制用户将应用程序更新到新版本。

有几家公司为移动应用程序开发人员提供此服务。

答案 11 :(得分:0)

在我的公司,我们为我们在SaaS应用中引入的每个新功能使用功能标记。除了对性能的好处之外,它还允许我们逐步推出新功能 - 首先为高级用户引入新功能,从他们那里获得反馈并在我们向所有用户推出之前即兴创作。

它还允许我们为个人用户定制产品 - 高级用户想要所有功能;简单的用户可能只是想要基本的东西,可能会被所有强大的复杂功能搞糊涂。它还允许我们的销售团队向上销售。

当然,正如其他人所指出的那样,如果我们发现某项功能导致性能下降,我们可以简单地关闭该功能(对于所有客户端或导致问题的客户端)。