千万级规模微服务稳定性技术揭秘:隔离策略

news2024/11/20 10:22:59

随着当今云原生的发展,无状态微服务系统通过其良好的设计理念和相关技术栈的成熟,成为越来越多企业建设系统的首选,但不可避免的是随着微服务拆分系统增多,稳定性慢慢会被重视,如何保证服务7*24小时不间断服务,节点或服务级异常不会影响到整个交易链路,会成为系统开发人员和架构师需要考虑的逃避不掉的问题。

我司基于Spring Cloud微服务技术的平台也上线6、7年,支持上千个微服务系统,积累了一些经验,在隔离方面总结如下:

  1. 服务级隔离,适用于某一类较大的微服务,需要使用独立的API网关;

  2. 端口级隔离,适用于一些不稳定的微服务,在API网关上使用独立端口,防止影响其他同端口微服务;

  3. 线程池级隔离,为每个微服务在API网关配置单独的线程池,使每个微服务进入API网关后流量相互不受影响,当流量徒增时,通过一定的线程池、队列和丢弃策略,保护API网关和后端微服务;

  4. 节点隔离,基于探活技术的故障节点隔离,自动摘除故障节点,防止某些节点假死,影响交易;

  5. 资源隔离,为系统提供隔离在独立的运行环境,减少资源抢占相互影响。

服务级隔离

服务级隔离更多是前期规划期间进行,一般用于API网关的使用。

已上图为例,一般查询商品的流量要比购买商品流量大得多,如果查询和购买两个流量都过同一组API网关,购买商品势必会收到影响。常见的做法API网关按照服务或一定的规则进行逻辑管理,对大流量的系统可以设置专门的API网关进行支持。结合API网关压测情况+容器云自动扩散容能力,能有效支撑突发流量,同时保障其他流量不受影响。

端口级隔离

大多数情况下会将入口流量配置在同一个端口下,也没什么问题,但在出现响应时间较长、请求量较大、连接长时间不释放场景时,就有可能阻塞端口,造成其他服务也不可用。比如上图同步通讯录一般响应时间较长,也有可能集中请求较多,就很容易阻塞,影响查询通讯录请求。我们可以在设计开发时使用单独的端口,避免对其他服务造成影响。

线程池隔离

当流量进入端口后,可以为每个微服务分配独立线程池,用于将不同的任务或服务放置在独立的线程池中,以实现资源的隔离和管理。线程池隔离可以帮助提高系统的稳定性和性能,并防止某个任务或服务的问题影响整个系统。

  • 通过容量控制设置每个线程池的最大线程数和队列容量,以控制并发请求的数量。通过限制线程池的容量,可以防止系统资源过度消耗,避免线程堆积和响应延迟;

  • 通过独立的线程池隔离,可以防止一个线程池中的任务出现异常或错误,扩散到其他线程池和服务中,这样可以确保系统的可用性和稳定性,避免单点故障对整个系统的影响。

  • 对每个线程池进行监控和性能调优,以确保其正常运行和高效利用资源。监控线程池的活动情况、任务执行时间和线程利用率等指标,及时发现潜在问题并采取相应的优化措施。

节点隔离

故障节点隔离是一种针对微服务架构中故障节点进行隔离和处理的技术。在大规模微服务系统中,节点故障是难以避免的,可能由于硬件故障、网络问题、软件错误或其他原因导致某个节点无法正常运行。为了保证整个系统的稳定性和可靠性,故障节点隔离技术可以采取以下措施:

  1. 快速故障检测:通过实时监控和故障检测机制,能够及时感知到节点的故障状态。这可以基于心跳机制、健康检查或其他监测手段来实现。一旦检测到节点故障,系统可以立即采取相应的措施进行隔离和处理。

  2. 自动隔离和切换:当故障节点被检测到时,系统可以自动将故障节点隔离,以避免其故障对整个系统的影响。这可能涉及到将故障节点从负载均衡器的轮询列表中移除,停止将请求转发给故障节点,并将流量转移到其他健康节点上。同时,系统可以自动触发切换逻辑,将请求路由到备用节点或冗余系统上,确保服务的连续性。

  3. 异常容错与恢复:当故障节点被隔离时,系统应该具备异常容错能力,能够处理由于节点隔离而引起的异常情况。这可能包括实现适当的错误处理和回退机制,例如返回默认值、发送错误通知或执行备用逻辑。同时,一旦故障节点恢复正常,系统应该能够自动将其重新纳入服务,并进行相应的资源分配和负载均衡。

