线上发布稳定性方案介绍

目录

一、方案说明

二、线上发布问题描述

2.1 无损上下线背景说明

2.1.1 服务⽆法及时下线

2.1.2 初始化慢

2.1.3 注册太早

2.1.4 发布态与运⾏态未对⻬

三、问题解决方案

3.1 无损下线方案

3.1.1 什么是无损下线

3.1.2 传统解决方式

3.1.3 云原生场景解决方案

3.1.3.1 主动通知

3.1.3.2 自适应等待

3.2 无损上线方案

3.2.1 无损上线场景

3.2.2 延迟注册

3.2.3 小流量服务预热

3.2.4 微服务就绪检查

3.2.4.1 Kubernetes 探针技术

3.2.4.1.1 存活探针

3.2.4.1.2 就绪探针

3.2.4.1.3 启动探针

3.2.4.1.4 探针使用小结

3.2.4.2 Kubernetes 探针检测技术的不足

3.2.4.3 业界较好的微服务就绪检查方案


一、方案说明

绝⼤多数的软件应⽤⽣产安全事故发⽣在应⽤上下线发布阶段,尽管通过遵守业界约定俗成的可灰度、可观测和可滚回的安全⽣产三板斧,可以最⼤限度的规避发布过程中由于应⽤⾃身代码问题对⽤户造成的影响。但对于⾼并发⼤流量情况下的短时间流量有损问题却仍然⽆法解决。因此,本文章将围绕发布过程中如何解决流量有损问题实现应⽤发布过程中的⽆损上下线效果相关内容展开⽅案介绍。

二、线上发布问题描述

2.1 无损上下线背景说明

据统计,应⽤的事故⼤多发⽣在应⽤上下线过程中,有时是应⽤本身代码问题导致。但有时我们也会发现尽管代码本身没有问题,但在应⽤上下线发布过程中仍然会出现短时间的服务调⽤报错,⽐如调⽤时出现 Connection refused 和 No instance 等现象。相关问题的原因有相关发布经历的同学或多或少可能有⼀定了解,⽽且⼤家发现该类问题⼀般在流量⾼峰时刻尤为明显,半夜流量少的时候就⽐较少见,于是很多⼈便选择半夜三更进⾏应⽤发布希望以此来规避线上发布事故。下面我们来分析下常见的流量有损现象出现的原因。

2.1.1 服务⽆法及时下线

服务消费者感知注册中⼼服务列表存在延时,导致应⽤特定实例下线后在⼀段时间内服务消费者仍然调⽤已下线实例造成请求报错。

2.1.2 初始化慢

应⽤刚启动接收线上流量进⾏资源初始化加载,由于流量太⼤,初始化过程慢,出现⼤量请求响应超时、阻塞、资源耗尽从⽽造成刚启动应⽤宕机。

2.1.3 注册太早

服务存在异步资源加载问题,当服务还未初始化完全就被注册到注册中⼼,导致调⽤时资源未加载完毕出现请求响应慢、调⽤超时报错等现象。

2.1.4 发布态与运⾏态未对⻬

使用kubernetes的滚动发布功能进行应用的发布,由于kubernetes滚动发布⼀般关联的就绪检查机制,是通过检查应⽤特定端⼝是否启动作为应⽤就绪的标志来触发下⼀批次的实例发布,但在微服务应⽤中只有当应⽤完成了服务注册才可对外提供服务调⽤。因此某些情况下会出现新应⽤还未注册到注册中⼼,⽼应⽤实例就被下线,导致⽆服务可⽤。

三、问题解决方案

3.1 无损下线方案

3.1.1 什么是无损下线

由于微服务应用自身调用特点,在高并发下,服务提供端应用实例的直接下线,会导致服务消费端应用实例无法实时感知下游实例的实时状态因而出现继续将请求转发到已下线的实例从而出现请求报错,流量有损。

