设计模式学习笔记 - 项目实战三:设计实现一个支持自定义规则的灰度发布组件(设计)

概述

上篇文章,我们介绍了灰度组件的一个需求场景,将公共服务平台的 RPC 接口,灰度替换为新的 RESTful 接口,通过灰度逐步放量,支持快速回滚等手段,来规避代码质量问题带来的不确定性风险。

跟前面两个框架类似,灰度组件的功能性需求比较简单。在上篇文章我们做了简单的分析,本章再介绍一下,这个组件的非功能性需求,以及如何通过合理的设计来满足这些非功能性需求。


非功能性需求

对于限流框架,我们主要从易用性、扩展性、灵活性、性能、容错性这几个方面,来分析它的非功能性需求。对于灰度组件,也从这几个方面来分析。

易用性

在前面讲到限流框架和幂等框架的时候,我们都提到了 “低侵入松耦合” 的设计思想。因为框架集成到业务系统中使用,我们希望它尽可能低侵入,与业务代码松耦合,替换、移除起来更容易些。因为接口的限流和幂等跟具体的业务是无关的,我们可以把限流和幂等相关的逻辑,跟业务代码解耦,统一放到公共的地方来处理(比如 Spring AOP 切面中)。

但是对于灰度来说,我们实现的灰度功能是代码级别的细粒度的灰度,而替代掉原来的 if-else 逻辑,是针对一个业务一个业务来做的,跟业务强相关,要做到跟业务代码完全解耦,是不现实的。所以,在侵入性这一点上,灰度组件只能做拖鞋,容忍一定程度的侵入

此外,在灰度的过程中,我们要不停地修改灰度规则,在测试没有出现问题的情况下,逐渐放量。从运维的角度来说,如果每次修改灰度规则都要重启系统,显然是比较麻烦的。所以,我们希望灰度支持热更新,也就是说,当我们在配置文件中修改了灰度规则之后,系统在不重启的情况下会自动加载、更新灰度规则。

扩展性、灵活性

跟限流框架一样,我们希望支持不同格式(JSON、YAML、XML 等)、不同存储方式(本地配置文件、Redis、Zookeeper、或者字眼配置中心等)的灰度配置方式。这一点在限流框架中已经详细讲解过了。

此外,对于灰度规则本身,上篇文章的示例中,我们定义了三种灰度规则语法格式:具体指(比如 893)、区间值(比如 1020-1120)、比例值(比如 %30)。不过,这只能处理比较简单的灰度规则。如果我们要支持更复杂的灰度规则,比如只对 30 天内购买过的某某商品并且退货次数少于 10 次的用户进行灰度,现在的灰度规则是无法支持的。所以,如何支持更加灵活的、复杂的灰度规则,也是我们设计实现的重点和难点

性能

在性能方面,灰度组件的处理难度,并不像限流框架那么高。在限流框架中,对分布式限流模式,接口请求访问计数存储在中心存储器中,比如 Redis。而 Redis 本身的读写性能以及限流框架与 Redis 的通信延迟,都会很大地影响到限流本身的性能,进而影响到接口响应时间。所以,对于分布式限流来说,低延迟高性能是设计的难点和重点。

但是,对于灰度组件来说,灰度的判断逻辑非常简单,而且不涉及访问外部存储,所以性能一般不会有太大的问题。不过,我们仍然要把灰度规则组织成快速查找的数据结构,能够支持快速判定某个灰度对象(darkTarget,比如用户 ID)是否落在灰度规则设定的区间内。

容错性

在限流框架中,我们要求高容错,不能因为框架本身的异常,导致接口响应超时。从业务上讲,我们一般能容忍限流框架的暂时、小规模的失效,所以,限流框架对于异常的处理原则是,尽可能捕获所有异常,并且内部 “消化” 掉,不要往上层业务代码中抛出。

对于幂等框架来说,我们不能容忍暂时、小规模的失效,因为这种失效会导致业务可能多次被执行,发生业务数据的错误。所以,幂等框架对于异常的处理原则是,按照 fail-fast 原则,如果异常导致幂等框架无法正常执行,让业务代码也中止。因为业务失败,比业务执行出错,修改的成本更低。

