首页 > 其他分享 >零停机部署——特征开关(Feature Toggles)的应用

零停机部署——特征开关(Feature Toggles)的应用

时间:2024-06-19 12:30:28浏览次数:25  
标签:功能 return features Toggles 停机 Feature else 开关

引言

在现代软件开发和部署中,零停机部署技术是实现高可用性和无缝用户体验的关键。本文将讨论功能开发开关(Feature Toggles)的类型并分析它们的优缺点,同时提供相关的例子和演示。

PS: https://github.com/WeiXiao-Hyy/blog整理了后端开发的知识网络,欢迎Star!

功能开发(Feature Toggles)

功能开关是一种在运行时控制软件功能是否可见或可用的技术。它允许开发团队随时启用或禁用特定功能,从而实现零停机部署。

常见示例

function reticulateSplines() {
  var useNewAlgorithm = false;
  // useNewAlgorithm = true; // UNCOMMENT IF YOU ARE WORKING ON THE NEW SR ALGORITHM

  if (useNewAlgorithm) {
    return enhancedSplineReticulation();
  } else {
    return oldFashionedSplineReticulation();
  }
}

function oldFashionedSplineReticulation() {
  // current implementation lives here
}

function enhancedSplineReticulation() {
  // TODO: implement better SR algorithm
}

功能开关的种类

Release Toggles

  • 用于为实践持续交付的团队启用基于主干的开发。允许将正在进行的功能潜入共享集成分支(例如master分支)。
  • 将[功能]发布与[代码]部署分离的持续交付原则的最常见方法。

Experiment Toggles

用于测试多个A/B实验时,将根据用户信息切换路由,将给定用户路由到一个代码路径或另一个代码路径中。通常用于电商的购买流程或号召性用语等内容进行数据驱动性的优化。

Ops Toggles

称为降级开关,当推出一项对性能影响不明确的新功能时,可能会引入Ops Toggle,以便系统操作员在生产环境中快速禁用或降级该功能。

大多数特征开发在新功能稳定之后,该标志就应该退役了。然而,系统拥有少量长寿命“特征开关”的情况并不常见,这些开关允许生产环境的操作员在系统承受异常高负载时可以优雅降级非重要的系统功能。

Permission Toggles

该开关和金丝雀发布有点类似,指的是新功能可以只发布给内部指定用户使用(内测)但是金丝雀发布是随机选择一小部分用户,而该开关是指定一小部分用户集合。

如何实现特征开关

解耦决策逻辑点

const features = fetchFeatureTogglesFromSomewhere();

function generateInvoiceEmail() {
  const baseEmail = buildEmailForInvoice(this.invoice);
  if (features.isEnabled("next-gen-ecomm")) {
    return addOrderCancellationContentToEmail(baseEmail);
  } else {
    return baseEmail;
  }
}

上述代码虽然看起来是一个合理的方法,但是却非常脆弱。

  • 引入魔法值next-gen-ecomm;
  • 为什么发票电子邮件需要知道订单取消内容是下一代功能集的一部分?
  • 随着功能的开发,这种“切换范围”的变化是很常见,如果只向某些用户推出订单取消功能怎么办?
// featureDecision.js
function createFeatureDecisions(features) {
  return {
    includeOrderCancellationInEmail() {
      return features.isEnabled("next-gen-ecomm");
    }
  // ... additional decision functions also live here ...
  };
}

// invoiceEmailer.js
const features = fetchFeatureTogglesFromSomewhere();
const featureDecisions = createFeatureDecisions(features);

function generateInvoiceEmail(){
  const baseEmail = buildEmailForInvoice(this.invoice);
  if( featureDecisions.includeOrderCancellationInEmail() ){
    return addOrderCancellationContentToEmail(baseEmail);
  }else{
    return baseEmail;
  }
}

将决策逻辑点和业务逻辑解耦,需要添加新的功能时只需要添加featureDecision中的方法,在invoiceEmailer中调用featureDecision中的方法。

避免(if/else)

如果Toggle Point是使用if语句来实现的。这对于简单,短暂的切换是有效的。但是,如果某个功能需要多个切换点。,或者希望切换点长期存在,则不建议使用if/else来实现。可以使用策略模式来优化代码中的if/else

如何使用特征开关

动态路由或动态配置

真正需要在系统运行时动态切换开关存在以下两种场景:

  1. Ops Toggles 需要降级某个板块;
  2. Permission Toggles和Experiment Toggles需要动态路由用户的请求;

