谈谈我对服务熔断、服务降级的理解

2023-11-14

伴随着微服务架构被宣传得如火如荼,一些概念也被推到了我们面前(管你接受不接受),其实大多数概念以前就有,但很少被提的这么频繁(现在好像不提及都不好意思交流了)。想起有人总结的一句话,微服务架构的特点就是:“一解释就懂,一问就不知,一讨论就吵架”。

其实对老外的总结能力一直特别崇拜,Kevin Kelly、Martin Fowler、Werner Vogels……,都是著名的“演讲家”。正好这段时间看了些微服务、容器的相关资料,也在我们新一代产品中进行了部分实践,回过头来,再来谈谈对一些概念的理解。
今天先来说说“服务熔断”和“服务降级”。为什么要说这个呢,因为我很长时间里都把这两个概念同质化了,不知道这两个词大家怎么理解,一个意思or有所不同?现在的我是这么来看的:
  1. 在股票市场,熔断这个词大家都不陌生,是指当股指波幅达到某个点后,交易所为控制风险采取的暂停交易措施。相应的,服务熔断一般是指软件系统中,由于某些原因使得服务出现了过载现象,为防止造成整个系统故障,从而采用的一种保护措施,所以很多地方把熔断亦称为过载保护。
  2. 大家都见过女生旅行吧,大号的旅行箱是必备物,平常走走近处绰绰有余,但一旦出个远门,再大的箱子都白搭了,怎么办呢?常见的情景就是把物品拿出来分分堆,比了又比,最后一些非必需品的就忍痛放下了,等到下次箱子够用了,再带上用一用。而服务降级,就是这么回事,整体资源快不够了,忍痛将某些服务先关掉,待渡过难关,再开启回来。
所以从上述分析来看,两者其实从有些角度看是有一定的类似性的:
  1. 目的很一致,都是从可用性可靠性着想,为防止系统的整体缓慢甚至崩溃,采用的技术手段;
  2. 最终表现类似,对于两者来说,最终让用户体验到的是某些功能暂时不可达或不可用;
  3. 粒度一般都是服务级别,当然,业界也有不少更细粒度的做法,比如做到数据持久层(允许查询,不允许增删改);
  4. 自治性要求很高,熔断模式一般都是服务基于策略的自动触发,降级虽说可人工干预,但在微服务架构下,完全靠人显然不可能,开关预置、配置中心都是必要手段;
而两者的区别也是明显的:
  1. 触发原因不太一样,服务熔断一般是某个服务(下游服务)故障引起,而服务降级一般是从整体负荷考虑;
  2. 管理目标的层次不太一样,熔断其实是一个框架级的处理,每个微服务都需要(无层级之分),而降级一般需要对业务有层级之分(比如降级一般是从最外围服务开始)
  3. 实现方式不太一样,这个区别后面会单独来说;
当然这只是我个人对两者的理解,外面把两者归为完全一致的也不在少数,或者把熔断机制理解为应对降级目标的一种实现也说的过去,可能“一讨论就吵架”也正是这个原因吧!
概念算是说完了,避免空谈,我再总结下对常用的实现方法的理解。对于这两个概念,号称支持的框架可不少,Hystrix当属其中的佼佼者。
先说说最裸的熔断器的设计思路,下面这张图大家应该不陌生(我只是参考着又画了画),简明扼要的给出了好的熔断器实现的三个状态机:
		
  1. Closed:熔断器关闭状态,调用失败次数积累,到了阈值(或一定比例)则启动熔断机制;
  2. Open:熔断器打开状态,此时对下游的调用都内部直接返回错误,不走网络,但设计了一个时钟选项,默认的时钟达到了一定时间(这个时间一般设置成平均故障处理时间,也就是MTTR),到了这个时间,进入半熔断状态;
  3. Half-Open:半熔断状态,允许定量的服务请求,如果调用都成功(或一定比例)则认为恢复了,关闭熔断器,否则认为还没好,又回到熔断器打开状态;
那Hystrix,作为Netflix开源框架中的最受喜爱组件之一,是怎么处理依赖隔离,实现熔断机制的呢,他的处理远比我上面说个实现机制复杂的多,一起来看看核心代码吧,我只保留了代码片段的关键部分:
public abstract class HystrixCommand<R> extends AbstractCommand<R> implements HystrixExecutable<R>, HystrixInvokableInfo<R>, HystrixObservable<R> {

