golang 微服务容错处理是如何做的?

news2024/12/22 22:40:42

随着微服务的规模越来越大,各个微服务之间可能会存在错综复杂的调用关系

在我们实际工作中,确实慢慢的也出现了很多问题,整个系统的弊端的慢慢的展现出来

例如就会有这样的情况:

  • 服务 A 去请求服务B,服务 B 还需要去请求 服务 C,由于服务 C 的问题,导致整条链路都出现了问题,甚至整个系统都坏掉

工作中,我们一般为了提高服务的健壮性,会去设置失败后重试机制,用来避免一些因为网络抖动,暂时性的故障

可是,如果是一个长期性的故障,那么这个重试机制,只会加重我们服务的负担,一直在消耗连接和性能

这个时候,就需要服务熔断机制

服务熔断机制

服务的熔断机制是什么呢?

其实熔断,是我们以前学习物理知识的时候听到过的词,例如家里的电路,在总开关的位置,都会有一个保险丝来保障我们电路的安全,若是出现了短路,或者是电流异常过大的情况下,保险丝就会因为过热而被熔断,进而断电,最终达到保护电表和电路的作用

在如今的微服务架构中,也需要有这一根保险丝

如上图,是一个很常见的微服务之间的调用关系

请求 :客户端 – 网关 – 服务A – 服务B

响应:服务B – 服务A – 网关 – 客户端

整条链路中,只要有一个点出现问题,客户端都无法得到期望的结果

在微服务架构中,服务之间的调用一般分为

  • 服务调用方
  • 服务提供方

为什么需要熔断?

当下游的服务因为过载或故障,无法提供服务,我们需要及时的让上游服务知悉,且暂时 熔断 调用方和提供方的调用链,这是为了避免服务雪崩现象的发生

服务雪崩

服务雪崩就是指调用链中的某个环节不可用了,此处特别指的是服务的提供方,导致上游服务不可用,并最终影响像雪崩一样扩散到整个系统,最终导致整个系统都不可用

简单故障场景

还是上面的一个熟悉场景,正常的 客户端 – 网关 – 服务A – 服务B 请求过程中,上面展示了三个阶段,这也是服务雪崩一般的 3 个阶段

  • 服务提供者不可用

系统运行之处,一切运转良好。每个服务正常请求和响应,当某一个刻,服务 B 由于 自身异常,或者网络故障导致自身不可用,无法及时的响应打过来的各种请求

  • 服务调用者不可用

在 服务B 作为服务提供者不可用的时候,客户端可能会因为错误提示,或者长时间的阻塞而不断的发送相同的请求到网关去,请求再次发送到网关,发送到 服务 A,最终又到 服务 B 知道超时也没有正常响应

重复多次,因为服务 A发起了过多的请求给到服务 B 而产生的等待线程,耗尽了线程池中的资源,那么 服务 A 自身也无法及时响应外部的请求,最终导致 服务 A 也不可用

  • 整个系统不可用

经过上述的流程,服务 A同样也阻塞了转发请求的网关,网关因为大量的等待请求响应也会产生大量的阻塞线程,同样的道理,网关最后没有足够的资源去处理其他请求,这样就导致整个系统无法对外提供服务

加上服务融到保障系统的可用性

如上图,服务 A 访问 服务 B 的过程中,中间加了一个保险丝,也就是一个断路器,

  • 当服务 A 访问 服务 B 的时候,服务 B 这时出现了轻微故障,导致超时返回
  • 服务 A 又 继续访问 服务 B 的时候,服务 B 已经不可用了,导致相应失败
  • 此时断路器检测到异常,则打开保险丝,设置异常返回
  • 服务 A 再次访问服务 B,保险丝自身就立即返回 错误消息给到 服务 A,这样避免服务 A 资源耗尽而不可用,进而保护了服务调用者

断路器

如上图,断路器有 3 中状态互相切换,我们可以这样来理解:

1 关闭状态 – 打开状态

  • 周期内函数执行失败超出阈值,就会从关闭状态到打开状态

2 打开状态 – 半开状态

  • 一定时候后,断路器会尝试执行请求函数,就会转到半开状态

