什么是“功能标志”?


Answers:


104

“功能标记”(或Feature Toggle)是一种能够轻松地打开/关闭应用程序的功能(子部分)的功能:

  • 也许通过重新部署,或者
  • 一些内部页面,可以实时切换页面/功能。

我猜有一个例子,如果需要,例如,如果负载太高,减少控件的查询,则有一些控件可以方便地减少功能集。

不过,您还有很多其他原因要使用它-启用持续交付的主要原因之一是:将产品推入生产/实时状态,但禁用/切换功能直至完成。我们经常使用所谓的“开发Cookie”向开发团队展示未完成的功能。这样,我们可以在“发布”(完成)并向公众公开之前,在多个发行/部署中测试生产中部分完成的工作(哦,还有更好的集成吗?)。

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

福勒的文章比上面链接的文章长得多,有很多详细信息

这篇文章(也在Fowler的网站上)解释了各种切换策略DevCookie支持基于主线/中继的策略,在本文中称为“ Release Toggle ”。

阿迪尔(Adil)的回答突出表明,您可能需要许多基础设施,并且有很多术语和原因。请记住,您可能只需要其中一些东西。例如,我可能只想启用一个简单而灵活的部署/交付工作流,因此简单的基础架构就足够了。然后,如果您选择进入A / B,队列测试和受控推出等完整的#leanstartup实验,则应考虑使用一种分析工具(例如Heap),该工具可将那些数据驱动的开发方法作为一种独特的解决方案。完成上述所有操作的切换基础结构将导致膨胀和不必要的复杂性。

如果到此为止,那么您可能想看看我对Mainline Development,功能切换和其他一些愚蠢的想法(例如TEST,QA,SIT,STAND,CROUCH)的其他想法


1
有趣的是,无论我建造什么,我总是想像同一件事。那可能是一个有效的功能。
GurdeepS 2011年

7
通常,您会发现这样的事情看起来很明显。原来有人总想出一个名字。
Matt Kocaj 2011年

27

功能标记是一种无需配置即可通过配置关闭应用程序某些功能的技术。

功能标记在CI方案中扮演着关键角色,在CI方案中,功能不断地部署,但不一定“发布”到生产中。

更多信息在这里:

-编辑:

Feature Flags Java实现


3
在“持续部署”中对此进行了很好的描述,这几乎是“主线”开发的要求。无需在SCM中为功能进行分支,而是可以打开或关闭功能,从而使您可以释放尚未启用的功能的代码。
Chip McCormick

只是关于“通过配置,而不部署新代码”的注释:似乎该语句意味着更改配置,然后再次部署应用程序(甚至可能没有代码更改)。根据您的部署管道,这仍然可能需要几秒钟到几分钟的时间。功能标记或功能切换可能不会保留在配置中。它可能位于某个商店/数据库中,并且以“实时”方式运行-即,导航至某个管理页面,在该页面上按一下按钮即可在站点范围内立即启用某些行为(无需部署,无需更改配置)。
马特·科卡伊

1
我为ConfigCat.com工作,我看到它“更改配置而不部署新代码”的方式意味着该配置由功能标志服务提供,并且您的应用程序通过提取该配置文件来访问值。这样,您可以确定更改值不需要对应用程序进行任何形式的重新部署。最重要的是,它允许您创建规则,以便为一个用户提供值,为另一个用户提供值。所有功能标记评估都在客户端,这很酷,而所有这些逻辑都可以工作,而无需将任何数据推回功能标记服务。
sige


19

功能标志,功能切换,实验和受控展开是一个简单但功能强大的主意的同义词:从功能展开中部署单独的代码。简而言之,它是将功能的承诺提交生产的能力,同时可以选择客户中的谁(如果有的话)来查看该功能。

它们部分被Facebook的Gatekeeper所普及。LinkedIn的LiX是另一个很好的例子。

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

持续部署/交付 -一天内将多个代码推送到生产环境中。

干线/主线开发 -仅应为请求请求创建功能分支,而不应为长期的功能开发创建功能分支。

没有更多的释放火车来使事情陷入困境。

生产中的质量检查/性能测试 -真正的质量检查和性能测试是在具有生产流量的生产基础架构上进行的。不要浪费时间来建立广泛的性能实验室和过渡环境。

实验 -了解新功能如何在KPI上移动针头。

发生问题时避免修补程序或代码回滚 -修补程序和代码回滚都很紧张,需要很长时间,并且会导致不必要的问题。相反,请关闭该功能或将其降低。

其他人提到了开源库。像关守和的LiX - -一个完整的解决方案的一个很好的例子是分割。我为斯普利特工作。