例如对于 Spring Cloud 应⽤如上图 1 所示,当应⽤的两个实例 A’和 A 中的 A 下线时,由于Spring Cloud 框架为了在可⽤性和性能⽅⾯做平衡,消费者默认是 30s 去注册中⼼拉取最新的服务列表,因此 A 实例的下线不能被实时感知,流量较⼤时,消费者会继续通过本地缓存调⽤已下线的 A 实例导致出现流量有损。基于上述背景,业界提出了相应的⽆损下线(也叫优雅下线)的技术⽅案来应对上述问题。

3.1.2 传统解决方式

针对该类问题,业界一般的解决方式是通过将应用更新流程划分为手工摘流量、停应用、更新重启三个步骤。由人工操作实现客户端避免调用已下线实例,这种方式简单而有效,但是限制较多:不仅需要借助流控能力来实现实时摘流量,还需要在停应用前人工判断来保证在途请求已经处理完毕。这种需要人工介入的方式运维复杂度较高,只适用于规模较小的应用,无法解决当前云原生架构下,自动化的弹性伸缩、滚动升级等场景中的实例下线过程中的流量有损问题。

3.1.3 云原生场景解决方案

3.1.3.1 主动通知

一般注册中心都提供了主动注销接口供微服务应用正常关闭时调用,以便下线实例能及时更新其在注册中心上的状态。主动注销在部分基于事件感知注册中心服务列表的微服务框架比如Dubbo 中能及时让上游服务消费者感知到提供者下线避免后续调用已下线实例。但对于像Spring Cloud这类微服务框架服务消费者感知注册中心实例变化是通过定时拉取服务列表的方式实现。尽管下线实例通过注册中心主动注销接口更新了其自身在注册中心上的应用状态信息但由于上游消费者需要在下一次拉取注册中心应用列表时才能感知到,因此会出现消费者感知注册中心实例变化存在延时。在流量较大、并发较高的场景中,当实例下线后,仍无法实现流量无损。既然无法通过注册中心让存量消费者实例实时感知下游服务提供者的变化情况,业界提出了利用主动通知解决该类问题。主动通知过程如下图 2 所示。

如图 2 所示,服务提供者 B 中某个实例在下线时为避免主动在注册中心中注销的服务实例状态无法实时被上游消费者 A 感知到,从而导致调用已下线实例的问题。在接收到下线命令即将下线前,提供者 B 对于在等待下线阶段内收到的请求,在其返回值中都增加上特殊标记让服务消费者接收到返回值并识别到相关标志后主动拉取一次注册中心服务实例从而实时感知 B 实例最Microservice 新状态,从而达到服务提供者的下线状态能够被服务消费者实时感知。

3.1.3.2 自适应等待

在并发度不⾼的场景下,主动通知⽅法可以解决绝⼤部分应⽤下线流量有损问题。但对于⾼并发⼤流量应⽤下线场景,如果主动通知完,可能仍然存在⼀些在途请求需要待下线应⽤处理完才能下线否则这些流量就⽆法正常被响应。为解决该类在途请求问题,可通过给待下线应⽤在下线前通过⾃适应等待机制在处理完所有在途请求后,再下线以实现流量⽆损。

如上图 3 所示,⾃适应等待机制是通过待下线应⽤统计应⽤中是否仍然存在未处理完的在途请求,来决定应⽤下线的时机,从⽽让待下线应⽤在下线前处理完所有剩余请求。

3.2 无损上线方案

3.2.1 无损上线场景

延迟加载是软件框架设计过程中最常⻅的⼀种策略,例如在 Spring Cloud 框架中 Ribbon 组件的拉取服务列表初始化默认都是要等到服务的第⼀次调⽤时刻,例如下图 4 是Spring Cloud 第一次和第二次通过调用RestTemplate 调用远程服务消耗的时间对比:

由图 4 结果可⻅,第⼀次调⽤由于进⾏了⼀些资源初始化,耗时是正常情况的数倍之多。因此把新应⽤发布到线上直接处理⼤流量极易出现⼤量请求响应慢,资源阻塞,应⽤实例宕机的现象。