3 半开 – 关闭

  • 尝试执行请求成功次数超过设定的阈值,就会转到关闭状态

4 半开状态 – 打开状态

  • 尝试执行请求函数成功次数没有超过设定的阈值,就会转到打开状态

今天就到这里,学习所得,若有偏差,还请斧正

欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是阿兵云原生,欢迎点赞关注收藏,下次见~

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

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

相关文章

HTB-Silo

HTB-Silo 信息收集立足root哈希传递攻击 信息收集 分别对smb和rpc都进行guest用户和空密码测试。 1521的Oracle TNS listener 11.2.0.2.0。 搜索可能存在的漏洞。 得到一个CVE编号cve-2012-1675。同时我们可以对其进行SID枚举,SID说简单点就是数据库的名字。 简单…

错题汇总04

1.以下C语言指令: int a[5] {1,3,5,7,9}; int *p (int *)(&a1); printf(“%d,%d”,*(a1),*(p-1)); 运行结果是什么? A 2,1 B 3,1 C 3,9 D 运行时崩溃 数组名只有在&与sizeof之后,才表明数组本身,其余表…

平均情况时间复杂度

// n表示数组array的长度 int find(int[] array, int n, int x) {int i 0;int pos -1;for (; i < n; i) {if (array[i] x){ pos i; break;}}return pos; } 通过以上代码&#xff0c;我们分析一下平均情况时间复杂度。 以上代码要查找的变量 x 在数组中的位置&#xff…

并发编程02:CompletableFuture

文章目录 2.1 Future接口理论知识2.2 Future接口常用实现类FutureTask异步任务2.2.1 Future接口能干什么2.2.2 Future接口相关架构2.2.3 Future编码实战和优缺点分析2.2.4 完成一些复杂的任务 2.3 CompletableFuture对Future的改进2.3.1 CompletableFuture为什么会出现2.3.2 Co…

Redis持久化篇

文章目录 持久化篇1、AOF持久化是怎么实现的&#xff1f;1.1、AOF日志1.2、三种写回策略1.3、AOF重写机制1.4、AOF后台重写 2、RDB快照是怎么实现的&#xff1f;2.1、快照怎么使用2.2、执行快照时&#xff0c;数据能被修改吗&#xff1f;2.3、RDB和AOF合体 3、Redis大key对持久…

自动驾驶行业观察之2023上海车展-----智驾供应链(2)

传感器供应链发展 图达通&#xff1a;展示长距Lidar“Falcon”&#xff0c;和DeepWay签署定点协议 产品&#xff1a;主视激光雷达 Falcon 猎鹰&#xff08;2023CES曾亮相&#xff09; 核心亮点&#xff1a; • 核心性能&#xff1a;最远探测距离可达 500 米&#xff0c;为智…

《计算机网络—自顶向下方法》 第一章Wireshark实验:Wireshark软件的安装和入门

要深入理解网络协议&#xff0c;需要仔细观察协议实体之间交换的报文序列。为探究协议操作细节&#xff0c;可使协议实体执行某些动作&#xff0c;观察这些动作及其影响。这些任务可以在仿真环境下或在如因特网这样的真实网络环境中完成。观察在正在运行协议实体间交换报文的基…

万字长文详解linux内存管理,值得收藏

一、Linux内存管理概述 Linux内存管理是指对系统内存的分配、释放、映射、管理、交换、压缩等一系列操作的管理。在Linux中&#xff0c;内存被划分为多个区域&#xff0c;每个区域有不同的作用&#xff0c;包括内核空间、用户空间、缓存、交换分区等。Linux内存管理的目标是最…

经典常用的脚本讲解

目录 一&#xff1a;echo 语句 二&#xff1a;while read命令​编辑 三&#xff1a;猴子摘香蕉问题 四:斐波拉切数求前10个数的和 ​五&#xff1a;随机生成8位数的密码 六&#xff1a;二进制转换 &#xff08;1&#xff09;余数倒排法 &#xff08;2&#xff09;减法正…

Google - ISLR 比赛总结

