Serverless 架构下的服务优雅下线实践


来源 | 阿里云云栖号
责编 | 晋兆雨

应用发布、服务升级一直是一个让开发和运维同学既兴奋又担心的事情。

兴奋的是有新功能上线,自己的产品可以对用户提供更多的能力和价值;担心的是上线的过程会不会出现意外情况影响业务的稳定性。确实,在应用发布和服务升级时,线上问题出现的可能性更高,本文我们将结合 Serverless 应用引擎(以下简称 SAE)就 Serverless 架构下,讨论如何保障上线过程中服务的优雅下线。

在平时的发布过程中,我们是否遇到过以下问题:

  • 发布过程中,出现正在执行的请求被中断?

  • 下游服务节点已经下线,上游依然继续调用已经下线的节点导致请求报错,进而导致业务异常?

  • 发布过程造成数据不一致,需要对脏数据进行修复。

有时候,我们把发版安排在凌晨两三点,赶在业务流量比较小的时候,心惊胆颤、睡眠不足、苦不可言。那如何解决上面的问题,如何保证应用发布过程稳定、高效,保证业务无损呢?首先,我们来梳理下造成这些问题的原因。


场景分析

这个图描述了我们使用微服务架构开发应用的一个常见的场景,先看下这个场景的服务调用关系:

  • 服务 B、C 把服务注册到服务注册中心,服务 A、B 从注册中心发现依赖的服务。

  • 业务流量从负载均衡路由到服务 A,在 SLB 上配置服务 A 实例的健康检查,当服务 A 有实例停机的时候,相应的实例从 SLB 摘掉;服务 A 调用服务 B,服务B再调用服务C。

从图中,可以看到有两类流量,南北向流量(即通过 SLB 转发到后端服务器的业务流量,如业务流量->SLB->A的调用链路)和东西向流量(借助于服务注册中心服务发现调用的流量,如服务A->服务B的调用链路)。

针对这两类流量我们分别进行分析。先来分析下在这种架构下南北向流量存在的问题,当服务 A 发布的时候,服务A1 实例停机后,SLB 根据健康检查探测到实例 A1 下线,然后把实例从 SLB 摘掉,实例 A1 依赖 SLB 的健康检查从 SLB 上摘掉,一般需要几秒到十几秒的时间,在这个过程中,如果 SLB 有持续的流量打入,就会造成一些请求继续路由到实例 A1,导致请求失败。

那如何保证经过SLB的业务流量不报错?我们看下 SAE 是如何做到的。

南北向流量优雅下线方案

上面提到过,请求失败的原因在于后端服务实例先停止掉,然后才从 SLB 摘掉,那我们是不是可以先从 SLB 摘掉服务实例,然后在对实例进行升级呢?

按照这个思路,SAE 基于 K8s Service 的能力给出了一种方案,当用户在通过 SAE 为应用绑定 SLB 时,SAE 会在集群中创建一个 Service 资源,并把应用的实例和 Service 关联,CCM 组件会负责 SLB 的购买、SLB 虚拟服务器组的创建,并且把应用实例关联的 ENI 网卡添加到虚拟服务器组中,从而用户可以通过 SLB 来访问应用实例;当应用发布时,CCM 组件会先把实例对应的 ENI 从虚拟服务器组中摘除,然后再对实例进行升级,从而保证了流量不丢失。


东西向流量优雅下线方案

在讨论完南北向流量的解决方案后,我们再看下东西向流量, 传统的发布流程中,服务提供者停止再启动,服务消费者感知到服务提供者节点停止的流程如下:


  • 服务发布前,消费者根据负载均衡规则调用服务提供者,业务正常。

  • 服务提供者 B 需要发布新版本,先对其中的一个节点进行操作,首先是停止 Java 进程。

  • 服务停止过程,又分为主动注销和被动注销,主动注销是准实时的,被动注销的时间由不同的注册中心决定,最差的情况会需要 1 分钟。

  • 如果应用是正常停止,Spring Cloud 和 Dubbo 框架的 Shutdown Hook 能正常被执行,这一步的耗时可以忽略不计。

  • 如果应用是非正常停止,比如直接使用 kill -9 停止,或者 Docker 镜像构建的时候 Java 应用不是 1 号进程且没有把 kill 信号传递给应用。那么服务提供者不会主动去注销服务节点,而是在超过一段时间后由于心跳超时而被动地被注册中心摘除。

  • 服务注册中心通知消费者,其中的一个服务提供者节点已下线。包含推送和轮询两种方式,推送可以认为是准实时的,轮询的耗时由服务消费者轮询间隔决定,最差的情况下需要 1 分钟。

  • 服务消费者刷新服务列表,感知到服务提供者已经下线了一个节点,这一步对于 Dubbo 框架来说不存在,但是 Spring Cloud 的负载均衡组件 Ribbon 默认的刷新时间是 30 秒 ,最差情况下需要耗时 30 秒。

  • 服务消费者不再调用已经下线的节点。

