优雅关闭:避免服务停机带来的业务损失

服务关闭有什么问题?

在“单体应用”复杂到一定程度后,一般会进行系统拆分,也就是微服务架构。服务拆分之后,就需要协同,于是RPC框架就出来了,用来解决各个子系统之间的通信问题。

拆分系统的目的,快速地迭代业务,就会涉及到更新业务系统,重启服务器

服务上线大概流程

当服务提供方要上线的时候,一般是通过部署系统完成实例重启。过程中,服务提供方与服务调用方相互无法感知

服务提供方并不会事先告诉调用方他们需要操作哪些机器,从而让调用方去事先切走流量。而对调用方来说,也无法预测到服务提供方要对哪些机器重启上线,因此负载均衡就有可能把要正在重启的机器选出来,这样就会导致把请求发送到正在重启中的机器里面,从而导致调用方不能拿到正确的响应结果。

image-20241117200229896

在服务重启的时候,对于调用方来说,可能会存在以下几种情况:

  • 调用方发请求前,目标服务已经下线。对于调用方来说,跟目标节点的连接会断开,调用方可以立马感知到,并且在其健康列表里面会把这个节点挪掉,自然也就不会被负载均衡选中。
  • 调用方发请求的时候,目标服务正在关闭,但调用方并不知道它正在关闭,而且两者之间的连接也没断开,所以这个节点还会存在健康列表里面,因此该节点就有一定概率会被负载均衡选中,出现预期外的异常。

关闭流程

在重启服务机器前,先通过“某种方式”把要下线的机器从调用方维护的“健康列表”里面删除。

当服务提供方关闭前,可以先通知注册中心进行下线,然后通过注册中心告诉调用方进行节点摘除

image-20241117200656544

上述流程存在一定问题

第一整个关闭过程中依赖了两次RPC调用,一次是服务提供方通知注册中心下线操作,一次是注册中心通知服务调用方下线节点操作。

第二:注册中心通知服务调用方都是异步的,服务发现只保证最终一致性,并不保证实时性,注册中心在收到服务提供方下线的时候,并不能成功保证把要下线的节点推送到所有的调用方。

服务提供方主动通知调用方要下线的机器,RPC里面调用方跟服务提供方之间是长连接,可以在提供方应用内存里面维护一份调用方连接集合,当服务要关闭的时候,挨个去通知调用方去下线这台机器,由两次RPC变成一次RPC,成功率也会变高。

任存在问题。

第一:在提供方通知调用方前一瞬间,调用方发送请求,此次请求仍会失败。

第二:提供方处理请求时,此时服务关闭,请求也会失败。

优雅关闭

被动调用 + 主动通知

可以在关闭的时候,设置一个请求“挡板”,挡板的作用:告诉调用方,服务已经进入关闭流程了,不能再处理请求了。

当服务提供方正在关闭,如果这之后还收到了新的业务请求,服务提供方直接返回一个特定的异常给调用方(比如ShutdownException)。然后调用方收到这个异常响应后,RPC框架把这个节点从健康列表挪出,并把请求自动安全地重试到其他节点,可以实现对业务无损。【被动调用

服务关闭,服务提供方主动通知调用方要下线的机器。【主动通知】可以保证实时性,也可以避免通知失败的情况。

捕获关闭事件

通过捕获操作系统的进程信号来获取,在Java语言里面,对应的是Runtime.addShutdownHook方法,可以注册关闭的钩子。

在RPC启动的时候,提前注册关闭钩子,并在里面添加了两个处理程序,一个负责开启关闭标识一个负责安全关闭服务对象,服务对象在关闭的时候会通知调用方下线节点。同时需要在调用链里面加上挡板处理器当新的请求来的时候,会判断关闭标识,如果正在关闭,则抛出特定异常


进程结束过快会造成这些请求还没有来得及应答,同时调用方会也会抛出异常。

在服务对象加上引用计数器,每开始处理请求之前加一,完成请求处理减一,通过该计数器快速判断是否有正在处理的请求

服务对象在关闭过程中,会拒绝新的请求,同时根据引用计数器等待正在处理的请求全部结束之后才会真正关闭

考虑到有些业务请求可能处理时间长,为了避免一直等待造成应用无法正常退出,可以在整个ShutdownHook里面,加上超时时间控制,当超过了指定时间没有结束,则强制退出应用。超时时间建议设定成10s,基本可以确保请求都处理完了。

“优雅关闭”流程如下:

image-20241117203127928

从外层到里层逐层进行关闭,先保证不接收新请求,然后再处理关闭前收到的请求

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

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

相关文章

硬件知识 cadence16.6 原理图输出为pdf 网络名下划线偏移 (ORCAD)

1. cadence原理图输出为PDF网络名下划线偏移 生这种情况的原因 1. 设计的原理图图纸大小比正常的 A4图纸大。 2. 打印为PDF 的时候,打印机的设置有问题。 2.cadence原理图输出为 PDF网络名下划线偏移的情况 可以看到上图,网络名往上漂移。 3. 解决办法 …

Linux插件zsh(oh-my-zsh)

一、oh-my-zsh基本介绍 oh-my-zsh: https://github.com/ohmyzsh/ohmyzshhttps://github.com/ohmyzsh/ohmyzsh 注意:需要先安装zsh命令,才能安装oh-my-zsh,先测试是否安装了zsh rootserver:/opt # zsh --version zsh 5.8 (x86_6…

异或和之和

//暴力做法 枚举每个子区间 O(n^3) //优化1 利用前缀异或和快速求出区间异或和 O(n^2) //优化2 处理位运算的常用方法:拆位法 常用的思想:贡献法思想 下面详见优化2: 1.拆位贡献法 2.实战真题1 题目链接:1.异或和之和 - 蓝桥…