资源隔离

使用容器化技术(如Docker)或虚拟化技术(如VMware)将不同的服务或组件隔离在独立的运行环境中,确保它们之间的资源不会互相干扰。通过为每个服务分配适当的资源限制,如CPU、内存和网络带宽,可以避免资源的竞争和冲突。

总结

在实战中,在设计阶段就需要根据预估的QPS量级,合理进行使用隔离技术。一般独立大系统建议使用独立网关,大系统中核心微服务使用独立端口,通过压力测试,合理配置线程池等参数大小,出现问题是隔离故障节点实现及时止损。

这些功能或技巧可以提升平台的稳定系,但在使用时会增加平台日常运维的复杂度,需要对多API网关进行分组管理,有时候操作不当很容易出现线上事故。解决方式是尽量提升管理平台的交互度和自动化程度,减少手工操作。在线上实践中可以逐步形成标准,统一规范,逐步赋能给支持的业务系统,提升其连续性。

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

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

相关文章

数据结构---循环链表

数据结构—循环链表 循环单链表 typedef struct LNode {ElemType data;struct LNode* next; }LNode, *LinkList;循环单链表初始化 bool InitList(LinkList &L) {L (LNode*)malloc(sizeof(LNode));if (L NULL) return false;L->next L; //头结点next指向头结点retur…

Postman:mock server简单使用,自定义获取response body

一.mock server的作用 创建一个虚假的服务器接口,只要访问就可以返回设定好的response. 可用于接口调试和接口自动化测试。 二.操作步骤 首先创建一个mock server 指定response body 创建成功后Collections那里会自动多一个跟mock server 对应的接口 接下来…

前端Vue自定义银行卡号格式化组件 中间卡号文本转星号

前端Vue自定义银行卡号格式化组件 中间卡号文本转星号, 下载完整代码请访问uni-app插件市场地址&#xff1a;https://ext.dcloud.net.cn/plugin?id13230 效果图如下: # cc-format-card #### 使用方法 使用方法 <!-- cardNo:银行卡号 isStar: 是否转星号 --> <cc…

基于Debian 12 “Bookworm “的SparkyLinux 7.0 “Orion Belt” 正式发布

导读SparkyLinux 开发人员今天宣布&#xff0c;SparkyLinux 7.0 “Orion Belt “已经发布并全面上市&#xff0c;这是这个基于Debian的GNU/Linux发行版的最新稳定更新。 基于最近发布的Debian 12 “Bookworm “操作系统系列&#xff0c;并与2023年7月15日的资料库同步&#xff…

bug汇集-三

1、 2、async...await 同步执行 方法一&#xff08;推荐&#xff09;&#xff1a;使用 async...await 同步执行 方法二: 不用async...await&#xff0c;就是异步处理&#xff0c;需要每一步 都加提示

如何不注册Oracle登录账号而下载Oracle11g客户端

注册非常烦人。简单的事情本来一个安装包就搞定的事情&#xff0c;结果搞得比上天还复杂。 进入这个界面&#xff1a; Instant Client for Windows 32-bithttps://www.oracle.com/database/technologies/instant-client/microsoft-windows-32-downloads.html打开界面后。用浏…

【安全】使用docker安装Nessus

目录 一、准备docker环境服务器&#xff08;略&#xff09; 二、安装 2.1 搜索镜像 2.2 拉取镜像 2.3 启动镜像 三、离线更新插件 3.1 获取challenge 3.2 官方注册获取激活码 3.3 使用challenge码和激活码获取插件下载地址 3.4 下载的插件以及许可协议复制到容器内 四…

数字逻辑与模拟电子技术-部分知识点(3)——数电部分-基本逻辑运算、复合逻辑运算

目录 基本逻辑运算 与逻辑运算 或逻辑运算 非逻辑运算 复合逻辑运算 与非逻辑 或非逻辑 与或非逻辑 异或逻辑 同或逻辑 基本逻辑运算 逻辑代数中只有三种基本逻辑运算,即 “与”、“或”、“非”。 与逻辑运算 定义&#xff1a;只有决定一事件的全部条件都具备时&…

怎么学习网络安全相关知识? - 易智编译EaseEditing

学习网络安全相关知识是一个系统性的过程&#xff0c;以下是一些学习网络安全的方法和建议&#xff1a; 学习基础知识&#xff1a; 了解计算机网络、操作系统、网络协议等基础知识。掌握网络的工作原理、常见的网络攻击方式和防御策略。 学习安全技术&#xff1a; 学习各种网…

Spark 3.4.x Server Client模式下的数据传输实现

背景 在Spark中python和jvm的通信杂谈–ArrowConverter中&#xff0c;我们提到Spark 3.4.x中是Client和Server之间的数据传输是采用Arrow IPC的&#xff0c;那具体是怎么实现的呢&#xff1f; 分析 直接上代码ClientE2ETestSuite test("createDataFrame from complex t…

nginxconfig-部属

一、下载源码&#xff08;master&#xff09; GitHub - digitalocean/nginxconfig.io: ⚙️ NGINX config generator on steroids &#x1f489; 二、编译 npm install npm run build 三、将编译后的dist目录下的文件拷贝到nginx托管服务器下的目录&#xff1a;/data/wwwroot…

zabbix微信告警

环境&#xff1a;点击查看 注册一个企业微信&#xff08;官网&#xff09; 进入后台管理 拉一个用户 创建一个应用 下载脚本&#xff08;这步保留个人看法&#xff09; [rootchenshuyi requests-2.18.3]# wget https://github.com/X-Mars/Zabbix-Alert-WeChat.git --2021-0…

原淘宝npm域名即将停止解析,请切换至新域名

https://developer.aliyun.com/mirror/NPM?spma2c6h.13651102.J_4121707010.2.3e221b11kPiuyz 设置查看npm 国内镜像地址 C:\>npm config get registry http://registry.npmmirror.com/C:\>npm config set registry http://registry.npmmirror.com/C:\>npm config …

windows安装python开发工具pycharm

下载地址 PyCharm: the Python IDE for Professional Developers by JetBrains 点击下载 安装 双击exe安装等待安装完成即可 设置python环境 添加本地python环境 选择python.exe 所在路径即可&#xff0c;2.x版本和3.x版本都可&#xff0c;根据需要进行调整

清华大学发布《2023年GPT赋能通信行业应用白皮书》(132页)

加gzh 回复“gpt” 获取《2023年AIGC(GPT-4)赋能通信行业应用白皮书》完整版 摘要&#xff1a;在ChatGPT/GPT-4席卷全球的热潮中&#xff0c;人们已经深刻认识到人工智能作为经济社会发展中一项变革性技术与关键性力量&#xff0c;将为全球产业带来的巨大飞跃和突破式发展&a…

SVN 多项目地址指向方法

前言 我们在实际的开发中往往可能管理着多个项目&#xff0c;多个项目都用SVN管理着&#xff0c;如果遇到SVN地址变更&#xff0c;以前我们需要对每个项目一一进行SVN重新定位&#xff0c;项目少还好&#xff0c;一旦项目很多并且SVN地址经常变的情况下&#xff0c;进行地址映…

【致敬未来的攻城狮计划】活动总结

活动总结 一转眼攻城狮计划就已经到了最后一天了。 5月我还处在一个迷茫期&#xff0c;那时候刚刚入坑嵌入式&#xff0c;只学了几款电子积木&#xff0c;对整个体系也不是很清楚&#xff0c;也不知道应该学些什么。因为刚刚转到硬件领域&#xff0c;也缺少相关经历和能力证明…

本地离线安装SeleniumIDE(Chrome)

一、插件下载 现需要准备一台可以连接外网的电脑&#xff0c;由于受到chrome的限制&#xff0c;我们可以选择搭梯子进行直接安装相应插件&#xff0c;但考虑到部分新手不会翻墙&#xff0c;本次提供一个不需翻墙的方法。 进入https://www.crx4chrome.com/crx/181591/网页内&…

推荐几款可以大幅提高开发效率的vscode插件 | 京东云技术团队

1、Vue 2 Snippets 这是一款基于vue2的代码片段提示插件&#xff0c;对于使用vue2的开发者特别友好&#xff0c;可大幅提高我们的编码速度。 他的能力非常强大&#xff0c;具体还需要我们去看他的文档&#xff0c;解锁更多能力。 2、Path Autocomplete 这是一款路劲提示插件…

ES(elasticsearch)删除指定索引

场景 需要删除指定的索引 语法 执行命令 DELETE /索引名比如&#xff1a;DELETE /mysql-status_-2023.06 执行结果&#xff1a; 判断索引是否删除成功 执行命令 HEAD /索引名比如&#xff1a;HEAD /mysql-status_-2023.06 执行结果&#xff1a; 说明已经删除完毕 总结…