引言 本篇主要想总结一下最近打的GISLR比赛&#xff0c;本来是没想写的&#xff0c;比赛前期感觉赛题很有意思&#xff0c;做了eda以及根据一些base改了改自己的方案&#xff0c;取得了还不错的结果&#xff0c;但因为中途被各种琐事缠身&#xff0c;发生了很多变故&#xff0…

【Linux】Libevent库

Libevent——高性能I/O框架库 底层封装了select&#xff0c;poll&#xff0c;epoll&#xff0c;便于使用 I/O框架库以库函数的形式&#xff0c;封装了较为底层的系统调用&#xff0c;给应用程序提供了一组更便于使用的接口。 特点&#xff1a;1.跨平台&#xff0c;2.统一事件源…

c++面向对象之封装、继承、和多态

一、封装 把客观事物封装成类&#xff0c;而且可以把自己的数据和方法设置为只能让可信的类或者对象操作&#xff0c;对不可信的信息进行隐藏&#xff08;利用public,private,protected,friend)实现 二、继承 2.1类与类的关系 has-a &#xff1a;描述一个类由多个部件类构成…

SpringCloud全面学习笔记之初尝美妙篇

目录 前言初识微服务单体架构分布式架构微服务架构初见SpringCloud微服务治理分布式服务架构案例 微服务组件及使用Eureka注册中心提供者和消费者Eureka的结构和作用搭建Eureka服务注册服务服务发现Eureka注册服务总结 Ribbon负载均衡原理负载均衡原理负载均衡策略懒加载 Nacos…

Qt quick基础2(包含平移旋转放缩以及qml控件大写开头啊)

Qt quick基础2&#xff08;包含平移旋转放缩以及qml控件大写开头啊&#xff09; 目录 Qt quick基础2&#xff08;包含平移旋转放缩以及qml控件大写开头啊&#xff09;前言简单的平移、旋转和放缩其他元素的一些基本使用qml文件作为控件时&#xff0c;务必以大写字母开头命名小结…

力扣题库刷题笔记682-棒球比赛

1、题目如下&#xff1a; 2、个人Python代码实现如下&#xff1a; 代码如下&#xff1a; class Solution: def calPoints(self, operations: List[str]) -> int: i 0 #用于遍历元素的下标 while i < len(operations): …

【Python入门篇】——Python基础语法(数据类型与数据类型转换)

作者简介&#xff1a; 辭七七&#xff0c;目前大一&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a; Python入门&#xff0c;本专栏主要内容为Python的基础语法&#xff0c;Python中的选择循环语句…

数据结构与算法导学

文章目录 数据结构和算法导学认识数据结构认识算法总结 数据结构和算法导学 程序 数据结构 算法 认识数据结构 什么是数据结构&#xff1f; 数据结构是一门研究计算机中数据存储和数据操作的学科。 为什么要学习数据结构&#xff1f; 学习数据结构能让我们写出更加优秀的代码…

关于在线帮助中心你需要思考以下几个问题

搭建帮助中心是大多数企业都在尝试做的事情&#xff0c;它的重要性对于企业来说不言而喻。现在对于企业来说&#xff0c;搭建帮助中心或许不是什么难事&#xff0c;但是关于帮助中心&#xff0c;有几个问题需要思考清楚&#xff0c;才能让其发挥最大的价值。 一、如何让用户养成…

CAS 原子操作类

CAS 原子类 java.util.concurrent.atomic 是什么 CAS compare and swap的缩写&#xff0c;中文翻译比较并交换&#xff0c;实现并发算法时常用的一种技术 它包含三个操作数–内存位置、预期原值及更新值 执行CAS操作时&#xff0c;将内存位置的值与预期原值比较 如果相匹…

网络协议与攻击模拟-05-ICMP协议

ICMP 协议 1、理解 ICMP 协议 2、理解 ICMP 重定向 3、会使用 wireshark 分析 ICMP 重定向流量实验 一、 ICMP 基本概念 1、 ICMP 协议 Internet 控制报文协议&#xff0c;用于在 IP 主机、路由器之间传递控制消息&#xff0c;控制消息指网络通不通、主机是否可达、路由是否…