业界针对上述应⽤⽆损上线场景,提出了包括延迟注册、⼩流量服务预热以及就绪检查等⼀系列解决⽅案,详细完整的⽅案如下图 5 所示:

3.2.2 延迟注册

对于初始化过程需要异步加载资源的复杂应⽤启动过程,由于注册通常与应⽤初始化过程同步Microservice 进⾏,从⽽出现应⽤还未完全初始化就已经被注册到注册中⼼供外部消费者调⽤,此时直接调⽤由于资源未加载完成可能会导致请求报错。通过设置延迟注册,可让应⽤在充分初始化后再注册到注册中⼼对外提供服务。例如开源微服务治理框架 Dubbo 原⽣就提供延迟注册功能。

3.2.3 小流量服务预热

在线上发布场景下,很多时候刚启动的冷系统直接处理⼤量请求,可能由于系统内部资源初始化不彻底从⽽出现⼤量请求超时、阻塞、报错甚⾄导致刚发布应⽤宕机等线上发布事故出现。为了避免该类问题业界针对不同框架类型以及应⽤⾃身特点设计了不同的应对举措,⽐如针对类加载慢问题有编写脚本促使 JVM 进⾏预热、阿⾥巴巴集团内部 HSF(High Speed Framework)使⽤的对接⼝分批发布、延迟注册、通过 mock 脚本对应⽤进⾏模拟请求预热以及⼩流量预热等。本节将对其中适⽤范围最⼴的⼩流量预热⽅法进⾏介绍。相⽐于⼀般场景下,刚发布微服务应⽤实例跟其他正常实例⼀样⼀起平摊线上总 QPS。⼩流量预热⽅法通过在服务消费端根据各个服务提供者实例的启动时间计算权重,结合负载均衡算法控制刚启动应⽤流量随启动时间逐渐递增到正常⽔平的这样⼀个过程帮助刚启动运⾏进⾏预热,详细 QPS 随时间变化曲线如图 6 所示

开源 Dubbo所实现的⼩流量服务预热过程原理如下图 7 所示:

服务提供端在向注册中⼼注册服务的过程中,将⾃身的预热时⻓ WarmupTime、服务启动时间StartTime 通过元数据的形式注册到注册中⼼中,服务消费端在注册中⼼订阅相关服务实例列表,调⽤过程中根据WarmupTime、StartTime 计算个实例所分批的调⽤权重。刚启动StartTime 距离调⽤时刻差值较⼩的实例权重下,从⽽实现对刚启动应⽤分配更少流量实现对其进⾏⼩流量预热。

开源 Dubbo 所实现的⼩流量服务预热模型计算如下公式所示:

模型中应用 QPS 对应的 f(x) 随调用时刻 x 线性变化,x 表示调用时刻的时间,startTime 是应用开始时间,warmupTime 是用户配置的应用预热时长,k 是常数,一般表示各实例的默认权重。

通过⼩流量预热⽅法,可以有效解决,⾼并发⼤流量下,资源初始化慢所导致的⼤量请求响应慢、请求阻塞,资源耗尽导致的刚启动应⽤宕机事故。

3.2.4 微服务就绪检查

当前容器+Kubernetes的应用运维部署方案已经成为业界的事实标准,特别是针对微服务应用来说,该运维部署方案更是带来了极大的便利,所以在介绍微服务就绪检查之前,有必要针对Kubernetes探针技术做个介绍,方便后续内容的理解。

3.2.4.1 Kubernetes 探针技术

在云原⽣领域,Kubernetes 为了确保应⽤ Pod 在对外提供服务之前应⽤已经完全启动就绪或者应⽤Pod⻓时间运⾏期间出现意外后能及时恢复,提供了探针技术来动态检测应⽤的运⾏情况,为保证应⽤的⽆损上线和⻓时间健康运⾏提供了保障。