对于灰度组件来说,上面的两种异常的处理思路都是可以接受的。在灰度组件出现异常时,我们既可以选择中止业务,也可以选择让业务继续执行。如果让业务继续执行,本不应该被灰度到的业务对象,就有可能被执行。这是否接受,还是要看具体业务。不过,我个人更倾向于采用类似幂等框架的处理思路,在出现异常时中止业务。

框架设计思路

根据刚刚对灰度组件的非功能性需求分析,以及跟限流框架、幂等框架非功能性需求的对比,我们可以看出,在性能和容错性方面,灰度组件并没有特别要处理的地方,重点需要关注易用性、扩展性、灵活性

首先,我们来看,如何支持更灵活、更复杂的灰度规则。

灰度规则的配置也是跟业务强相关的。业务方面需要根据灰度的业务特点,找到灰度对象(比如用户 ID),然后按照给出的灰度规则语法格式,配置响应的灰度规则。

对于像刚刚提到的那种复杂的灰度规则(只对 30 天内购买过的某某商品并且退货次数少于 10 次的用户进行灰度),通过语法定义规则来支持,是很难实现的。所以,针对复杂灰度规则,我们换个思路来实现。

暂时有两种解决办法。其中一种是使用规则引擎,比如 Drools,可以在配置文件中调用 Java 代码。另外一种是支持编码实现灰度规则,这样做灵活性更高。不过,缺点是更新灰度规则需要更新代码,重新部署。

对于大部分业务的灰度,使用前面定义的最基本的语法规则(具体值、区间值、比例值)就能满足了。对于极个别复杂的灰度规则,我们借鉴 Spring 的编程配置,由业务方编程实现,具体如何来做,放到下篇文章来讲解。这样基既兼顾了易用性,又兼顾了灵活性。

之所以选择第二种实现方式,而不是使用 Drools 规则引擎,主要是出于不想为了不常用的功能,引入复杂的第三方框架,提高开发成本和灰度框架本身的学习成本。

其次,我们来看,如何实现灰度规则热更新。

规则热更新这样一个功能,并非灰度组件特有的,很多场景下都有类似的需求。

灰度规则的人更新实现起来并不难。我们创建一个定时器,每个固定时间(比如 1 分钟),从配置文件中读取灰度规则配置信息,并且解析加载到内存中,替换掉老的灰度规则。需要特别强调的是,更新贵都规则,设计读取配置、解析、构建等一系列曹组,会花费较长的时间,我们不能因为更新规则,就暂停了灰度服务。所以,在设计和实现灰度规则更新时,我们要支持更新和查询并发执行。具体如何来做,我们留在下篇文章详细讲解。

总结

本章,我们对比限流框架、幂等框架,讲解了灰度组件的非功能性需求,主要包含 易用性、扩展性、灵活性、容错性这样几个方面,并且针对性地解释了对应地设计思路。

易用性方面,我们重点讲解了 “低侵入、松耦合” 的设计思想。限流、幂等框架因为其跟业务无关,可以做到最大程度跟业务解耦,做到低侵入。但是,我们这里实现的代码层面的灰度,因为跟业务强相关,所以,跟业务代码耦合比较紧密,比较难做到低侵入

扩展性、灵活性方面,除了像限流框架那样,支持各种格式、存储方式的配置方式之外,灰度组件还希望支持复杂的灰度规则。对于大部分业务的灰度,使用最基本的语法规则(具体指、区间值、比例值)就能满足了。对于极个别复杂的灰度规则,我们解决 Spring 的编程式配置,由业务方编程实现。

性能方面,灰度组件没有需要特殊处理的地方。我们只需要把灰度规则组织成快速查找的数据结构,能够支持快速判定某个灰度对象(比如用户 ID),是否落在灰度规则设定的区间内