前者通过在运行期间修改开关的值是动态的,而后者切换路由本质上是动态的。实际上仍然有相当多的静态的配置,也许只能通过重新部署来更改。

如果需要在生产环境中使用更加通用的切换控制机制,最好使用真正的分布式配置系统来构建,并及时清理过时的feature toggle。

参考文献

标签:功能,return,features,Toggles,停机,Feature,else,开关
From: https://blog.csdn.net/qq_41124175/article/details/139799109

相关文章

  • TexQ: Zero-shot Network Quantization with Texture Feature Distribution Calibrati
    我们使用以下这六个标准对网络量化和相关领域的研究进行分类。以下是每个标准的详细解释,并结合了参考文献中的相关研究:研究领域:该标准将研究大致分为三个主要领域:量化:这是上传论文的核心焦点。它涉及减少模型参数的位宽(例如,从32位浮点数到4位整数)等技术,以压缩模型并提......
  • C# 12 new feature Collection Expression,Primary Consctructor,Generic type alias,
    usinglistOfInt=System.Collections.Generic.List<int>;namespaceConsoleApp36{internalclassProgram{staticvoidMain(string[]args){GenericTypeAlias();}staticvoidGenericTypeAlias()......
  • SpringBoot系列---【线程池优雅停机,避免消费数据丢数的问题】
    1.问题项目中通过kafka来对接上游,在项目中写一个listener监听topTopic队列,for循环消费records,在for循环中处理成存储到es的对象,一次拉50条,使用自定义线程池esThreadPool异步推送到es中,但是每次停机就会丢数据,例:kafka消费了1000条,但是往es中存储比较慢,优雅停机的时候,esThreadPool......
  • postgresql(14-15)升级(源库需要停机)
    环境:OS:Centos7旧版本:pg14新版本:pg15已经安装的插件mysql_fdw_14.x86_64postgis33_14.x86_64 1.查看当前的版本[root@dsc1~]#psql-hlocalhost-Upostgres-p5432psql(14.11)Type"help"forhelp.postgres=#selectversion();......
  • [Paper Reading] OFT Orthographic Feature Transform for Monocular 3D Object Detec
    OFTOrthographicFeatureTransformforMonocular3DObjectDetectionOFTOrthographicFeatureTransformforMonocular3DObjectDetection时间:18.11机构:UniversityofCambridgeTL;DR当时纯视觉自动驾驶方案效果上仅达到Lidar方案有10%的水平,本文claim部分差距源于pe......
  • allure功能使用-feature&story
    在测试类加注解@allure.feature表述整个测试模块在测试方法加注解@allure.story表述该模块下的某个测试案例或测试场景执行指定模块或执行测试场景时,可以执行下面命令(allure.feature比allure.story优先级高)pytest-s-v测试文件--allure-feature("模块名")pytest-s-v测试文件......
  • 《A Discriminative Feature Learning Approach for Deep Face Recognition》阅读笔记
    论文标题《ADiscriminativeFeatureLearningApproachforDeepFaceRecognition》一种用于深度人脸识别的判别性特征学习方法作者YandongWen、KaipengZhang、ZhifengLi和YuQiao来自深圳市计算机视觉与专利重点实验室、中国科学院深圳先进技术研究院和香港中文大学......
  • 停机问题
    为什么停机问题是图灵不可计算问题?若人脑是图灵机那么举个例子:你在做一道题时,你想要知道你自己能不能在有限时间内做出这道题但是如果这道题是证明或证伪黎曼猜想那你就不知道你自己能不能在有限时间内做出这道题了因为你有可能一生都做不出来,也有可能某个灵感就做出来了,这个......
  • 掌握时间序列特征工程:常用特征总结与 Feature-engine 的应用
    时间序列数据的特征工程是一种技术,用于从时间序列数据中提取信息或构造特征,这些特征可用于提高机器学习模型的性能。以下是一些常见的时间序列特征工程技术:滚动统计量:计算时间窗口内的统计量,如平均值、中位数、标准偏差、最小值和最大值。这些统计量可以捕捉到时间序列在不同时......
  • Feature flag __VUE_PROD_HYDRATION_MISMATCH_DETAILS__ is not explicitly defined.
    由于defineModel在vue3.4版本才能使用,原有项目依赖为"vue":"^3.3.4", "@vitejs/plugin-vue":"^4.1.0",升级项目中vue版本后出现如下警告:Featureflag__VUE_PROD_HYDRATION_MISMATCH_DETAILS__isnotexplicitlydefined.Youarerunningtheesm-bund......