微服务雪崩效应与 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,一经查实,立即删除!

相关文章

时间复杂度到底怎么算

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

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

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

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 类,…

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

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

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; …

兄弟3150cdn更换硒鼓_耗材知多点:一体式硒鼓及分离式硒鼓

相信第一次接触硒鼓的小伙伴们&#xff0c;会比较诧异为什么有些硒鼓可以直接装机使用&#xff0c;而有些硒鼓&#xff0c;却需要两个部件组合起来或分别装机才能正常使用。今天就带大家来了解一下什么是一体式硒鼓&#xff0c;什么又是分离式硒鼓。①一体式硒鼓&#xff1a;以…

Java IO流之PrintStream分析

简介 PrintStream继承了FilterOutputStream.是"装饰类"的一种,所以属于字节流体系中(与PrintStream相似的流PrintWriter继承于Writer,属于字符流体系中),为其他的输出流添加功能.使它们能够方便打印各种数据值的表示形式.此外,值得注意的是: 与其他流不同的是,Prin…

bs4爬取的时候有两个标签相同_10分钟用Python爬取最近很火的复联4影评

《复仇者联盟4&#xff1a;终局之战》已经上映快三个星期了&#xff0c;全球票房破24亿美元&#xff0c;国内票房破40亿人民币。虽然现在热度逐渐下降&#xff0c;但是我们还是恬不知耻地来蹭一蹭热度。上映伊始《复联4》的豆瓣评分曾破了9分。后来持续走低&#xff0c;现在《复…

RabbitMQ 基本概念与高级特性

文章目录1. 什么是消息队列1.1 消息队列概述1.2 使用消息队列的优势1.3 使用消息队列的劣势1.4 常见的消息队列产品对比2. RabbitMQ 基本概念2.1 RabbitMQ 概述2.2 RabbitMQ 的概念模型2.2.1 Message2.2.2 Publisher2.2.3 Exchange2.2.4 Binding2.2.5 Queue2.2.6 Connection2.2…

HTTP 和 SOCKET 的区别

HTTP 和 SOCKET 的区别 要弄明白 http 和 socket 首先要熟悉网络七层&#xff1a;物 数 网 传 会 表 应&#xff0c;如图1 如图1 HTTP 协议:超文本传输协议&#xff0c;对应于应用层&#xff0c;用于如何封装数据. TCP/UDP 协议:传输控制协议&#xff0c;对应于传输层&…

java 8进制串转中文_为什么不能用中文进行编程?而英文就可以

前些天大雄无意间听见几个线下班小伙伴说真的是无(te)意(di)的“我要补英文”“对&#xff0c;英文真的很重要”“如果编码用中文就好了”...听见这大雄就不淡定了中文代码小伙伴确定能够搞懂&#xff1f;&#xff1f;首先我们大概的看一下中文编码&#xff1a;你以为会写中文写…

MATLAB学习笔记(一)求解三阶微分方程

一、求解三阶微分方程 对于多变量三阶微分方程求解问题&#xff0c;这里介绍一种求解方法。 例题如下&#xff1a; 对于以上方程&#xff0c;给定边界条件&#xff0c;&#xff0c;&#xff0c;&#xff0c;&#xff0c;。求解和的表达式。 二、解题步骤 &#xff08;1&…

axure 内部框架内容下滑_Axure教程:转盘抽奖交互原型

本文跟大家分享&#xff0c;如何使用axure制作转盘抽奖交互原型&#xff0c;不带登录流程。效果如下&#xff1a;抽奖流程一、主要内容(1)主要元件&#xff1a;动态面板(2)重点&#xff1a;旋转交互、随机函数、触发动作。(3)难点&#xff1a;通过停止位置判断抽奖结果(4)涉及函…

日志打印的8种级别(很详细)

日志打印的8种级别&#xff08;很详细&#xff09; 日志的输出都是分级别的&#xff0c;不同的设置不同的场合打印不同的日志。下面拿最普遍用的Log4j日志框架来做个日志级别的说明&#xff0c;其他大同小异。 Log4j的级别类org.apache.log4j.Level里面定义了日志级别&#x…

identity_insert 如何改为on_十分钟教你如何快速提高Laya构建速度,还不快来康康?...

前言如何快速提高Laya构建速度 微信小游戏推出之后&#xff0c;很多公司也相应的进入到微信小游戏这个领域&#xff0c;现在市场上的游戏开发引擎&#xff0c;如Cocos、Egret、Laya都对小游戏有了很好的兼容性。而在实际开发中&#xff0c;如何提高Laya的构建速度&#xff0c;是…

二下语文书电子课本_小学生语文成绩好,不是靠补课,把课本吃透,才是高效学习方法...

关注语文教学发展&#xff0c;解决语文学习困惑。对于基础差、语文学习能力差的同学&#xff0c;我不建议去补课。但是家长说&#xff0c;不补课怎么办呢&#xff1f;我们也没有时间和耐心去给孩子辅导&#xff0c;又怕讲错了&#xff0c;还是让老师讲好。尽管家长们有这个意识…

Java面试——MyBatis系列总结

文章目录&#xff1a; 1.MyBatis是什么&#xff1f; 2.JDBC编程有哪些缺陷&#xff1f;MyBatis又是如何改进的&#xff1f; 3.MyBatis与Hibernate的区别在哪&#xff1f; 4.MyBatis的优缺点 5.请说说MyBatis的工作原理 6.MyBatis的架构设计是怎样的&#xff1f; 7.#{}和…