从0到1实现RPC | 09 故障隔离与恢复

news2025/6/9 22:31:39

一、应用场景

故障隔离解决的是:当服务提供者provider出现异常时,消费者consumer就不再调用异常实例,而是选择好的实例,避免频繁出错。

故障恢复解决的是:一段时间过后,服务提供者provider可以正常提供服务时,可以自动加入到正常的服务列表。供消费者调用。

二、数据结构

使用到的数据结构包括:

  • providers:所有服务提供者,List类型;

  • isolatedProviders:被隔离的服务提供者列表,List类型;

  • halfOpenProviders:处于半开的服务提供者,用于自动探活,自动恢复,List类型;

  • SlidingTimeWindow:滑动窗口,用于统计在指定时间内发生的异常次数;

  • windows:一个实例对应一个滑动窗口,Map类型。

三、代码实现

在消费者端远程调用的动态代理类RpcInvocationHandler中,添加探活、故障隔离和故障恢复的实现逻辑。

图片

探活

为了能够拿到故障的实例,使用了halfOpenProviders,里面存储的就是故障的实例,使用定时任务,10s后启动,每隔60s执行一次半开逻辑:从故障实例中添加到半开实例中,用于请求探活。

图片

halfOpenProviders不为空,说明里面有处于故障中的实例,在请求中可以尝试使用该实例,进行一次远程调用。

如果为空,说明都是正常的实例,就走之前实现的负载均衡的逻辑。

使用synchronized防止并发异常。

图片

故障隔离

当某次调用出现异常时,使用滑动窗口记录该实例的异常调用次数,每发生一次异常就记录一次,当发生的异常次数达到指定阈值后,就隔离该实例。当前默认参数是:在30s内发生两次异常就会被隔离。

图片

隔离的逻辑其实很简单,就是将该实例从能够提供正常服务的实例providers中移除,添加到被隔离的提供者中。

图片

故障恢复

假如能够提供正常服务的实例providers不包含当前请求的实例,就从故障实例isolatedProviders中移除,添加到正常实例providers中。

使用synchronized防止并发异常。

图片

四、测试

  1. 在服务提供者provide端,添加方法isolate(),实现逻辑是当请求端口为8081时,使用除法,在测试时传入id=0,抛出异常。

图片

  1. 在消费者consumer端提供调用接口。

图片

  1. 启动zookeepr作为注册中心。
  2. 分别使用端口8081,8082,8083启动服务提供者provider。

图片

  1. 启动consumer。
  2. 多次发起请求调用。

传入参数id,使用的是轮询负载均衡,消费者会依次调用端口为8081,8082, 8083 的提供者,当前id为0,端口是8081会抛出异常。

在30s内发生超过两次的异常就会被隔离,每隔60s会有定时任务添加半开故障实例。

图片

  1. 观察日志。

先是8081发生故障次数达到指定阈值,加入到故障实例集合isolatedProviders当中。能够提供正常服务的providers就只有8082和8083

图片

接下来的请求,就不会走故障实例8081,达到故障隔离的目的。轮询调用的是8082和8083.

图片

60s后,定时任务执行,故障实例8081添加到半开实例 halfOpenProviders 中。

再进行一次请求时,会进行探活,尝试调用8081,传入参数id=1,调用成功,故障实例8081又重新添加到正常实例providers当中,故障实例成功恢复。

图片

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

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

相关文章

AWS游戏全球智能翻译,助力企业出海

随着全球数字化时代的到来,游戏行业已经成为跨越国界、语言和文化的强大力量。然而,要将游戏产品成功推向全球市场并确保用户体验的流畅与愉悦,语言障碍却是一道不可忽视的挑战。在这个多元化的世界中,如何解决语言障碍&#xff0…

openGauss学习笔记-260 openGauss性能调优-使用Plan Hint进行调优-同层参数化路径的Hint

文章目录 openGauss学习笔记-260 openGauss性能调优-使用Plan Hint进行调优-同层参数化路径的Hint260.1 功能描述260.2 语法格式260.3 示例 openGauss学习笔记-260 openGauss性能调优-使用Plan Hint进行调优-同层参数化路径的Hint 260.1 功能描述 通过predpush_same_level Hi…

学习C++有没有必要学习boost库?

在深入学习C这一强大且灵活的编程语言的过程中,是否有必要学习Boost库是许多开发者会面临的一个重要问题。Boost库,被誉为C的“瑞士军刀”,以其丰富的工具集和强大的功能性深受广大C程序员的喜爱。本文将就此问题进行详细的探讨。 一、Boost…

关于ABP 新增表,dbfirst模式

下面的代码是基于abp生成的项目,项目名:Store 1.在Domain结尾的项目中通过EF工具生成数据实体: Scaffold-DbContext Data Source服务器IP;Initial Catalog数据库;User Idsa;Password密码;EncryptFalse; Microsoft.EntityFrameworkCore.SqlS…

【论文精读】 GPT,GPT-2,GPT-3:大力出奇迹

系列文章目录 【论文精读】Transformer:Attention Is All You Need 【论文精读】BERT:Pre-training of Deep Bidirectional Transformers for Language Understanding 文章目录 系列文章目录一、前言二、GPT(一)文章概览&#xf…

19c数据库/dev/shm/过小导致pga内存不够