容错性方面,限流框架要高度容错,容忍短暂、小规模的限流失效,但不容忍框架异常导致的接口响应异常。幂等框架正好相反,不容忍幂等功能的失效,一旦出现异常,幂等功能失效,我们的处理原则是让业务也失败。这两种处理思路都可以用在灰度组件对异常的处理中。个人更倾向于采用幂等框架的处理思路。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

knife4j swagger 使用笔记

1.接口访问的端口跟后台设置的不一致,接口请求无反应 处理办法 2.响应参数不显示问题 (1)返回的参数里面一定要有响应的参数对象,如下: (2)TableDataInfo 定义成泛型类 TableDataInfo package…

移动应用安全

移动应用安全 移动应用安全主要关注Android、iOS、Windows Phone等平台上移动应用软件安全状态。它涉及应用程序在其设计运行的平台上下文中的安全问题、它们使用的框架以及预期的用户集。所有主流的移动平台都提供大量可选的安全控制,旨在帮助软件开发人员构建安全…

浅析扩散模型与图像生成【应用篇】(十八)——ControlNet

18. Adding Conditional Control to Text-to-Image Diffusion Models 现有的文生图模型如Stable Diffusion通常需要人工输入非常准确的提示词,而且生成的结果还是完全随机不可控制的,只能通过生成多个结果,再从中选取最佳方案。而ControlNet的…

竞争分析:波特五力模型

波特五力模型是分析企业竞争环境的一个分析模型。 根据波特的观点,每家企业都受到“直接竞争对手、顾客、供应商、潜在新进公司和替代性产品”这五个“竞争作用力”的影响。 我们用波特五力模型试着分析下实体书店竞争是否激励。 直接竞争对手:如果直接…

料堆体积测量新方案:激光雷达

激光雷达测量料堆体积是一种高效且精确的方法。激光雷达的工作原理与雷达相似,通过发射激光束探测目标的位置、速度等特征量。在测量料堆体积时,激光雷达系统向料堆发射激光束,然后接收从料堆表面反射回来的信号。通过对这些反射信号的处理和…

Linux网络之DNS域名解析

一、DNS概述 1.1什么是DNS 域名解析协议,将域名转换成IP地址 1.2为什么要用DNS IP地址不便于记忆,DNS使用户可以通过易记的域名快速访问各种网络资源。 192.168.0.0—— ip地址过长而且都是数字,不方便记忆就出现了域名 www.baidu.com—…

记一次线上日志堆栈不打印问题排查(附:高并发系统日志打印方案可收藏)

目录 一.线上的日志堆栈不打印了二.一步一步仔细排查三.最后搞定四.聊一聊线上日志到底应该怎么打印4.1 日志打印的诉求4.2 常见的系统日志上报方案4.2.1 ELK 方案4.2.2 自定义log appender 完成应用日志采集. 4.3 日志常见框架傻傻分不清4.4 日志在高并发系统中需要注意的 tip…

神仙级Python入门教程,手把手教你从0到精通,学不会算我输!

亲爱的朋友们,你是否对编程充满好奇,却觉得它遥不可及? 你是否想学习一门强大的编程语言,却不知从何下手? 那么,这篇“神仙级”Python入门教程就是为你量身打造的!不论你是编程小白还是有一定…

linux笔记4--shell命令1

文章目录 一. 目录1.说明2.盘符3.linux根目录(以Ubuntu为例)①说明②根目录下一些文件夹的解析/home/root/mnt/media/var/cdrom/etc/lib (/lib32--32位的,/lib64-64位的)/lostfound/boot/proc/bin/sbin/snap/srv/usr/opt/dev/run/tmp 二. ls命令--操作文件夹1.说明2…

探索阿里巴巴商品详情API接口:开启电商数据之旅

阿里巴巴商品详情API接口是阿里巴巴开放平台提供的一项服务,它允许开发者通过调用接口获取指定商品的详细信息,包括商品标题、价格、库存、描述、图片等。这些数据对于电商从业者来说具有极高的价值,可以帮助他们更好地了解市场动态&#xff…