A039-基于SpringBoot的农产品销售系统的设计与实现

🙊作者简介:在校研究生,拥有计算机专业的研究生开发团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹 赠送计算机毕业设计600…

【大数据学习 | Spark】RDD的概念与Spark任务的执行流程

1. RDD的设计背景 在实际应用中,存在许多迭代式计算,这些应用场景的共同之处是,不同计算阶段之间会重用中间结果,即一个阶段的输出结果会作为下一个阶段的输入。但是,目前的MapReduce框架都是把中间结果写入到HDFS中&…

jmeter操作数据库

简介 Apache JMeter 是一个强大的开源工具,用于负载测试和性能测量。除了Web应用外,JMeter还可以用于测试各种数据库系统,包括MySQL。本文将详细介绍如何使用JMeter来测试MySQL数据库的性能。 环境准备 安装Java:确保你已经安装…

最小生成树——Kruskal、Prim算法

图的存储: 高阶数据结构——图 文章目录 目录 文章目录 一、kruskal算法 二、Prim算法 前言 连通图中的每一棵生成树,都是原图的一个极大无环子图,即:从其中删去任何一条边,生成树 就不在连通;反之&#xf…

STL-stack栈:P1981 [NOIP2013 普及组] 表达式求值

这个题用的STL-栈来做 题目来源:洛谷 相关知识 [NOIP2013 普及组] 表达式求值 题目背景 NOIP2013 普及组 T2 题目描述 给定一个只包含加法和乘法的算术表达式,请你编程计算表达式的值。 输入格式 一行,为需要你计算的表达式&#xff…

数字孪生赋能智慧校园:构建全方位校园安全保障新体系

在11月19日最高人民检察院的党组会上,校园安全问题再次被置于重要议程,会议明确指出,校园安全不仅关乎学生的健康成长,更与社会和谐稳定紧密相连。面对侵害学生权益、危害校园安全的犯罪行为,必须采取“零容忍”态度&a…

Openstack15--块存储服务(Cinder)安装

控制节点 安装Cinder软件包 yum -y install openstack-cinder 安装的“openstack-cinder”软件包里包括“cinder-api”和“cinder-scheduler”模块。安装“openstack-cinder”软件包时,和安装其他OpenStack核心组件时一样,会自动创建名为“cinder”的L…

如何用js方法把页面中的表格导出为excel表格(sheetJS)

目录 一,SheetJS库的基本介绍 这里用到的库是SheetJS,官方文档: sheetJS CE 官方文档 官网对库的解释是: SheetJS社区版提供了经过战斗测试的开源解决方案,用于从几乎任何复杂的电子表格中提取有用的数据&#xf…

自动驾驶系列—告别眩光烦恼:智能大灯如何守护夜间行车安全

🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中…

爬虫策略——反爬机制

现代网站通常会使用多种反爬手段来限制爬虫访问数据。了解这些机制并针对性地制定绕过策略,是构建高效爬虫的关键。 1. 常见反爬手段 1.1 User-Agent 检查 网站通常会通过检查请求中的 User-Agent 字段,判断访问是否来自真实用户。爬虫默认的请求库&am…

DataWhale—PumpkinBook(TASK03对数几率回归)

一、课程组成及结构 课程开源地址及相关视频链接:(当然这里也希望大家支持一下正版西瓜书和南瓜书图书,支持文睿、秦州等等致力于开源生态建设的大佬✿✿ヽ(▽)ノ✿) Datawhale-学用 AI,从此开始 【吃瓜教程】《机器学习公式详解…

系统安全第十三次作业题目及答案

一、 1.计划 实施 检查 处置 2.物理 系统 运行 数据 人员 技术文档 3.物理 网络 系统 应用 管理 二、 1.C 2.B 3.A 4.ACDE 5.ABCD 三、 1. 答: 概念:信息系统安全管理指通过计划、组织、领导、控制等环节来协调人力、物力、财力等资源&#x…

Qml 模型-视图-代理(贰)之 代理(Delegate) 学习

使用模型与视图来定义用户界面时,代理在创建显示时扮演了大量的角色,在模型中的每个元素通过代理来实现可视化。 代理 使用键盘移动 高亮 效果 代码: 视图绑定的属性是 ListView.isCurrentItem: 这个属性是一个布尔值,标识这…

LeetCode 面试经典 150 题回顾

目录 一、数组 / 字符串 1.合并两个有序数组 (简单) 2.移除元素 (简单) 3.删除有序数组中的重复项 (简单) 4.删除有序数组中的重复项 II(中等) 5.多数元素(简单&am…

内外网交换过程中可能遇到的安全风险有哪些?

在数字化时代,企业内外网之间的数据交换变得日益频繁。然而,这一过程中的安全风险和效率问题也日益凸显。我们将探讨内外网交换可能遇到的安全风险,并介绍镭速内外网交换系统如何有效应对这些挑战。 内外网交换过程中的五大安全风险 数据泄露…

人工智能之机器学习概念3【培训机构学习笔记】

定义及作用: 无监督学习是通过试图学习或提取数据背后的数据特征,或者从数据中抽取出重要的特征信息,常见的算法有类聚、降维、文本处理(特征抽取)等。无监督学习一般是作为有监督学习的前期数据处理,功能…

文件系统的存储方式

磁盘是一个机械设备,外设。 磁盘的基本单位是扇区,一个扇区512字节,4KB。一片可以有n磁道,1磁道可以有m扇区。 如何找到指定位置的扇区?a.找到指定的磁头H b.找到指定的磁道(柱面)C c.找到指定的扇区S。这个叫CHS定址法…