    protected abstract R run() throws Exception;

    protected R getFallback() {
        throw new UnsupportedOperationException("No fallback available.");
    }

    @Override
    final protected Observable<R> getExecutionObservable() {
        return Observable.defer(new Func0<Observable<R>>() {
            @Override
            public Observable<R> call() {
                try {
                    return Observable.just(run());
                } catch (Throwable ex) {
                    return Observable.error(ex);
                }
            }
        });
    }

    @Override
    final protected Observable<R> getFallbackObservable() {
        return Observable.defer(new Func0<Observable<R>>() {
            @Override
            public Observable<R> call() {
                try {
                    return Observable.just(getFallback());
                } catch (Throwable ex) {
                    return Observable.error(ex);
                }
            }
        });
    }

    public R execute() {
        try {
            return queue().get();
        } catch (Exception e) {
            throw decomposeException(e);
        }
    }
HystrixCommand是重重之重,在Hystrix的整个机制中,涉及到依赖边界的地方,都是通过这个Command模式进行调用的,显然,这个Command负责了核心的服务熔断和降级的处理,子类要实现的方法主要有两个:
  1. run方法:实现依赖的逻辑,或者说是实现微服务之间的调用;
  2. getFallBack方法:实现服务降级处理逻辑,只做熔断处理的则可不实现;
使用时,可参考如下方式:
public class TestCommand extends HystrixCommand<String> {

	protected TestCommand(HystrixCommandGroupKey group) {
		super(group);
	}

	@Override
	protected String run() throws Exception {
		//这里需要做实际调用逻辑
		return "Hello";
	}
	
	public static void main(String[] args) throws InterruptedException, ExecutionException, TimeoutException {
		TestCommand command = new TestCommand(HystrixCommandGroupKey.Factory.asKey("TestGroup"));
		
		//1.这个是同步调用
		command.execute();
		
		//2.这个是异步调用
		command.queue().get(500, TimeUnit.MILLISECONDS);
		
		//3.异步回调
		command.observe().subscribe(new Action1<String>() {
			public void call(String arg0) {
				
			}
		});
	}
}
细心的同学肯定发现Command机制里大量使用了Observable相关的API,这个是什么呢?原来其隶属于RxJava,这个框架就不多介绍了 --- 响应式开发,也是Netflix的作品之一,具体大家可参考这系列博客,我觉得作者写的很通俗:http://blog.csdn.net/lzyzsd/article/details/41833541/
接着呢,大家一定会问,那之前说的熔断阈值设置等,都在哪块做的呢?再来看看另一块核心代码:
public abstract class HystrixPropertiesStrategy {

    public HystrixCommandProperties getCommandProperties(HystrixCommandKey commandKey, HystrixCommandProperties.Setter builder) {
        return new HystrixPropertiesCommandDefault(commandKey, builder);
    }

    ......
}
这个类作为策略类,返回相关的属性配置,大家可重新实现。而在具体的策略中,主要包括以下几种策略属性配置:

  1. circuitBreakerEnabled:是否允许熔断,默认允许;
  2. circuitBreakerRequestVolumeThreshold:熔断器是否开启的阀值,也就是说单位时间超过了阀值请求数,熔断器才开;
  3. circuitBreakerSleepWindowInMilliseconds:熔断器默认工作时间,超过此时间会进入半开状态,即允许流量做尝试;
  4. circuitBreakerErrorThresholdPercentage:错误比例触发熔断;
  5. ......

属性很多,这里就不一一说明了,大家可参考HystrixCommandProperties类里的详细定义。还有一点要着重说明的,在熔断器的设计里,隔离采用了线程的方式(据说还有信号的方式,这两个区别我还没搞太明白),处理依赖并发和阻塞扩展,示意图如下:
	
如上图,好处也很明显,对于每个依赖都有独立可控的线程池,当然高并发时,CPU切换较多,有一定的影响。
啰嗦了一堆,最后总结一下,我认为服务熔断和服务降级两者是有区别的,同时通过对Hystrix的简单学习,了解了其实现机制,会逐步引入到我们的产品研发中。当然还有好多概念:服务限流、分流,请求与依赖分离等,后面有时间一一与大家分享。 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

谈谈我对服务熔断、服务降级的理解 的相关文章