3.2.4.1.1 存活探针

Kubernetes 中提供的存活探测器来探测什么时候进⾏容器重启。例如,存活探测器可以捕捉到死锁(应⽤程序在运⾏,但是⽆法继续执⾏后⾯的步骤)。在这样的情况下重启容器有助于让应⽤程序在有问题的情况下更可⽤。

3.2.4.1.2 就绪探针

Kubernetes 中提供的就绪探测器可以知道容器什么时候准备好了并可以开始接受请求流量,当 ⼀个 Pod 内的所有容器都准备好了,才能把这个 Pod 看作就绪了。这种信号的⼀个⽤途就是控制哪个 Pod 作为 Service 的后端。在 Pod 还没有准备好的时候,会从 Service 的负载均衡器中被剔除的。

3.2.4.1.3 启动探针

Kubernetes 中提供的启动探测器可以知道应⽤程序容器什么时候启动了。 如果配置了这类探测器,就可以控制容器在启动成功后再进⾏存活性和就绪检查,确保这些存活、就绪探测器不会影响应⽤程序的启动。 这可以⽤于对慢启动容器进⾏存活性检测,避免它们在启动运⾏之前就被杀掉。

3.2.4.1.4 探针使用小结
  • 当需要在容器已经启动后再执⾏存活探针或者就绪探针检查,则可通过设定启动探针实现。
  • 当容器应⽤在遇到异常或不健康的情况下会⾃⾏崩溃,则不⼀定需要存活探针,Kubernetes能根据 Pod 的 restartPolicy 策略⾃动执⾏预设的操作。
  • 当容器在探测失败时被 Kill 并重新启动,则可通过指定⼀个存活探针,并指定 restartPolicy 为 Always 或 OnFailure。
  • 当希望容器仅在探测成功时 Pod 才开始接收外部请求流量,则可使⽤就绪探针

Kubernetes探针技术使用实例官网:

配置存活、就绪和启动探针 | Kubernetes

3.2.4.2 Kubernetes 探针检测技术的不足

当前容器+Kubernetes 的应⽤运维部署⽅式已经成为了业界的事实标准,相关技术为微服务应⽤运维部署带来巨⼤便利的同时,在某些特殊的应⽤部署场景中也有⼀些问题需要解决。⽐如,使⽤Kubernetes 的滚动发布功能进⾏应⽤发布,由于 Kubernetes 的滚动发布⼀般关联的就绪检查机制,是通过检查应⽤特定端⼝是否启动作为应⽤就绪的标志来触发下⼀批次的实例发布,但在微服务应⽤中只有当应⽤完成了服务注册才可对外提供服务调⽤。因此某些情况下会出现新应⽤还未注册到注册中⼼,⽼应⽤实例就被设置下线,导致⽆服务可⽤。

3.2.4.3 业界较好的微服务就绪检查方案

针对这样⼀类微服务应⽤的发布态与应⽤运⾏态⽆法对⻬的问题导致的应⽤上线事故,当前业界也已经有相关解决⽅案进⾏应对。⽐如阿⾥云微服务引擎 MSE 就通过就绪检查关联服务注册的⽅法,通过字节码技术植⼊应⽤服务注册逻辑前后,然后在应⽤中开启⼀个探测应⽤服务是否完成注册的端⼝供 Kubernetes 的就绪探针进⾏应⽤就绪态探测进⽽绑定⽤户的发布态与运⾏态实现微服务的就绪检查,避免出现相关状态不⼀致导致的应⽤发布上线流量有损问题。

友情连接:如果你对微服务场景下全链路灰度发布方案相关的内容也感兴趣,欢迎阅读本人博客微服务全链路灰度方案介绍-CSDN博客

好了,本次分享就到这里,如果帮助到大家,欢迎大家点赞+关注+收藏,有疑问也欢迎大家评论留言!

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

