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

引言

在现代软件开发和部署中,零停机部署技术是实现高可用性和无缝用户体验的关键。本文将讨论功能开发开关(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 ALGORITHMif (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。

参考文献

  • https://martinfowler.com/articles/feature-toggles.html
  • https://book.douban.com/subject/36457109/
  • https://juejin.cn/post/7368777511952924698

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/855782.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

即时到账支付系统源码第四方支付平台源码(支付宝/QQ钱包/微信二维码收款+附配套软件)

即时到账支付系统源码第四方支付平台源码价值10万,支付宝/QQ钱包/微信二维码收款,附配套软件 开发语言:phpmysql 这个是一个可以跟码支付一样用自己的二维码收款的网站 还可以作为即时到账 代收款 或者易支付使用后台配置好就行&#xff…

python 微信群发工具

效果如下 python 微信消息群发工具 1、环境安装依据python手机app自动化测试环境搭建-CSDN博客 2、元素获取 启动uiautomatorviewer.bat工具,如下图 点击获取手机界面,如下图 3、根据获取的界面元素id或class名称编写代码 python简易代码如下 from appium import webdrive…

2024.06.19 刷题日记

41. 缺失的第一个正数 这个题目的通过率很低,是一道难题,类似于脑筋急转弯,确实不好想。实际上,对于一个长度为 N 的数组,其中没有出现的最小正整数只能在 [1,N1] 中。 这个结论并不好想,举个例子&#x…

移动硬盘在苹果电脑上无法识别的诊断与恢复策略

一、问题描述 在数字时代,移动硬盘已成为我们存储和传输数据的重要工具。然而,当我们将移动硬盘插入苹果电脑时,有时会遇到无法识别的情况,这让我们感到十分困扰。本文将详细探讨移动硬盘插苹果电脑后读不出来的现象,…

浸没式液冷服务器的换热效率及节能潜力分析

服务器浸没式液冷的换热效率及节能潜力 摘要:我们针对服务器浸没式液冷实验台进行了深入测试,探究了不同室外温度和服务器发热功率对系统制冷PUE的影响。实验数据显示,该系统的制冷PUE值介于1.05至1.28之间,高效节能特点显著。 在…

坚持刷题|反转链表

文章目录 题目思考实现1. 迭代方式实现链表翻转2. 递归方式实现链表翻转 Hello,大家好,我是阿月。坚持刷题,老年痴呆追不上我,今天继续链表:反转链表 题目 LCR 024. 反转链表 思考 翻转链表是一个常见的算法问题&a…

为什么带上符号位计算,仍然可以算出正负数对应的补码

文章目录 🚀前言🚀 为什么要引入原反补码✈️ 利用加法表示减法✈️ 关于数字在计算机中的存储🚀 数学解释 🚀 为什么带上符号位计算,仍然可以算出正负数对应的补码 🚀前言 为应付期末,速成数电…

Linux系统之配置Nginx负载均衡

Linux系统之配置Nginx负载均衡 一、Nginx介绍1.1 Nginx简介1.2 Nginx反向代理1.3 相关概念二、本次实践介绍2.1 本次实践简介2.2 本次实践环境规划三、部署两台web服务器3.1 运行两个Docker容器3.2 编辑测试文件四、配置负载均衡4.1 安装nginx软件4.2 编辑nginx配置文件4.3 启动…

基于PHP的奶茶商城系统

有需要请加文章底部Q哦 可远程调试 基于PHP的奶茶商城系统 一 介绍 此奶茶商城系统基于原生PHP开发,数据库mysql,ajax实现数据交换。系统角色分为用户和管理员。系统在原有基础上添加了糖度的选择。 技术栈 phpmysqlajaxphpstudyvscode 二 功能 用户…

CVE-2020-1957 漏洞复现

先声明一下,免杀还是会更的,不过中间可能会穿插一下渗透的内容!!! 踩坑点: 在一开始翻阅了CSDN之后,发现不同文章之间存在出入,于是最后去了CVE的官方文档,和参考一些国…

【TB作品】MSP430G2553,单片机,口袋板, 交通灯控制系统

题8 交通灯控制系统 十字路口交通灯由红、绿两色LED显示器(两位8段LED显示器)组成,LED显示器显示切换倒计时,以秒为单位,每秒更新一次;为确保安全,绿LED计数到0转红,经5秒延时&#…

深度学习(十三)——损失函数与反向传播

一、损失函数:Loss Function 官网文档:torch.nn — PyTorch 2.0 documentation 1. Loss Function的作用 每次训练神经网络的时候都会有一个目标,也会有一个输出。目标和输出之间的误差,就是用\(Loss\) \(Function\)来衡量的。所以…

UniAudio 1.5:大型语言模型(LLMs)驱动的音频编解码器

大型语言模型(LLMs)在文本理解和生成方面展示了卓越的能力,但它们不能直接应用于跨模态任务,除非进行微调。本文提出了一种跨模态上下文学习方法,使未进行进一步训练的LLMs能够在少量示例的情况下,无需任何…

【吊打面试官系列-Mysql面试题】Myql 中的事务回滚机制概述 ?

大家好,我是锋哥。今天分享关于 【Myql 中的事务回滚机制概述 ?】面试题,希望对大家有帮助; Myql 中的事务回滚机制概述 ? 事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位…

CSS3基本语法

文章目录 一、CSS引入方式二、选择器1、标签选择器2、类选择器3、id选择器4、通配符选择器 三、字体操作1、字体大小2、字体粗细3、字体样式(是否倾斜)4、字体修改常见字体系列 修改字体系列语法 四、文本操作1、文本缩进2、文本水平对齐方式3、文本修饰…

进阶篇05——存储过程、存储函数、触发器

存储过程 简介 基本语法 创建和调用 -- 创建名为p1的存储过程,小括号里可以跟参数 -- 存储过程个人觉得就是SQL里的函数 create procedure p1() begin-- begin 和 end 之间是封装的SQL语句-- 可以是一条SQL也可以是多条SQLselect * from student; end;-- 调用存储…

c++中string的用法

STL的简介 一.什么是STL二.STL的六大组件2.1仿函数2.2空间配置器2.3 算法2.4 迭代器2.5容器2.6配置器 三.string类3.1string类3.2string类的常用接口说明代码示例运行结果 3.3string类对象的容量操作代码示例sizelengthcapcityempty resizereverse 3.4string类对象的访问及遍历…

JAVA - 注释

JAVA - 注释 单行注释多行注释文档注释 在计算机语言中,注释是计算机语言的一个重要组成部分,用于在源代码中解释代码的作用,可以增强程序的可读性,可维护性。Java 注释是一种在 Java 程序中用于提供代码功能说明的文本。注释不会…

今年618各云厂商的香港服务器优惠活动汇总

又到了一年618年中钜惠活动时间,2024年各大云服务器厂商都有哪些活动呢?有哪些活动包括香港服务器呢?带着这些问题,小编给大家一一讲解各大知名厂商的618活动有哪些值得关注的地方,如果对你有帮助,欢迎点赞…

2024年6月19日 (周三) 叶子游戏新闻

超市播音系统: 定时播放不同音乐 强制卸载软件: 一款强制卸载软件 人气漫改《忍者杀手》动作游戏7月24日登陆Switch角川游戏日前宣布,旗下人气漫改动作游戏《忍者杀手:火烧新琦玉》将于7月24日登陆Switch,本作已经上架Steam,感兴趣…