Answers:
“功能标记”(或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)的其他想法。
功能标记是一种无需配置即可通过配置关闭应用程序某些功能的技术。
功能标记在CI方案中扮演着关键角色,在CI方案中,功能不断地部署,但不一定“发布”到生产中。
更多信息在这里:
-编辑:
功能标志,功能切换,实验和受控展开是一个简单但功能强大的主意的同义词:从功能展开中部署单独的代码。简而言之,它是将功能的承诺提交生产的能力,同时可以选择客户中的谁(如果有的话)来查看该功能。
它们部分被Facebook的Gatekeeper所普及。LinkedIn的LiX是另一个很好的例子。
拥抱这个简单的想法为许多最佳实践奠定了基础,包括:
持续部署/交付 -一天内将多个代码推送到生产环境中。
干线/主线开发 -仅应为请求请求创建功能分支,而不应为长期的功能开发创建功能分支。
没有更多的释放火车来使事情陷入困境。
生产中的质量检查/性能测试 -真正的质量检查和性能测试是在具有生产流量的生产基础架构上进行的。不要浪费时间来建立广泛的性能实验室和过渡环境。
实验 -了解新功能如何在KPI上移动针头。
发生问题时避免修补程序或代码回滚 -修补程序和代码回滚都很紧张,需要很长时间,并且会导致不必要的问题。相反,请关闭该功能或将其降低。
其他人提到了开源库。像关守和的LiX - -一个完整的解决方案的一个很好的例子是分割。我为斯普利特工作。
这里有很多不错的答案,所有答案都是基于Martin Fowler帖子中流行的重要基本定义:
它们是一些代码,“ [允许]团队在不更改代码的情况下修改系统行为”。
因此,我们历来认为它们是由伪代码表示的:
if(app_settings["beta-mode"] == "true")
showAwesomeNewGui();
else
sameOldSnoozeFeset();
这是一种完全准确的思考方式,Matt和Adil都很好地扩展了功能标记,并使用了多种战术用例。
但是,我想提供一个修订的定义,以反映自dotnetdev提出原始问题以来六年来现实的发展和变化。我为功能标记平台Rollout.io工作,因此我在这种发展中处于前排。
简而言之,功能标记不再只是打开和关闭应用程序中某些功能的一种方式。就像说“这是一种说明和一种货币量”来回答“什么是发票行项目”。的确如此,但是它并不能驱动发票本身。
功能标记是现代软件中总体战略解决方案的战术部分。它们是您将代码中的重要决策逻辑推迟到运行时获得更多信息的方式。而且,也许最重要的是,它们不再只是孤立地出现,只需检查一下版本号是否大于2.7;使用它们的组织通常将它们包括在内,作为全面的系统范围产品方法的一部分。
正如其他人提到的那样,Facebook和LinkedIn率先做到了这一点,但是在2018年,很多组织都在这样做。他们将运行时的决策逻辑问题推迟到开发策略,操作策略(或DevOps策略,如果需要)和产品策略的一部分中。以下是此类问题的示例。
要使应用程序在运行前推迟大量此类决策,您不能以特设方式在应用程序中添加功能标志,否则您将陷入技术负担之中。如今,您需要一种全面的功能标志管理策略,其中包括一些不同的组件。
那么,到底什么是特征标记?
嗯,对于拥有可同时满足技术和市场需求的应用程序,它们是更广泛策略的重要组成部分。
功能标记(也称为功能翻转或功能切换)是用于根据需要启用或禁用潜在昂贵功能的开关(例如,当站点受到意外流量冲击时)。这将为您腾出一点时间,直到您扩大规模或负载高峰消失为止。
这是SWIG文档中的示例。
功能标志(或功能切换)使您可以在应用程序上远程启用功能,而无需重新构建/重新部署应用程序。这使您可以将代码部署到生产环境中,但在准备就绪之前不能发布功能。您可以定位到特定用户,因此可以为Beta用户启用一项新功能以进行测试。
在我们公司,我们以前用过LaunchDarkly以及其他建议FeatureFlags.io。我们还尝试使用Firebase的Remote config尝试使此工作生效,但是我们发现它并不真正适合此目的。
我们最终开发了自己的名为Bullet Train的版本,该版本已开源。它结合了功能标志/切换和远程配置。
功能标志用于多种目的。总体思路是将控制权授予哪个用户可以看到某种功能到某个远程仪表板或后台。
在代码中标记了功能后,您现在可以使用多种方法来确定哪个用户在您的应用程序中看到了该功能:1. 开/关 -向所有用户或不向任何用户显示该功能。2. 逐步发布 -仅向一部分用户显示该功能,然后逐步向所有用户显示该功能。3. 定位 -根据特定用户的属性或特征向该特定用户显示该功能。
有助于控制功能标记(布尔值)和功能配置(字符串,数字等)的工具通常称为功能管理平台 。功能管理的一项出色服务称为Configz.io。
从编码的角度来看,功能标志可以像一条if
语句一样简单,该语句将您正在编写的新代码包裹起来。当该if
语句的值为真(功能标志打开)时,将执行新代码。
在交付软件的真实示例中,上述if
陈述会根据软件所运行的环境而对评估结果有所不同。例如,如果在您的QA服务器上执行应用程序,则功能标志将返回true,而新功能将为看过。如果正在生产服务器上执行,功能标志将返回false,并且该功能将被隐藏。
从我在职业生涯中的亲身经历,我以下列方式使用功能标记:
使代码部署与向客户发布功能脱钩。这是我在开发过程中首次使用功能标志。我们使用它消除了营销和产品团队与进行开发和发布的工程团队之间的依赖。功能标记使我们可以在发布前几周部署代码,而以前我们是在发布前一晚部署代码!
在生产中进行测试。在发布代码时使用功能标记之前,这是一个全有或全无的事件,要么我们所有的客户都获得了功能,要么他们都没有。我们使用功能标志来允许我们一次向一小部分用户推出新功能。这使我们能够收集有关新功能的宝贵反馈和数据,而不会给整个客户群带来任何潜在风险。
在开发生命周期中为每个环境启用/禁用功能。我们在开发中广泛使用了此功能,以允许更顺畅的部署过程-我们拥有CI / CD管道,在其中使用功能标志至关重要。
创建一个终止开关。我们使用功能标志包装了我们应用程序的某些功能,当我们当时遇到任何问题时,该功能标志使我们可以“杀死”该功能。例如,如果我们发现自己承受了沉重的负担,则可以关闭网站的某些非必要功能来解决此问题。
您可以通过多种方式向代码中添加功能标志。
起初,编写自己的库似乎是个好主意,通常可以以这种方式开始。但是,当您要实现功能标记的更高级用例(例如扩展到一定比例的用户或针对特定用户组)时,很快就会遇到问题。创建自己的功能标志实现的另一个问题是,如果您使用多种语言,则需要多次实现代码。
使用功能标记的最好和最简单的方法是使用在线功能标记管理服务,例如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在这里非常详细地介绍了功能标志,我建议您阅读。
我的理解是,功能标志可以通过确定哪些用户接收某些功能来帮助您选通功能。
例如,假设您只希望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的功能标志 -似乎运行良好。您也可以在此站点上查看功能切换和功能标志库。
功能标志基本上使您能够打开和关闭功能,而无需在代码上进行任何更改或发布新版本。对于移动应用程序开发人员而言,这是一个重要的解决方案,因为他们无法控制用户将其应用程序更新到新版本。
有几家公司为移动应用程序开发人员提供此服务。
在我公司,我们对SaaS应用程序中引入的每个新功能都使用功能标记。除了对性能的好处外,它还使我们能够逐步推出新功能-首先向高级用户介绍新功能,从他们那里获得反馈并即兴进行,然后才能将其推广给所有用户。
它还允许我们为单个用户定制产品-高级用户需要所有功能;简单的用户可能只想要基本的东西,并且可能会对所有强大的复杂功能感到困惑。这也使我们的销售团队可以追加销售。
当然,正如其他人指出的那样,如果我们发现某个功能导致性能下降,我们可以简单地关闭一项功能(针对所有客户端或导致问题的一个客户端)。