  • Go 语言进阶(一) -- Go hertz http框架、kitex RPC微服务框架、gorm 数据库框架三件套用法详解

    Go 框架三件套 1 概论 Gorm Gorm 是一个已经迭代了10年 的功能强大的 ORM框架 在字节内部被广泛使用并且拥有非常丰富的开源扩展 Kitex Kitex 是字节内部 Golang 微服务 RPC 框架 具有高性能 强可扩展的
  • 【业务功能篇78】微服务-前端后端校验- 统一异常处理-JSR-303-validation注解

    5 前端校验 我们在前端提交的表单数据 我们也是需要对提交的数据做相关的校验的 Form 组件提供了表单验证的功能 只需要通过 rules 属性传入约定的验证规则 并将 Form Item 的 prop 属性设置为需校验的字段名即可 校验的
  • 领域驱动设计:DDD重构中台业务模型

    文章目录 如何避免重复造轮子 如何构建中台业务模型 如何避免重复造轮子 要避免重复建设 就要理解中台的理念和思想 中台是企业级能力复用平台 复用 用白话说就是重复使用 就是要避免重复造轮子的事情 中台的设计思想与 高内聚 低耦合 的设计原则
  • Nacos安装配置详细流程

    快速导航 1 Nacos安装 1 1概述 1 2 下载 1 3 安装 1 4 启动和关闭 1 5 测试 2 Nacos持久化 2 1为什么持久化 2 2配置Nacos持久化 2 2 1 切换数据库 2 2 2 初始化数据库 2 2 3 测试
  • [qiankun]实战问题汇总

    qiankun 实战问题汇总 ERROR SyntaxError Cannot use import statement outside a module 问题分析 解决方案 子应用命名问题 问题分析 解决方案 jsonpFunction
  • Thrift、Dubbo、Spring Cloud 和 gRPC

    何为RPC RPC Remote Procedure Call 远程过程调用 是一种进程间通信方式 是一种技术的思想 而不是规范 它允许程序调用另一个地址空间 通常是共享网络的另一台机器上 的过程或函数 而不用程序员显式编码这个远程调用的细
  • 云原生热门话题|什么是可观测性-Observability

    code杂坛 关注一线大厂 互联网时讯 各技术栈 产品 开源社区 等最新讯息 1 可观测性引入 可观测性 术语源于几十年前的控制理论 在许多实际问题中 控制系统的状态变量不是由直接测量得到的 而是通过某种观测方法得到的 由某种观测系统所得到
  • 只要 3 个注解,优雅的实现微服务鉴权!

    原创 不才陈某 码猿技术专栏 2023 04 17 08 50 发表于山东 大家好 我是不才陈某 前面的文章中介绍了网关集成Spring Security实现网关层面的统一的认证鉴权 有不清楚的可以看之前的文章 实战干货 Spring Cl
  • springcloud-eureka集群-整合hystrix框架整合feign

    继之前的项目继续扩展 整合hystrix和feign这两个框架 1 修改服务器调用者的application yml 增加如下代码 打开feign对hystrix的支持 feign hystrix enabled true 配置hystri
  • 【微服务架构设计】微服务不是魔术:处理超时

    微服务很重要 它们可以为我们的架构和团队带来一些相当大的胜利 但微服务也有很多成本 随着微服务 无服务器和其他分布式系统架构在行业中变得更加普遍 我们将它们的问题和解决它们的策略内化是至关重要的 在本文中 我们将研究网络边界可能引入的许多棘
  • 无法找到名为 CircuitBreaker 的 GatewayFilterFactory

    属性文件 server port 8999 eureka instance hostname localhost Actuator Configuration management endpoints web exposure includ
  • 将新字段添加到来自 Netflix Zuul 预过滤器的请求正文

    我正在尝试在 Zuul 预过滤器中向请求正文添加一个新字段 我正在使用 Neflix 的 Zuul 示例项目之一here 我的过滤器的实现非常类似于UppercaseRequestEntityFilter从这个样本 我能够应用诸如大写之类的
  • 微服务测试是什么?