层次分析法(AHP)计算原理解释

AHP层次分析法是一种解决多目标复杂问题的定性和定量相结合进行计算决策权重的研究方法。该方法将定量分析与定性分析结合起来,用决策者的经验判断各衡量目标之间能否实现的标准之间的相对重要程度,并合理地给出每个决策方案的每个标准的权数&#xff0c…

vue下载文件时显示进度条

1.单个下载&#xff08;开始是导出按钮 下载显示进度条&#xff09; html <el-button click.stop"exportReport(scope.row, scope.index)" v-if"!scope.row.schedule" icon"el-icon-download"size"small" type"text"styl…

Linux第十五章

&#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练&#xff0c;题解C&#xff0c;C的使用文章&#xff0c;「初学」C&#xff0c;linux &#x1f525;座右铭&#xff1a;“不要等到什么都没有了…

系统思考—企业辅导咨询

从2004年、2014年到2024年&#xff0c;国九条政策的发布与变迁不仅影响了行业趋势&#xff0c;更深刻地改变了企业的风险预估和策略辅导。彼得杜鲁克曾经说过&#xff1a;“必须系统地抛弃旧知识。”这不仅是企业领导者的挑战&#xff0c;也是我们每个人的难题。难点不在于我们…

GITEE 基于OAuth2的API V5版本

为了构建更好的码云生态环境&#xff0c;我们推出了基于OAuth2的API V5版本。 API V5接口使用方式以及Url都参照GitHub&#xff0c;为了各位开发者更好的兼容已经存在的第三方应用。 API 使用条款 OSCHINA 用户是资源的拥有者&#xff0c;需尊重和保护用户的权益。不能在应用…

Spring AI 抢先体验,5 分钟玩转 Java AI 应用开发

作者&#xff1a;刘军 Spring AI 是 Spring 官方社区项目&#xff0c;旨在简化 Java AI 应用程序开发&#xff0c;让 Java 开发者像使用 Spring 开发普通应用一样开发 AI 应用。 Spring Cloud Alibaba AI 以 Spring AI 为基础&#xff0c;并在此基础上提供阿里云通义系列大模…

XY_RE复现(二)

一&#xff0c;何须相思煮余年 0x55 0x8b 0xec 0x81 0xec 0xa8 0x0 0x0 0x0 0xa1 0x0 0x40 0x41 0x0 0x33 0xc5 0x89 0x45 0xfc 0x68 0x9c 0x0 0x0 0x0 0x6a 0x0 0x8d 0x85 0x60 0xff 0xff 0xff 0x50 0xe8 0x7a 0xc 0x0 0x0 0x83 0xc4…

编译Qt6.5.3LTS版本(Mac/Windows)的mysql驱动(附带编译后的全部文件)

文章目录 0 背景1 编译过程2 福利参考 0 背景 因为项目要用到对MYSQL数据库操作&#xff0c;所以需要连接到MYSQL数据库。但是连接需要MYSQL驱动&#xff0c;但是Qt本身不自带MYSQL驱动&#xff0c;需要自行编译。网上有很多qt之前版本的mysql驱动&#xff0c;但是没有找到qt6…

SiO2杂化纳米纤维膜

SiO2杂化纳米纤维膜是一种结合了二氧化硅&#xff08;SiO2&#xff09;纳米颗粒和其他材料&#xff08;如聚合物&#xff09;的复合纳米纤维膜。这种膜材料结合了SiO2的良好性能&#xff08;如高硬度、高耐磨性、热稳定性等&#xff09;和其他材料的特性&#xff08;如柔韧性、…

【XR806开发板试用】基于XR806实现智能小车

一、实验功能&#xff1a; 1、 基于XR806实现WIFI连接路由器 2、 XR806设备创建TCP socket服务器&#xff0c;局域网内通过PC端TCP客服端连接XR806 TCP服务器进行指令控制小车运行&#xff08;指令&#xff21;&#xff1a;前进、&#xff22;&#xff1a;后退、&#xff23;&…
最新文章