当前位置:首页 > > 架构师社区
[导读]互联网产品需要快速迭代开发上线,又要保证质量,保证刚上线的系统,一旦出现问题可以很快控制影响面,就需要设计一套灰度发布系统。


灰度发布的定义

互联网产品需要快速迭代开发上线,又要保证质量,保证刚上线的系统,一旦出现问题可以很快控制影响面,就需要设计一套灰度发布系统。

灰度发布系统的作用,可以根据配置,将用户的流量导到新上线的系统上,来快速验证新的功能,而一旦出现问题,也可以马上的修复,简单的说,就是一套A/B Test系统。

灰度发布允许带着bug上线,只要bug不是致命的,当然这个bug是不知道的情况下,如果知道就要很快的改掉

简单灰度发布系统的设计

CTO点名要搞个灰度发布系统,不慌!

灰度简单架构如上图所示,其中的必要组件如下:

  1. 策略的配置平台,存放灰度的策略

  2. 灰度功能的执行程序

  3. 注册中心,注册的服务携带ip/Port/name/version

有了上面三个组件,才算一个完整的灰度平台

灰度的策略

灰度必须要有灰度策略,灰度策略常见的方式有以下几种

  1. 基于Request Header进行流量切分

  2. 基于Cookie进行流量切分

  3. 基于请求参数进行流量切分

举例:根据请求中携带的用户uid进行取模,灰度的范围是百分之一,那么uid取模的范围就是100,模是0访问新版服务,模是1~99的访问老版服务。

灰度发布策略分为两类,单策略和组合策略

单策略:比如按照用户的uid、token、ip进行取模

组合策略:多个服务同时灰度,比如我有A/B/C三个服务,需要同时对A和C进行灰度,但是B不需要灰度,这个时候就需要一个tag字段,具体实现在下文详述

灰度发布具体的执行控制

在上面的简单灰度发布系统架构中我们了解到,灰度发布服务分为上游和下游服务,上游服务是具体的执行灰度策略的程序,这个服务可以是nginx,也可以是微服务架构中的网关层/业务逻辑层,下面我们就来分析一下不同的上游服务,如何落地

Nginx

如果上游服务是nginx,那么就需要nginx通过Lua扩展nginx实现灰度策略的配置和转发,因为nginx本身并不具备灰度策略的执行

通过lua扩展实现了灰度策略的执行,但是问题又来了,nginx本身并不具备接收配置管理平台的灰度策略,这个时候应该怎么办呢?

解决方案:本地部署Agent(需要自己开发),接收服务配置管理平台下发的灰度策略,更新nginx配置,优雅重启Nginx服务

网关层/业务逻辑层/数据访问层

只需要集成配置管理平台客户端SDK,接收服务配置管理平台下发的灰度策略,在通过集成的SDK进行灰度策略的执行即可

灰度发布复杂场景

下面举例两个稍微复杂的灰度发布场景,灰度策略假设都按照uid取模灰度百分之一的用户,看一下如何实现。

场景1:调用链上同时灰度多个服务

功能升级涉及到多个服务变动,网关层和数据访问层灰度,业务逻辑层不变,这个时候应该如何进行灰度?

解决方案:

经过新版本网关层的请求,全部打上tag T,在业务逻辑层根据tag T进行转发, 标记Tag T的请求全部转发到新版数据访问层服务上,没有tag T的请求全部转发到老版数据访问层上。

CTO点名要搞个灰度发布系统,不慌!

场景2:涉及数据的灰度服务

涉及到数据的灰度服务,一定会使用到数据库,使用到数据库就会涉及到你使用数据库前后的表字段不一致,我老版本是A/B/C三个字段,新版本是A/B/C/D四个字段。这时新版的灰度,就不能往老版的数据库进行修改了,这个时候就需要把数据copy一份出来做这个事情了

数据库其实并没有灰度的概念,这个时候我们只能把数据重新拷贝一份出来进行读和写,因为这时你的写必须是全量的(双写),不能说90%的数据写入到老版本,10%的数据写入到新版本,因为这个时候你会发现两个数据库的数据都不是全量的。

离线全量复制数据的过程中一定会有数据丢失,这个时候就需要业务逻辑层写一份数据到MQ中,等数据同步完成之后,新版的数据访问层再将MQ的数据写入到新版本的DB中,实现数据的一致性,这个也是引入MQ的主要目的。

CTO点名要搞个灰度发布系统,不慌!

灰度过程中需要对两个数据库的数据进行对比,观察数据是否一致。这样不管是灰度失败,放弃新版DB,还是灰度成功切换到新版DB,数据都不会产生丢失。



	

免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