    微服务测试是一种特殊的 测试类型 因为它涉及到多个独立的服务 以下是进行微服务测试的一般性步骤 1 确定系统架构 了解微服务架构对成功测试至关重要 确定每个微服务的职责 接口 依赖项和通信方式 了解这些信息可以帮助您更好地规划测试用例和测试
  • Docker与微服务:构建和部署微服务架构的完整指南

    微服务架构已经成为现代应用开发的主要范式之一 而Docker容器技术则为微服务的构建 部署和管理提供了理想的解决方案 本文将深入探讨如何使用Docker构建和部署微服务架构 提供更多示例代码和细致的指南 以帮助大家更全面地理解和运用这些关键
  • 什么是微服务

    微服务是一种架构风格 它把一个大型的复杂软件应用划分为一系列小的服务 每个服务都具有单一的功能 运行在其自己的进程中 并通常基于不同的编程语言和框架 这些服务之间通过轻量级通信机制相互通信 这种通信机制基于HTTP协议 微服务架构风格使得系
  • 当目标系统关闭时,停止 Spring Cloud Stream @StreamListener 监听

    我有一个应用程序 它从 Kafka 获取消息并调用目标系统来更新旧版 Oracle 数据库 我想要启用一个场景 如果目标系统关闭 则将消息留在 Kafka 总线上 并且在给定的时间内不处理它们 我正在考虑一些基于 Hystrix 的断路器解
  • 如何通过JMX暴露Hystrix的断路器状态

    我一直在寻找有关如何在 JMX 上公开 Hystrix 断路器状态的教程 我刚刚发现了一个用于公开指标 例如计数器 仪表等 的 API 使用hystrix servo metrics publisher 是否可以在 JMX 上公开断路器状态
  • Hystrix 忽略运行超时

    我正在尝试使用 Hystrix 我理解文档 即使通过 运行 同步调用 Hystrix 命令也会默认在线程中运行 并且应该受到 Hystrix 中配置的超时的影响 但当我尝试时 似乎没有发生超时 我是否误解了文档 或者我做错了什么 有没有办法
  • 使用 Spring Boot 和 Netflix Zuul 的简单反向代理

    我正在寻找使用 Spring Boot 实现一个简单的反向代理 即 轻松添加路线 能够在每个路由的基础上添加自定义身份验证 根据需要添加其他标头 我查看了提供的设施 EnableZuulProxy注释 但它似乎太重量级了 因为我不想使用 E
  • 春云|假装 Hytrix |首次调用超时

    我有一项服务使用了 3 个假客户端 每次启动应用程序时 我都会在第一次调用任何假客户端时收到 TimeoutException 在一切稳定之前 我必须至少触发每个假客户端一次 在网上查了一下 问题是 feign 或 hystrix 内部的某

随机推荐

  • 一、django错误集合

    1 django core exceptions ImproperlyConfigured WSGI application LARS wsgi application could not be loaded Error importing
  • 强迫自己学习Jquery三

    元素定位问题 offset 和 position必须要好好看一下 转载于 https www cnblogs com jamesldj p 3323707 html
  • 前端系列之jQuery(jQuery选择的艺术)

    一 jQuery是什么 是一款JavaScript库 方便地处理HTML 事件 动画等 html 处理HTML文档中的DOM节点 如添加 删除等 事件 通过jQuery对页面上的事件进行处理 动画 通过jQuery实现淡入 淡出 滑动等动画
  • node中文件的上传与下载

    一 node基于Express项目实现文件的上传 1 FormData对象 以对象的方式来表示页面中的表单 又称为表单对象 以key value的方式来保存数据 XMLHttpRequest对象可以轻松的表单对象发送的服务器端 1 使用构造
  • HJ9 提取不重复的整数

    描述 输入一个 int 型整数 按照从右向左的阅读顺序 返回一个不含重复数字的新的整数 保证输入的整数最后一位不是 0 数据范围 1 n 10 8 输入描述 输入一个int型整数 输出描述 按照从右向左的阅读顺序 返回一个不含重复数字的新的
  • 理解virt res shr之间的关系 - linux

    转自 https www orchome com 298 想必在linux上写过程序的同学都有分析进程占用多少内存的经历 或者被问到这样的问题 你的程序在运行时占用了多少内存 物理内存 通常我们可以通过top命令查看进程占用了多少内存 这里
  • Kafka权威指南

