全链路灰度发布系统

2020 年 12 月 30 日

全链路灰度发布系统

1 背景


灰度发布是业界一种规避发布风险的有效手段,常见的做法基本都需要进行灰度环境隔离,不管是硬件隔离还是软件隔离,在实施的时候都代价高昂,维护成本极高,同时因为机票业务的复杂性,因发布导致的故障层出不穷,迫切需要一种简单可行的灰度发布方案。


2 业界常用方案


为了灰度环境的可评估性,灰度环境必须是隔离的,在实现这种隔离性上,主要有以下两种方式。


灰度机器隔离


实施描述:物理隔离一整套灰度环境,并且承接线上流量。



优点:对应用改动少,支持监控隔离,流量路由,人工验证;


缺点:实施成本高,后续维护成本高难度大。


软路由流量隔离


实施描述:利用软负载路由逻辑隔离灰度环境。



优点:不增加额外成本,支持监控隔离,流量路由,人工验证;


缺点:应用改造大,风险高。


3 我们的方案


鉴于硬件隔离在复杂系统的不可维护性,我们还是主要考虑软路由隔离,只是方式我们有很多不一样的地方。


3.1 思考过程


从目标开始:小流量尽可能发现发布风险。


如何定义小流量?常用的有用用户,航线等具体业务属性或随机流量来划分比例。比如 1%,5%,10%等。


这样势必会考虑流量路由到指定环境,有什么办法能避免这个呢?我们的答案是把流经灰度机器的流量视为小流量。



流经灰度机器 B1 的流量都认为是灰度流量。那接下来怎么自动识别灰度流量的业务情况正常与否呢?我们的答案是业务监控。只要把灰度流量的监控能单独区分,通过灰度监控的波动即可判断灰度发布是否正常。




正常核心监控都有哪些监控?看上图,图 4:业务量监控 ;图 5:业务结果监控 灰度监控应该关注哪些监控?灰度监控更应该关注的是业务结果监控。


以上构成方案的两大理论基础:


1、灰度流量用流经特定机器的流量标识


2、监控更关注业务结果监控


3.2 总体方案成型



方案整体接入只需要 0.5pd,就让系统具备灰度发布的能力。


灰度发布流程:如下图-7,发布必须发布灰度机器,并且灰度监控必须正常才能发布全量机器。



灰度发布自动化监控:如何判断灰度监控是否正常呢?我们提供自动化监测手段。


只要你发布了灰度机器,灰度系统会自动监测并开始分析发布前后的灰度指标,如果通不过自动化监测,会给出如下提示,并且拦截全量发布。



3.3 原理介绍


灰度流量标识如何在系统间传递?


向下传输借助全局 trace 组件


向上传输(协议相关):


Dubbo:attachment Http:http head


mq:不需要向上传输


灰度流量标识如何在系统内传递?不传递,申请 trace 级全局内存。



全局内存如何避免内存泄漏或 OOM 呢?考虑这块全局内存的实际场景,我们有两个措施保证:


1、总量控制,这个总量就是最大单机并发数,我们默认设置为 5124。


2、超时清理,一次用户端 RPC 最多忍受也就是 30s,我们默认设置为 60s。


为啥不通过请求开始和结束管理这块内存的生命周期呢?答案是比较难,底层请求可能是同步,异步,回调,mq 等各种形式,不能早删不能晚删不如不删。


依赖以上两点,摆脱对底层请求方式复杂性的依赖。


灰度流量如何监控隔离?借助监控系统的 tag 功能,灰度流量打上特定 tag 即可。效果如下:



4 方案总结




头图:Unsplash

作者:李连勇

原文全链路灰度发布系统

来源:Qunar 技术沙龙 - 微信公众号 [ID:QunarTL]

转载:著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

2020 年 12 月 30 日 23:321

评论

发布
暂无评论
发现更多内容

字节跳动:高级人才的五个基本素质

池建强

人才培养

职位拆解:互联网-运营

Breeze

行业资讯 移动互联网 运营 AARRR

ARTS打卡 week 1

猫吃小怪兽

ARTS 打卡计划

ARTS week 1

刘昱

手把手透析C语言堆内存申请malloc及扩容realloc

卓丁

c 堆内存管理 heap memory malloc realloc

鄙视链 & 全栈

伯薇

学习 能力提升 全栈

Linux如何调试内存泄漏

程序喵大人

c c++ C#

ARTS 01 - 为什么写作在远程工作中那么重要?

Calvin

ARTS 打卡计划

ARTS 第一周

Forelax

ARTS 打卡计划

“数据资产”究竟是“数据”还是“资产”

马踏飞机747

大数据 数据中台 数据治理 数据资产

LeetCode 1048. Longest String Chain

liu_liu

LeetCode

Mobileye如何在云上进行深度学习模型训练

Randy

自动驾驶 学习 AI AWS

游戏夜读 | 刀塔选手比较老吗?

game1night

leetcode练级-只出现一次的数字

幸福三寸日光

算法 LeetCode js

修改Tomcat窗口的名称

阡陌r

Java tomcat 踩坑 实施

Lucene的Smart CN实现分词、停用词、扩展词

Page

中文分词 lucene 停用词 扩展词 SmartCN

LeetCode 241. Different Ways to Add Parentheses

liu_liu

LeetCode

John 易筋 ARTS打卡Week 01

John(易筋)

ARTS 打卡计划

Kubernetes 资料集合

倪朋飞

学习 Kubernetes 架构模式

Spring Data R2DBC 入门

稻草鸟人

MySQL WebFlux springboot R2DBC

Python 3.6.1 官方文档练习——初入江湖(三)

Sicolas Flamel

Python python教程

转行程序员浅谈Linux下的多线程编程

WB

Linux 多线程 转行程序员

你所不知道的淘宝325秘密

毒手疯波

ios 淘宝 325

Java 火焰图

wong

Java flamegraph

Service Provider Interface介绍

Skysper

spi

【ARTS】Week 1

Amos

ARTS 打卡计划

【应用异常监控利器Sentry搭建与学习笔记】

卓丁

golang Docker Sertry Fasthttp CI/CD

leetcode练级-只出现一次的数字 升级版

幸福三寸日光

算法 LeetCode js

向往优雅的代码

Janenesome

编码习惯 读书

我的 Windows Terminal 配置

FeiLong

Windows Terminal

我的读书生涯-小学到大学: 没有成长, 只有不断加深的疑惑

lmymirror

人生 读书 经历 半虚构

全链路灰度发布系统-InfoQ