pga_aggregate_limit已经设置了120G,alert还是报内存不够 查询select * from v$pgastat,发现MGA占了80G内存 查看/dev/shm: 发现设置了7G,操作系统是512G,正常情况下/dev/shm应该是操作系统的一半,修改为250G后数据库…

小米温度计接入HA后,手机米家app里温度计就看不到温度数值了

环境: 小米温度计 HA OS Core 2023.12.1 Supervisor 2024.04.0 Operating System 11.1 问题描述: 小米温度计接入HA后,手机米家app里和HA里面温度计就看不到温度数值了 解决方案: 1.前往米家APP,解绑温度计和本地…

如何本地部署Splunk Enterprise数据管理平台并实现异地远程使用

文章目录 前言1. 搭建Splunk Enterprise2. windows 安装 cpolar3. 创建Splunk Enterprise公网访问地址4. 远程访问Splunk Enterprise服务5. 固定远程地址 前言 本文主要介绍如何简单几步,结合cpolar内网穿透工具实现随时随地在任意浏览器,远程访问在本地…

C语言洛谷题目分享(8)入门和Lake Counting S

1.前言 大家好啊,今天继续为大家分享俩道洛谷dfs的题目,希望能对大家有所帮助。 2.俩道题目 1.入门(P1683) 1.题目描述 不是任何人都可以进入桃花岛的,黄药师最讨厌像郭靖一样呆头呆脑的人。所以,他在…

智慧城市3D实景线上漫游视频提升大家的兴趣

在数字技术的驱动下,我们推出了全新的样板房3D全景漫游体验,为客户带来前所未有的看房之旅。无论您身处何地,无论何时,只需轻点鼠标或触摸屏幕,即可轻松跨越地域和时间的限制,自由探索每一处精致细节。 我们…

抖音小店无货源爆发期过了吗?现在还能做吗?

大家好,我是电商花花。 抖音小店爆发期过了吗? 我并不觉得,反而抖音小店的流量越来越大了,今年抖音小店日活跃用户已经突破到了9亿,有更大的市场和流量了,且现在做店越来越多了,再加上平台的支…

浅谈网络安全威胁与防御策略

企业网络安全威胁概述 外部威胁:来自网络安全威胁,比如DDOS攻击,病毒,sql注入,木马,蠕虫,等网络入侵,网络扫描,垃圾邮件,钓鱼邮件,针对web的攻击…

C++11 设计模式0. 设计模式的基本概念,设计模式的准则,如何学习设计模式,24种设计模式的分为3大类

一 设计模式的基本概念: 模式:指事物的标准样式 或者 理解成 针对特定问题的可重用解决方案。 设计模式,是在特定问题发生时的可重用解决方案。 设计模式一般用于大型项目中。 大型项目中,设计模式保证所设计的模块之间代码的灵…

【opencv】示例-falsecolor.cpp 使用OpenCV函数动态地对图像应用不同的色彩映射

该代码是一个使用OpenCV库实现的C程序,主要用来展示如何通过applyColorMap函数将色彩映射应用到一个灰度图像上,并提供一个滑动条来实时改变色彩映射的效果。此外,该程序还可以绘制包含不同形状的灰度图像,用作applyColorMap函数的…

NX/UG二次开发—CAM—一些外挂刀路选择方案对比

在做一刀轨编辑工具时,大家希望实现类似NX刀轨编辑中选择刀路的功能,以下我罗列了几种目前外挂里使用的几种方式,自己也做了一些对比: 涉及一些运算时间,参考电脑配置(内存32G,CPUi9-12950HX) 1、刀路转成…

idea链接gitlab的token到期

报错 HTTP Request Request GET http://36.46.143.158:6060/api/v4/version failed wit

乡村振兴多元共治,共绘乡村新蓝图:政府引领、企业助力、村民参与

乡村振兴是一项复杂而艰巨的任务,需要从多个角度进行考虑。以下是从不同身份出发对乡村振兴建设的思考: 1、政府领导的角度: 政府是乡村振兴的主要推动者和组织者。在制定和实施乡村振兴战略时,政府需要注重规划引领,科…

PHP7垃圾回收算法

前提 本文为了梳理PHP GC工作流程,所以从引用计数、部分标记清除算法做引子,然后介绍PHP GC工作流程,最后介绍性能更高的GC算法 引用计数 概述 引用计数算法中引入了一个概念计数器。计数器代表对象被引用的次数 基本原理 为了记录一个对象有没有被…

微信公众号第三方平台-公众号扫码授权接入代运营

文章目录 接入目的效果展示技术积累如何成为服务商如何搭建第三方后端服务传统模式V云服务模式如何完成商家授权授权逻辑介绍 环境准备注册开发者平台-个人类型 传统模式后端代码接收公众号个人三方平台的票据根据票据获取三方平台访问令牌根据访问令牌获取预授权码通过预授权码…

如何本地搭建开源导航页配置服务Dashy并发布到公网分享好友使用

文章目录 简介1. 安装Dashy2. 安装cpolar3.配置公网访问地址4. 固定域名访问 正文开始前给大家推荐个网站,前些天发现了一个巨牛的 人工智能学习网站, 通俗易懂,风趣幽默,忍不住分享一下给大家。[点击跳转到网站] 简介 Dashy 是…