    第一章 初识Kafka kafka是一款发布订阅的消息系统 具体结构从大向下可以列举为 1个Kafka集群种有N个broker 一个broker有N个主题分区 broker指的是一个独立的Kafka服务器 主题指的是消息的分类 为什么要选用
  • SQLI-Labs(18-22关)请求头注入

    十八关 这里这个提示就是一些浏览器会记录我们的IP信息 那么记录了就会被存储到数据库中就有可能存在SQL注入 这里需要引入几个数据头信息 User agent 浏览器的身份识别字符串 简单来说就是根据这个字段来判断是通过PC端还是手机端访问
  • CentOS一键配置rsync服务器脚本

    1 保存下面的代码为一个文件 上传到服务器端 名称为rsync sh bin bash rsync Written by zhumaohai For more information please visit http www centos
  • JavaSE的复习:Java基本语法

    1 变量 变量的分类 按数据类型 对于每一种数据都定义了明确的具体数据类型 强类型语言 在内存中分配了不同大小的内存空间 弱类型语言则不用明确指明数据类型 例如js var 变量的分类 按声明的位置的不同 在方法体外 类体内声明的变量称为成
  • Oracle安装 在注册表中没有找到指定的主目录名 的解决方案

    在安装数据库的时候 报了个错 在注册表中没有找到指定的主目录名 解决方案就是 忽略 此错误并不影响Oracle的正常使用 亲测可行 也不排除不可用的情况 如果谁遇到了请告知 我将继续补充
  • vue-cli3配置proxy解决前后端域名/端口不一致引起的跨域问题

    错误代码 前端 import axios from axios import VueAxios from vue axios Vue use VueAxios axios this axios post http localhost 808
  • (一)JMeter性能测试,完整入门篇:性能测试操作步骤

    原文转自 https blog csdn net lovesoo article details 78579547 1 Jmeter简介 Apache JMeter是一款纯java编写负载功能测试和性能测试开源工具软件 相比Loadrunn
  • sentinel

    文章目录 1 sentinel简介 1 1 sentinel解决的问题 1 2 服务保护技术对比 2 微服务整合sentinel 2 1 引入sentinel依赖 2 2 配置控制台地址 3 限流规则 3 1 流控模式 3 2 流控效果 4
  • 华为路由交换学习篇-ACL

    目录 ACL访问控制列表 基本ACL 高级ACL 实验一 ACL访问控制列表 ACL的分类 按照功能来分 可以分为基本ACL 高级ACL 基于接口的ACL 二层ACL 自定义的ACL 基于MPLS的ACL 基本ACL6 高级ACL6 基本A
  • 考研:研究生考试(十五天学完)之研究生学霸重点知识点总结之考研必知(考研时间/科目/必备物件)、【考研政治】/【考研英语】/【考研数学】经验总结(历年规律分析、技巧总结、经验分享)

    考研 研究生考试 十五天学完 之研究生学霸重点知识点总结之考研必知 考研时间 科目 必备物件 考研政治 考研英语 考研数学 经验总结 历年规律分析 技巧总结 经验分享 文章转自 考研 研究生考试 十五天学完 之研究生学霸重点知识点总结之考研
  • Guava学习笔记之Maps(1):Maps.uniqueIndex(Iterable, Function)

    Guava官方文档 https github com google guava wiki CollectionUtilitiesExplained 官方文档这样描述 Maps uniqueIndex Iterable Function ht
  • 【JavaWeb】四个Scope

    英文科普 scope 范围 域 1 page里的变量没法从index jsp传递到test jsp 只要页面跳转了 它们就不见了 以页面为单位 2 request里的变量可以跨越forward前后的两页 但是只要刷新页面 它们就重新计算了
  • Java中对象的比较

    目录 一 基本数据类型的比较 二 引用数据类型比较 1 equals 方法 1 实现Comparable接口 2 传比较器 一 基本数据类型的比较 我们在比较基本类型的数据时 通常用 来判断 也比较简单 int a 3 int b 5 Sy
  • 谈谈我对服务熔断、服务降级的理解

    伴随着微服务架构被宣传得如火如荼 一些概念也被推到了我们面前 管你接受不接受 其实大多数概念以前就有 但很少被提的这么频繁 现在好像不提及都不好意思交流了 想起有人总结的一句话 微服务架构的特点就是 一解释就懂 一问就不知 一讨论就吵架 其