提升爬虫IP时效:解决被封IP的难题

在进行数据采集时,经常会遇到被目标网站封禁IP的情况,这给爬虫系统带来了困扰。本文将介绍如何提升爬虫IP的时效,解决被封IP的难题,帮助您顺利进行数据采集,不再受限于IP封禁。 第一步:使用爬虫IP 使用爬虫…

使用element中el-cascader级联选择器实现省市区街道筛选(非动态加载)

<template><el-form ref"form" :model"form" label-width"80px"><el-form-item label"地址:" prop"addressList"><el-cascaderv-model"form.addressList":props"props":options&q…

《网络是怎样连接的》2.1节图表(自用)

图3.1&#xff1a;协议栈的组成 图3.2&#xff1a;netstat命令查看套接字 上图中每一行就是一个套接字 图3.3&#xff1a;协议栈在浏览器访问DNS服务器与web服务器时的具体工作流程 套接字由协议栈创建 应用程序通过Socket库中的程序组件与协议栈交互

飞企互联-FE企业运营管理平台 登录绕过漏洞复现

0x01 产品简介 飞企互联-FE企业运营管理平台是一个基于云计算、智能化、大数据、物联网、移动互联网等技术支撑的云工作台。这个平台可以连接人、链接端、联通内外&#xff0c;支持企业B2B、C2B与O2O等核心需求&#xff0c;为不同行业客户的互联网转型提供支持。 0x02 漏洞概…

图像拼接——基于homography的特征匹配算法

目录 1. 任务要求2. 数据集3. 基于homography的特征匹配算法4. 拼接流程展示4.1 图片实例4.2 特征点位图4.3 特征点匹配结果4.4 相机校准结果4.5 拼接结果 5. 部分图像拼接结果展示 1. 任务要求 输入&#xff1a;同一个场景的两张待拼接图像&#xff08;有部分场景重合&#x…

2023年03月18日_微软office365 copilot相关介绍

文章目录 Copilot In WordCopilot In PowerpointCopilot In ExcelCopilot In OutlookCopilot In TeamsBusiness Chat1 - copilot in word2 - copilot in excel3 - copilot in powerpoint4 - copilot in outlook5 - copilot in teams6 - business chat word 1、起草草稿 2、自动…

命令模式-举例

开关和电灯之间并不存在直接耦合关系&#xff0c;在命令模式中&#xff0c;发送者与接收者之间引入了新的命令对象&#xff0c;将发送者的请求封装在命令对象中&#xff0c;再通过命令对象来调用接收者的方法。 命令模式的主要缺点如下&#xff1a; 使用命令模式可能会导致某…

自然语言处理2——轻松入门情感分析 - Python实战指南

目录 写在开头1.了解情感分析的概念及其在实际应用中的重要性1.1 情感分析的核心概念1.1.1 情感极性1.1.2 词汇和上下文1.1.3 情感强度1.2 实际应用中的重要性 2. 使用情感分析库进行简单的情感分析2.1 TextBlob库的基本使用和优势2.1.1 安装TextBlob库2.1.2 文本情感分析示例2…

二、RK3588-安装Opencv-4.8.1(C++版本)

1.前言 OpenCV是一个跨平台的计算机视觉和机器学习软件库&#xff0c;基于Apache2.0许可&#xff08;开源&#xff09;发行。它可以在Linux、Windows、Android和Mac OS操作系统上运行。OpenCV由一系列C函数和少量C类构成&#xff0c;同时提供了Python、Ruby、MATLAB等语言的接口…

Stimulsoft BI Designer 2024.1.2 Crack

Stimulsoft BI Designer Do you want to create reports and dashboards, but you do not need to create your application? We want to offer you a great solution – Stimulsoft Designer! All you need is to connect your data, drag it onto the template page, config…

Java日期和时间(一)

