微服务雪崩效应与 Hystrix

文章目录

  • 微服务雪崩效应
  • 微服务中常见的容错方案
  • 常见的服务容错思路
  • Hystrix 简介

微服务雪崩效应

微服务系统中, 每一个服务专心于自己的业务逻辑, 并对外提供相应的接口, 看上去似乎耦合度比较低, 但经常会遇见这样一种场景:
在这里插入图片描述

可以看到, 当 C 服务挂掉时, B 服务还在不断地调用 C 服务期望获得结果, 结果在 B 服务内部产生了大量的调用等待重试调用的线程, 随着新的请求不断地往这条调用链路上跑, 那么 B 服务的资源就会被这些线程耗尽, 从而导致 B 服务也不可用。同理, 当 B 服务也挂掉时, A 服务挂掉也只是时间的问题了。

由于服务与服务之间的依赖性, 故障会传播, 最终将会对整个微服务系统造成灾难性的后果, 这就是微服务故障的雪崩效应。

微服务中常见的容错方案

在分布式场景下, 由于网络不可靠或者服务自身设计不合理等各种各样的原因, 我们无法完全杜绝雪崩源头的发生。
只有设计合理的容错方案, 保证在一个服务发生问题之后, 不会级联地影响到其他服务的正常运行, 才是应对雪崩效应的最好办法。

常见的服务容错思路

  • 隔离 : 按照一定的原则划分为若干个服务模块, 各个模块之间相互独立, 无强依赖。当有故障发生时, 能将问题和影响隔离在某个模块内部, 而不扩散锋线, 不波及其他模块, 不影响微服务系统整体。常见的隔离方式有:
    • 线程池隔离
    • 信号量隔离
  • 超时 : 在上游服务调用下游服务时, 设置一个最大响应时间, 如果超过这个时间下游还未做出反应, 则直接断开请求, 执行本地 fallback 逻辑。
  • 限流 : 限流就是限制系统的输入和输出流量来达到保护系统的目的。
  • 熔断 : 当下游服务宕机或者响应变慢时, 上游服务为了保护系统整体的可用性, 可以暂时切断对下游服务的调用。服务熔断一般有三种状态:
    • 熔断关闭状态(Closed) : 当下游服务没有故障时, 熔断器所处的状态, 对下游服务的调用不做任何限制。
    • 熔断开启状态(Open) : 当下游服务宕机时, 熔断器所处的状态, 后续对该服务的调用将不再经过网络, 直接执行本地 fallback 逻辑。
    • 半熔断状态(Half-Open) : 当下游服务宕机一段时间后, 熔断器所处的状态, 尝试恢复对该服务的调用, 允许有限的流量调用该服务, 并监控调用成功率。此时:
      • 若成功率达到预期, 则说明下游服务已恢复, 熔断器进入熔断关闭状态(Closed)
      • 若成功率达不到预期, 则说明下游服务仍处于宕机状态, 熔断器重新进入熔断开启状态(Open)
  • 降级 : 当整个微服务系统的负载超出了预设的上限阈值时, 为了保证重要或基本的服务能正常运行, 我们可以将一些不重要的服务暂停使用不紧急的任务延迟执行。最简单的例子, 当下游服务宕机时, 直接快速失败(fail-fast)执行 fallback 逻辑。

Hystrix 简介

HystrixNetflix 开源的一款分布式服务容错系统, 是一种客户端熔断断路器的解决方案。

Hystrix 设计目的是将应用中的远程系统访问、服务调用、第三方依赖包的调用入口, 通过资源控制的方式隔离开, 避免了在分布式系统中故障的级联塌方式传递, 提升本系统的弹性和健壮性。

Hystrix 通过添加延迟容忍容错逻辑, 可以实现当调用链路中某个服务出现故障时, 阻止级联故障, 以保证服务的稳定运行。

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

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

相关文章

MySQL count(1) , count(*), count(列名) 的异同

count 函数主要用于统计行数,我们一般会用 count(1) , count(*), count(列名) 来统计行数,但是这三者之间有什么差距呢? 异同 当 count(列名) 在列名不是主键列的情况下,将只统计该列的非空行数,效率也最低下;当 count(列名) 在列名为主键列,且在没有非聚集索引的情况下,三者…

时间复杂度到底怎么算

时间复杂度到底怎么算 算法(Algorithm)是指用来操作数据、解决程序问题的一组方法。对于同一个问题,使用不同的算法,也许最终得到的结果是一样的,但在过程中消耗的资源和时间却会有很大的区别。 那么我们应该如何去衡…

Java 异常种类及处理方法

概述 异常的基类是 Throwable, Throwable 有两个子类: Exception : 表示可以恢复的异常, 编译器可以捕捉。Error : 表示编译时和系统错误, 表示系统在运行期间出现了严重的错误, 属于不可恢复的错误。 受检异常和非受检异常 受检异常指的是在编译期间会接受编译器检查, 且必…

十分钟搞定时间复杂度(算法的时间复杂度)