我认为重要的是,不要仅为了支持CI的AB /队列/精益实验而混淆特征标记-目标是不同的。例如,使用功能切换将某些东西放入Prod中进行质量检查/验收可能是帮助CI / CD的简单工具,在这种情况下,Split可能会过大。再说一次,如果您想进行精益实验或A / B测试,那么您可能需要一个不错的分析工具,例如Heap,并内置其他工具和遥测报告。我不喜欢合并这两个目标的想法-好像您可能很容易肿。
马特·科卡伊

14

这里有很多不错的答案,所有答案都是基于Martin Fowler帖子中流行的重要基本定义:

它们是一些代码,“ [允许]团队在不更改代码的情况下修改系统行为”。

因此,我们历来认为它们是由伪代码表示的:

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

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

但是,我想提供一个修订的定义,以反映自dotnetdev提出原始问题以来六年来现实的发展和变化。我为功能标记平台Rollout.io工作,因此我在这种发展中处于前排。

简而言之,功能标记不再只是打开和关闭应用程序中某些功能的一种方式。就像说“这是一种说明和一种货币量”来回答“什么是发票行项目”。的确如此,但是它并不能驱动发票本身。

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

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

  • 谁应该看到我们正在推出的新管理屏幕,何时显示?
  • 要解锁此复活节彩蛋,需要什么级别的会员资格?
  • 我们什么时候应该切换到新数据库?
  • 我们是否应该在结帐按钮上放置猎豹或老鹰的图片以提高转化率?

要使应用程序在运行前推迟大量此类决策,您不能以特设方式在应用程序中添加功能标志,否则您将陷入技术负担之中。如今,您需要一种全面的功能标志管理策略,其中包括一些不同的组件。

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

那么,到底什么是特征标记?

嗯,对于拥有可同时满足技术和市场需求的应用程序,它们是更广泛策略的重要组成部分。


9

功能标记(也称为功能翻转或功能切换)是用于根据需要启用或禁用潜在昂贵功能的开关(例如,当站点受到意外流量冲击时)。这将为您腾出一点时间,直到您扩大规模或负载高峰消失为止。

这是SWIG文档中的示例


6
是的,这是功能标志的一种用法,但是,要理解的主要概念是它们将功能发布和代码部署分离开来,这样您就可以在需要时发布功能,而不是在代码发布时发布。这是持续集成的基石。
埃里克·埃利奥特

6

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

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

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


4

功能标志(或功能切换)使您可以在应用程序上远程启用功能,而无需重新构建/重新部署应用程序。这使您可以将代码部署到生产环境中,但在准备就绪之前不能发布功能。您可以定位到特定用户,因此可以为Beta用户启用一项新功能以进行测试。

在我们公司,我们以前用过LaunchDarkly以及其他建议FeatureFlags.io。我们还尝试使用Firebase的Remote config尝试使此工作生效,但是我们发现它并不真正适合此目的。

我们最终开发了自己的名为Bullet Train的版本,该版本已开源。它结合了功能标志/切换和远程配置。


4

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

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

有助于控制功能标记(布尔值)和功能配置(字符串,数字等)的工具通常称为功能管理平台 。功能管理的一项出色服务称为Configz.io。


3

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

在交付软件的真实示例中,上述if陈述会根据软件所运行的环境而对评估结果有所不同。例如,如果在您的QA服务器上执行应用程序,则功能标志将返回true,而新功能将为看过。如果正在生产服务器上执行,功能标志将返回false,并且该功能将被隐藏。

从我在职业生涯中的亲身经历,我以下列方式使用功能标记:

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

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

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

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

您可以在此处阅读有关功能标志的更多信息

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

  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在这里非常详细地介绍了功能标志,我建议您阅读。


2

我的理解是,功能标志可以通过确定哪些用户接收某些功能来帮助您选通功能。

例如,假设您只希望Beta版用户看到一项新功能。您可以为Beta用户“切换”该功能,而其余用户则看不到它。

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
 }

我正在为某些前端JS A / B测试测试LaunchDarkly的功能标志 -似乎运行良好。您也可以在此站点上查看功能切换和功能标志库


1

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

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


警惕这些。您无需集成其中一项服务即可创建一个简单的开关,该开关可用于隐藏PROD可见性/集成中的多个功能。您也不一定需要实时执行此操作-例如,当PROD部署仅需数分钟(出于许多其他原因而应对其进行优化)时,等待部署并不重要。
马特·科卡伊

2
此外,这里还比较了当前最好的功能标记服务:featureflagservices.io
sige

1

在我公司,我们对SaaS应用程序中引入的每个新功能都使用功能标记。除了对性能的好处外,它还使我们能够逐步推出新功能-首先向高级用户介绍新功能,从他们那里获得反馈并即兴进行,然后才能将其推广给所有用户。

它还允许我们为单个用户定制产品-高级用户需要所有功能;简单的用户可能只想要基本的东西,并且可能会对所有强大的复杂功能感到困惑。这也使我们的销售团队可以追加销售。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.