从第 2 步到第 6 步的过程中,Eureka 在最差的情况下需要耗时 2 分钟,Nacos 在最差的情况下需要耗时 50 秒。在这段时间内,请求都有可能出现问题,所以发布时会出现各种报错。

经过上面的分析,我们看,在传统发布流程中,客户端有一个服务调用报错期,原因就是客户端没有及时感知到服务端下线的实例造成的,这种情况主要是因为服务提供者借助注册中心通知消费者来更新服务提供者列表造成的,那能不能绕过注册中心,服务提供者直接通知服务消费者呢?答案是肯定的,SAE 主要做了两件事情。


  • 服务提供者应用在发布前后主动向注册中心注销应用,并将应用标记为已下线的状态;将原来的停止进程阶段 注销服务变成了 prestop 阶段注销服务。

  • 在接收到服务消费者请求时,首先会正常处理本次调用,并通知服务消费者此节点已下线,服务消费者会立即从调用列表删除此节点;在这之后,服务消费者不再调用已经下线的节点。这是将原来的依赖于 注册中心推送,变成了服务提供者直接通知消费者从调用列表中摘除自己。

通过上面这个方案,就使得下线感知的时间大大减短,从原来的分钟级别做到准实时,确保您的应用在下线时能做到业务无损。


分批发布和灰度发布

上面介绍的是 SAE 在处理优雅下线方面的一些能力,在应用发布的过程中,只有实例的优雅下线是不够的,需要有一套配套的发布策略,保证我们新业务是可用的,SAE 提供了分批发布和灰度发布的能力,可以使得应用的发布过程更加省心省力;

我们先介绍下灰度发布,某应用包含10个应用实例,每个应用实例的部署版本为Ver.1版本,现需将每个应用实例升级为Ver.2版本。


从图中可以看出,在发布的过程中先灰度2台实例,在确认业务正常后,再分批发布剩余的实例,发布的过程中始终有实例处于运行状态,实例升级过程中依照上面的方案,每个实例都有优雅下线的过程,这就保证了业务无损。

再来看下分批发布,分批发布支持手动、自动分批;还是上面的10个应用实例,假设将所有应用实例分3批进行部署,根据分批发布策略,该发布流程如图所示,就不再具体介绍了。




更多阅读推荐
  • 如何应对云原生之旅中的安全挑战?

  • 放弃 Windows 后 ,开源操作系统能成为主流桌面系统吗?
    
  • 8000字 | 32 张图 | 一文搞懂事务+隔离级别+阻塞+死锁
    
  • 无论南京集成电路大学成立是真是假,业内关于“中国芯”的声音都应该被听见!

  • AI 还原康乾盛世三代皇帝的样貌,简直太太太好玩了!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Flink State 最佳实践

本文主要分享与交流 Flink 状态使用过程中的一些经验与心得,当然标题取了“最佳实践”之名,希望文章内容能给读者带去一些干货。本文内容首先是回顾 state 相关概念,并认识和区别不同的 state backend;之后将分别对 state 使用访问…

驻云CEO教你0门槛搭建电商网站,精选产品组合限量神券 低价买

云计算试飞员老蒋开播啦!4月27日 上午10点30分锁定云栖号直播,驻云CEO老蒋手把手教你搭建电商网站,0门槛入门;不同场景下精选产品组合,放心低价买。 观看直播: https://yq.aliyun.com/live/2707 大咖方案力…

uniapp 封装网络请求

文章目录一、前端1. 封装网络请求2. 封装模块请求方法二、后端2.1. 返回对象2.2. 热搜接口三、微信模拟请求3.1. Network3.2. Console一、前端 1. 封装网络请求 创建 utils 文件夹创建 request.js ,封装请求对象 // const BASE_URL https://api.imooc-blog.lgds…

求伯君领衔5代技术人对话,00后浪来袭1024程序员节

10 月 23-25 日,由 CSDN 等多家单位精心筹划的“长沙 中国 1024 程序员节”将盛大举行。程序员节活动以开源为主议题,包括:2 场岳麓尖峰对话,2020 开源技术英雄大会,10 场热门技术分论坛/峰会,创意集市&am…

容器环境自建数据库、中间件一键接入阿里云 Prometheus 监控

阿里云Prometheus服务4月9日发布重大升级,支持容器环境下一键接入MySQL、Redis、MangoDB、ElasticSearch等数据库和Kafka、ZooKeeper等中间件的监控,并提供开箱即用的监控大盘,现在接入更有15天免费试用。 15天免费试用地址,点击这…

状态管理 - 全局状态管理工具

文章目录一、单向数据流1. 理念示意图2. 简述二、什么是全局状态管理模式三、重点概念3.1. 什么是全局状态管理模式?3.2.全局状态管理工具?3.3. 什么是 vuex四、在项目中导入 vuex4.1. 状态管理配置4.2. 注册vuex五、测试 vuex 是否导入成功5.1. 创建搜索…