十分钟搞定时间复杂度(算法的时间复杂度) 我们假设计算机运行一行基础代码需要执行一次运算。 int aFunc(void) {printf("Hello, World!\n"); // 需要执行 1 次return 0; // 需要执行 1 次 }那么上面这个方法需要执行 2 次运算 …

Java 父子类加载顺序

现在有一个Parent类和一个Son类, 代码分别如下: public class Parent {static {System.out.println(" order 0");}private static String s init();{System.out.println(" order 3");}public Parent() {System.out.println(" order 4");}publi…

java实现简单二叉树

二叉树基本知识: 一、树的定义 树是一种数据结构,它是由n(n>1)个有限结点组成一个具有层次关系的集合。 树具有的特点有: (1)每个结点有零个或多个子结点 (2)没有…

HashMap 学习笔记

1.HashMap 的类继承关系 图示即为 Map 相关类的继承关系。源码中的类签名如下: public class HashMap<K,V> extends AbstractMap<K,V>implements Map<K,V>, Cloneable, Serializable {...... }2.HashMap 的底层存储结构 HashMap 的底层存储结构是 Node 类,…

MySQL中清空表和截断表的区别(新手入门)

清空表和截断表 清空表&#xff1a;delete from users&#xff1b; 清空表只是清空表中的逻辑数据&#xff0c;但是物理数据不清除&#xff0c;如主键值、索引等不被清除&#xff0c;还是原来的值。 截断表&#xff1a;truncate table users&#xff1b; 截断表可以用于删除…

终止线程的方法

如何终止一个正在运行的线程&#xff1f; 设置状态位来终止一个正在运行的线程。可以自己实现, 也可以使用 interrupt 方法来设置这个状态位, 然后在代码中判断 isInterrupted 的返回结果来执行退出执行的逻辑。 了解 Thread 类中的 stop、interrupt 方法吗?为什么不用 stop…

十大经典排序算法动画与解析(配代码完全版)

排序算法是《数据结构与算法》中最基本的算法之一。 排序算法可以分为内部排序和外部排序。 内部排序是数据记录在内存中进行排序。 而外部排序是因排序的数据很大&#xff0c;一次不能容纳全部的排序记录&#xff0c;在排序过程中需要访问外存。 常见的内部排序算法有&…

服务启动不了,显示 config 异常的问题排查

文章目录问题详情排查过程1.1 查看配置文件是否可以正常加载1.2 进入 config 服务正在运行的容器, 查看文件是否存在1.3 查看容器运行日志:最后发现是配置文件中多了一个 TAB 符,唉,说多了都是泪!问题详情 出现异常报错: Could not locate PropertySource and the fail fast p…

java使用Socket类接收和发送数据

java使用Socket类接收和发送数据 网络应用分为客户端和服务端两部分&#xff0c;而Socket类是负责处理客户端通信的Java类。通过这个类可以连接到指定IP或域名的服务器上&#xff0c;并且可以和服务器互相发送和接受数据。在本文及后面的数篇文章中将详细讨论Socket类的使用&a…

Docker Swarm compose 文件 depends_on 属性

Swarm 部署时候如果需要管理应用之间的启动先后顺序,则可以使用 services.depends_on 属性进行指定,例如 services:eureka-service:......depends_on:- config-service......

Java 单例模式:懒加载(延迟加载)和即时加载

Java 单例模式&#xff1a;懒加载&#xff08;延迟加载&#xff09;和即时加载 引言 在开发中&#xff0c;如果某个实例的创建需要消耗很多系统资源&#xff0c;那么我们通常会使用惰性加载机制&#xff08;或懒加载、延时加载&#xff09;&#xff0c;也就是说只有当使用到这…

递推算法之滚动数组思维方式

概述 在算法的最终结果只用到本层与上一层的结果时&#xff0c; 可以使用滚动数组思想。 简单的理解就是每次都使用固定的几个存储空间达到压缩节省存储空间的作用&#xff0c; 主要用在递推算法中。示例1&#xff1a; 爬楼梯问题 假设你正在爬楼梯。需要 n 阶你才能到达楼顶…

Java创建并执行线程的四种方法

Java创建并执行线程的四种方法 java里面创建线程有四种方式&#xff1a; 无返回&#xff1a; 实现Runnable接口&#xff0c;重写run();继承Thread类&#xff0c;重写run(); 有返回&#xff1a;实现Callable接口&#xff0c;重写call(),利用FutureTask包装Callable&#xff0c…

idea中svn的更新、检出、提交操作

一、首先集成svn到idea 点击号连接svn仓库地址 等待代码下载完毕后就可以对代码进行update,commit操作了 更新操作方法一:项目上右键 方法二:点击快捷图标 方法三: 代码提交 方法一 方法二: 方法三: 会跳出窗口: 然后点击Commit 如果检测代码有错误会询问你是否要处理,一般确定…

判断链表是否相交并找出交点

问题概述 单链表定义如下&#xff1a; public class ListNode {int val;ListNode next;ListNode(int x) {val x;next null;}}编写程序&#xff0c; 找出两个链表的交点。 如图所示&#xff0c;链表 A 和链表 B 在节点 8 处相交。 算法思路 首先确定一个事情&#xff1a; …

socket和http区别有哪些

socket和http区别有哪些 1、socket连接就是所谓的长连接&#xff0c;理论上客户端和服务器端一旦建立起连接将不会主动断掉&#xff1b; 2、http连接就是所谓的短连接&#xff0c;即客户端向服务器端发送一次请求&#xff0c;服务器端响应后连接即会断掉。 socket和http区别&…

Spring Bean 的生命周期

概述 Spring 启动&#xff0c;扫描指定的包路径&#xff0c;查找需要被 Spring 管理的 bean构造 BeanDefinition 对象实例化 bean&#xff0c;如果有多个构造方法&#xff0c;则需要推断构造方法&#xff0c;确定好构造方法后&#xff0c;进行实例化得到一个对象进行 bean 的属…