当前位置: 首页 > 科技观察

终于有人把灰度发布的架构设计解释清楚了_0

时间:2023-03-20 12:26:02 科技观察

灰度发布的定义。互联网产品需要快速迭代开发和上线。设计一个灰度发布系统。灰度发布系统的功能可以根据配置将用户的流量引导到新上线的系统,快速验证新功能,一旦出现问题可以第一时间修复。简单来说就是一套A/BTest系统。灰度发布允许有bug上线,只要bug不是致命的。当然,如果bug不为人知,如果知道了,就必须赶紧改变简单的灰度发布系统的设计。简单的灰度架构如上图所示。必要的组件如下:一个策略配置平台,一个存储灰度策略灰度函数的执行程序注册中心,以及携带ip/port/name/version的注册服务只有以上三个组件才能算是一个完整的灰度策略平台灰度一定要有灰度策略。灰度策略常用的方法有以下几种:基于RequestHeader的流量切分基于Cookie的流量切分基于请求参数的流量切分示例:根据请求中携带的内容用户uid取模,范围取模灰度为1%,所以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是仿照一个灰度为百分之一的用户,我们来看看如何实现。场景一:调用链上同时升级多个服务功能,涉及多个服务变更。网关层和数据访问层变灰,业务逻辑层不变。这个时候灰度应该怎么做呢?解决方案:所有来自新版本网关层的请求都打上tagT,在业务逻辑层根据tagT转发,所有打上TagT的请求都转发到新版本的数据访问层服务,以及所有不带标签T的请求转发到遗留数据访问层。场景二:涉及数据的灰度服务涉及数据的灰度服务,肯定会用到数据库。使用数据库会涉及到你使用数据库前后不一致的表字段。我的老版本是A/B/C字段,新版本是A/B/C/D四个字段。此时新版本的灰度无法修改为旧版本的数据库。这时候就需要复制数据来做这件事了。数据库其实没有灰度的概念。这时,我们只能重新复制数据。一份出来读和写,因为这个时候你的写必须是满的(doublewriting)。不能说90%的数据写到老版本,10%的数据写到新版本,因为这时候你会发现两个数据库的数据都不全。在离线全量数据复制的过程中,会出现数据丢失的情况。这时,业务逻辑层需要将数据的一份副本写入MQ。数据同步完成后,新版本的数据访问层会将MQ数据写入新版本。在DB中,实现数据的一致性,这也是引入MQ的主要目的。在灰度过程中,需要对比两个数据库的数据,看数据是否一致。这样无论Grayscale失败,放弃新版本DB,还是Grayscale成功切换到新版本DB,数据都不会丢失。