Nacos SDK for Scala 发布

脱胎于历经阿里巴巴10年生产验证的内部产品,支持具有数百万服务的大规模场景,Nacos作为高性能的动态服务发现、配置管理和服务管理平台从2018年开源以来,版本迭代速度很快,已经发布到1.2.1,已支持企业使用Nacos生产高可…

对话阿里云:开源与自研如何共处?

头图 | CSDN 下载自东方 IC来源 | CSDN(ID:CSDNnews)责编 | 晋兆雨从「鲜为人知」的专业名词,到 2006 年的精准定义,再到如今全面上云时代的「百花齐放」,云计算的发展趟过蛮荒之地,已形成极具规…

Flink 流批一体的实践与探索

自 Google Dataflow 模型被提出以来,流批一体就成为分布式计算引擎最为主流的发展趋势。流批一体意味着计算引擎同时具备流计算的低延迟和批计算的高吞吐高稳定性,提供统一编程接口开发两种场景的应用并保证它们的底层执行逻辑是一致的。对用户来说流批一…

uniapp 用户登录

文章目录一、登录基础1. 登录组件2. 页面引用组件3. 明确登录的实现思路4. 封装 action 调用登录接口5. 保存用户登录状态6. 成已登录的用户视图6. 现退出登录功能一、登录基础 1. 登录组件 对于 登录 功能来说提供了两个登录的入口。 那么大家想一下,现在我们已…

Vue 组件开发 - 数据输入框组件

目录 设计通用组件的一般思路组件效果1. HTML结构2. index.js3. input-number.js3.1 input-number.js代码注解设计通用组件的一般思路 明确需求; 设计API(组件的API:只来自props、events 和 slots); 2.1 确定命名、规则 2.2 编写业务逻辑 即使逻辑的第一版没做好,后续还可…

活动预告 | 2020移动云客户高端峰会即将揭幕,邀您一起携手云端!

一直以来,移动云致力于不断丰富自身产品体系,延伸服务深度和广度,提供“云网一体、贴身服务、随心定制、安全可控”的云服务,致力成为5G时代你身边的智慧云。依托中国移动网络资源与本地化服务团队,移动云为政府、互联…

如何在CDN边缘节点执行你的JavaScript?

Serverless和边缘计算都是目前云计算领域备受瞩目的研究和应用方向。做为拥有超过130Tbps带宽分发能力的阿里云CDN,巨大的边缘网络有超过2800个节点遍布全球,如何将中心源站的计算能力下沉到边缘节点,进一步降低客户端访问延时进而提升用户体…

微信小程序+腾讯地图 获取定位与地图选点插件

文章目录一、思路二、逆地址解析2.1. app.json2.2. 页面加入2.3. 后台代码三、地图插件调用3.1. app.json加入3.2. js页面加入3.3. wxml页面成功截图:腾讯位置服务官网: https://lbs.qq.com一、思路 通过 wx.getLocation 返回经纬度传到后台,后台调用腾…

前端工具安装和运行相关

目录1. nodemon 运行出错:无法运行脚本2. XXX~待续1. nodemon 运行出错:无法运行脚本 无法加载文件 C:\Users\xxx\AppData\Roaming\npm\nodemon.ps1,因为在此系统上禁止运行脚本。 解决办法: 管理员身份打开powerShell&#xf…

友盟+联合EB级云数据 实现友盟域和企业私域数据全面融合

友盟联合EB级云数据 实现友盟域和企业私域数据全面融合 2020-04-28 互联网大数据计算 国内领先的第三方全域数据智能服务商友盟,联合阿里云EB级云数据仓库MaxCompute为企业提供面向分析的,实现友盟域数据与企业私域数据全面融合的自助分析服务“U-DOP…

微信小程序之实现地图定位(使用腾讯位置服务插件)

文章目录一. 腾讯位置服务插件简介1. 完整的地图能力2. 地图插件的优势二. 开通腾讯位置服务三、接入插件四、 开发者密钥配置五、插件的使用一. 腾讯位置服务插件简介 1. 完整的地图能力 腾讯位置服务基于微信提供的小程序插件能力,专注于(围绕&#…

分享16个经典的免费UI素材网站

免费字体 www.fontspace.com 一键AI抠图 www.remove.bg/zh 在线PS工具/可以转换Sketch文件

单人开发场景下的测试环境实践

在软件研发过程中,“测试环境”是部署最频繁、也是开发者使用最频繁的一种运行环境,稳定而易用的测试环境能够极大提高开发者的工作效率和幸福感。为更好的将阿里巴巴在测试环境管理方面的实践和经验跟广大开发者分享,《云效说码》策划了《阿…

函数计算如何访问 PostgreSQL 数据库

函数计算(Function Compute):函数计算 是事件驱动的全托管计算服务。使用函数计算,您无需采购与管理服务器等基础设施,只需编写并上传代码。函数计算为您准备好计算资源,弹性地可靠地运行任务,并…