传统的日期和时间 Date 代表的是日期和时间 构造器说明public Date&#xff08;&#xff09;创建一个Date对象&#xff0c;代表的是系统当前此刻日期时间public Date&#xff08;long time&#xff09;把时间毫秒值转换成Date日期对象 import java.util.Date;public class …

weston 源码下载及编译

文章目录 前言一、安装 meson1. ubuntu 上安装pip32. 使用pip3安装meson3. 安装 ninja二、获取weston 源码三、编译 weston 源码1. meson build2. ninja -C build3. 安装编译生成的weston四、执行编译生成的weston总结参考资料前言 本文主要介绍 weston 9.0源码的下载和编译,…

DolphinScheduler 介绍及系统架构

目录 一、DolphinScheduler 介绍 1.1 关于 DolphinScheduler 1.2 特性 简单易用 丰富的使用场景 High Reliability High Scalability 1.3 名词解释 1.3.1 名词解释 1.3.2 模块介绍 二、DolphinScheduler 系统架构 2.1 系统架构图 2.2 架构说明 MasterServer 该服…

Mybatis插件入门

专栏精选 引入Mybatis Mybatis的快速入门 Mybatis的增删改查扩展功能说明 mapper映射的参数和结果 Mybatis复杂类型的结果映射 Mybatis基于注解的结果映射 Mybatis枚举类型处理和类型处理器 再谈动态SQL Mybatis配置入门 Mybatis行为配置之Ⅰ—缓存 Mybatis行为配置…

Java:IO流——字节流和字符流

目录 IO流的基本概念 IO流体系结构 FileOutputStream字节输出流 构造方法 成员方法 细节 关流 FileInputStream字节输入流 构造方法及成员方法 read不带参数代码示例 read带参数代码示例​编辑 将字节数组或字符数组转成字符串 FileReader 字符输入流 构造方法和…

远程桌面连接问题:出现身份验证错误。要求的函数不受支持错误【已解决】

问题描述&#xff1a; 在使用远程桌面时&#xff0c;出现的错误&#xff0c;原因在于CredSSP加密数据库修正问题&#xff0c;可以通过设置组策略解决问题 远程桌面连接 出现身份验证错误。 要求的函数不受支持错误注意&#xff1a; 如果使用注册表编辑器或其他方法修改注册表不…

方案:智能分析网关V4区域人数超员AI算法模型的应用场景介绍

视频AI智能分析技术已经深入到人类生活的各个角落&#xff0c;与社会发展的方方面面紧密相连。从日常生活中的各种场景&#xff0c;如人脸识别、车牌识别&#xff0c;到工业生产中的安全监控&#xff0c;如工厂园区的翻越围栏识别、入侵识别、工地的安全帽识别、车间流水线产品…

GPT-5、开源、更强的ChatGPT!OpenAI公布2024年计划

年终岁尾&#xff0c;正值圣诞节热闹气氛的OpenAI写下了2024年的发展清单。 OpenAI联合创始人兼首席执行官Sam Altman在社交平台公布&#xff0c;AGI&#xff08;稍晚一些&#xff09;、GPT-5、更好的语音模型、更高的费率限制&#xff1b; 更好的GPTs&#xff1b;更好的推理…

C语言课程设计|学生成绩管理系统(含完整代码)

目录 前言 简介 学生信息录入功能 学生单个信息查询 查询全部学生信息 修改学生信息 删除学生信息 退出 完整代码 前言 在临近期末之际&#xff0c;相信好多初学C语言的同学都开始为写C语言课程设计这件事开始焦虑了吧&#xff1f;或许会不知所措&#xff0c;或许会…

这些浏览器中的AI扩展太香了

B站&#xff1a;啥都会一点的研究生公众号&#xff1a;啥都会一点的研究生 众所周知&#xff0c;浏览器只有添加了扩展才能让其火力全开&#xff0c;效率翻倍&#xff0c;而当有了AI的加持后&#xff0c;直接起飞 本期将整理一些目前肥肠火的基于AI语言模型的扩展程序&#x…