一、问题产生

雪崩效应:是一种因服务提供者的不可用导致服务调用者的不可用,并将不可用逐渐放大的过程

正常情况下的服务:

某一服务出现异常,拖垮整个服务链路,消耗整个线程队列,造成服务不可用,资源耗尽:

形成过程:

1)服务提供者不可用

a)硬件故障:硬件损坏造成的服务器主机宕机, 网络硬件故障造成的服务提供者的不可访问

b)程序Bug:

c)   缓存击穿:缓存击穿一般发生在缓存应用重启, 所有缓存被清空时,以及短时间内大量缓存失效时. 大量的缓存不命中, 使请求直击后端,造成服务提供者超负荷运行,引起服务不可用

d)用户大量请求:在秒杀和大促开始前,如果准备不充分,用户发起大量请求也会造成服务提供者的不可用

2)重试加大流量

a)用户重试:在服务提供者不可用后, 用户由于忍受不了界面上长时间的等待,而不断刷新页面甚至提交表单

b)代码逻辑重试: 服务调用端的会存在大量服务异常后的重试逻辑

3)服务调用者不可用

a)同步等待造成的资源耗尽:当服务调用者使用同步调用 时, 会产生大量的等待线程占用系统资源. 一旦线程资源被耗尽,服务调用者提供的服务也将处于不可用状态, 于是服务雪崩效应产生了。

二、概念

服务熔断:

一般是指软件系统中,由于某些原因使得服务出现了过载现象,为防止造成整个系统故障,从而采用的一种保护措施,所以很多地方把熔断亦称为过载保护。很多时候刚开始可能只是系统出现了局部的、小规模的故障,然而由于种种原因,故障影响的范围越来越大,最终导致了全局性的后果。

适用场景:防止应用程序直接调用那些很可能会调用失败的远程服务或共享资源

服务降级:

当服务器压力剧增的情况下,根据当前业务情况及流量对一些服务和页面有策略的降级,以此释放服务器资源以保证核心任务的正常运行。

三、工作原理

Hystrix 是一个帮助解决分布式系统交互时超时处理和容错的类库, 它同样拥有保护系统的能力。Netflix的众多开源项目之一。

1. 隔离:

Hystrix隔离方式采用线程/信号的方式,通过隔离限制依赖的并发量和阻塞扩散

1)线程隔离

Hystrix在用户请求和服务之间加入了线程池。

Hystrix为每个依赖调用分配一个小的线程池,如果线程池已满调用将被立即拒绝,默认不采用排队.加速失败判定时间。线程数是可以被设定的。

原理:用户的请求将不再直接访问服务,而是通过线程池中的空闲线程来访问服务,如果线程池已满,则会进行降级处理,用户的请求不会被阻塞,至少可以看到一个执行结果(例如返回友好的提示信息),而不是无休止的等待或者看到系统崩溃。

隔离前:

隔离后:

b)信号隔离:

信号隔离也可以用于限制并发访问,防止阻塞扩散, 与线程隔离最大不同在于执行依赖代码的线程依然是请求线程(该线程需要通过信号申请, 如果客户端是可信的且可以快速返回,可以使用信号隔离替换线程隔离,降低开销。信号量的大小可以动态调整, 线程池大小不可以。(参考文章2)

2. 熔断:

如果某个目标服务调用慢或者有大量超时,此时,熔断该服务的调用,对于后续调用请求,不在继续调用目标服务,直接返回,快速释放资源。如果目标服务情况好转则恢复调用。

熔断器:Circuit Breaker

熔断器是位于线程池之前的组件。用户请求某一服务之后,Hystrix会先经过熔断器,此时如果熔断器的状态是打开(跳起),则说明已经熔断,这时将直接进行降级处理,不会继续将请求发到线程池。熔断器相当于在线程池之前的一层屏障。每个熔断器默认维护10个bucket ,每秒创建一个bucket ,每个blucket记录成功,失败,超时,拒绝的次数。当有新的bucket被创建时,最旧的bucket会被抛弃。

熔断器的状态机:

Closed:熔断器关闭状态,调用失败次数积累,到了阈值(或一定比例)则启动熔断机制;

Open:熔断器打开状态,此时对下游的调用都内部直接返回错误,不走网络,但设计了一个时钟选项,默认的时钟达到了一定时间(这个时间一般设置成平均故障处理时间,也就是MTTR),到了这个时间,进入半熔断状态;

Half-Open:半熔断状态,允许定量的服务请求,如果调用都成功(或一定比例)则认为恢复了,关闭熔断器,否则认为还没好,又回到熔断器打开状态;

四、流程

同步执行:即一旦开始执行该命令,当前线程就得阻塞着直到该命令返回结果,然后才能继续执行下面的逻辑

异步执行:命令开始执行会返回一个Future的对象,不阻塞后面的逻辑,开发者自己根据需要去获取结果。

响应式执行:命令开始执行会返回一个Observable 对象,开发者可以给给Obeservable对象注册上Observer或者Action1对象,响应式地处理命令执行过程中的不同阶段。当调用HystrixCommand的observe()方法,或使用Observable的工厂方法(just(),from())即为响应式执行,这个功能的实现是基于Netflix的另一个开源项目RxJava(https://github.com/Netflix/RxJava)来的,更细节的用法可以参考:https://github.com/Netflix/Hystrix/wiki/How-To-Use#wiki-Reactive-Execution。

六、代码实现

jar包:

hystrix包

设置参数展开原码

参数作用备注

circuitBreaker.errorThresholdPercentage

失败率达到多少百分比后熔断

默认值:50

主要根据依赖重要性进行调整

circuitBreaker.forceClosed

是否强制关闭熔断

如果是强依赖,应该设置为true

circuitBreaker.requestVolumeThreshold

熔断触发的最小个数/10s

默认值:20

circuitBreaker.sleepWindowInMilliseconds

熔断多少秒后去尝试请求

默认值:5000

commandKey

默认值:当前执行方法名

coreSize

线程池coreSize

默认值:10

execution.isolation.semaphore.maxConcurrentRequests

信号量最大并发度

SEMAPHORE模式有效,默认值:10

execution.isolation.strategy

隔离策略,有THREAD和SEMAPHORE

默认使用THREAD模式,以下几种可以使用SEMAPHORE模式:

只想控制并发度

外部的方法已经做了线程隔离

调用的是本地方法或者可靠度非常高、耗时特别小的方法(如medis)

execution.isolation.thread.interruptOnTimeout

是否打开超时线程中断

THREAD模式有效

execution.isolation.thread.timeoutInMilliseconds

超时时间

默认值:1000

在THREAD模式下,达到超时时间,可以中断

在SEMAPHORE模式下,会等待执行完成后,再去判断是否超时

execution.timeout.enabled

是否打开超时

fallback.isolation.semaphore.maxConcurrentRequests

fallback最大并发度

默认值:10

groupKey

表示所属的group,一个group共用线程池

默认值:getClass().getSimpleName();

maxQueueSize

请求等待队列

默认值:-1

如果使用正数,队列将从SynchronizeQueue改为LinkedBlockingQueue

hystrix.command.default.metrics.rollingStats.timeInMilliseconds

设置统计的时间窗口值的,毫秒值

circuit break 的打开会根据1个rolling window的统计来计算。若rolling window被设为10000毫秒,则rolling window会被分成n个buckets,每个bucket包含success,failure,timeout,rejection的次数的统计信息。默认10000

hystrix.command.default.metrics.rollingStats.numBuckets

设置一个rolling window被划分的数量

hystrix.command.default.metrics.healthSnapshot.intervalInMilliseconds

记录health 快照(用来统计成功和错误绿)的间隔,默认500ms

展开原码

监控service展开原码

同步执行展开原码

异步执行展开原码

七、参考文章

mysql熔断机制_熔断机制hystrix相关推荐

  1. java plug机制_插件机制 - OpooPress - 基于 Java 的静态博客生成器

    插件机制 通过插件机制可以很容易的扩展 OpooPress 博客系统的功能. Plugin 定义如下 public interface Plugin{ /** * * @param registry ...

  2. java 熔断机制_熔断机制及容错框架(Hystrix)的简单使用

    说道熔断大家肯定会想到最近美股连续的几次熔断,那么在系统中的熔断又是指什么呢? 熔断是一种系统保护机制.美股熔断是对股市极端情况下的一种保护.举个生活中的例子,比如保险器,当电流过大时保险器里面的保险 ...

  3. mysql 副本 同步_副本机制与副本同步

    · 1.管理其他副本的节点称为Follower.每当Leader将新数据写入本地存储d的副本时,也会将数据更改写入日志之中.每个Follower会从Leader那里获取修改日志,并相应地更新数据到的本 ...

  4. atomic原子类实现机制_反射机制实现两个类的复制

    废话不多说 简单的实现 直接上代码 我怕话多审核不过 实现的类 public class Copy {@SneakyThrowspublic static void objectClone(Objec ...

  5. 建立完善的员工晋升机制_完善机制,打造晋升方案

    怎么样设计合理科学的晋升.薪酬和绩效激励机制,满足不同层次的员工需求?如果你现在正在做这方面的工作,可以看看下面的这些建议. 1.操作员工:今天我能赚到多少钱?(计件与产值分配) 2.技术员工:我的创 ...

  6. java中的熔断机制_SpringCloud- 第八篇 Hystrix熔断机制(五)

    1:雪崩效应概述 多个微服务之间调用的时候,假设微服务A调用微服务B和微服务C,微服务B和微服务C又调用其它的微服务,这就是所谓的"扇出".如果扇出的链路上某个微服务的调用响应时间 ...

  7. 熔断机制什么意思_熔断机制是什么意思(图文)

    熔断机制,是指对某一合约在达到涨跌停板之前,设置一个熔断价格,使合约买卖报价在一段时间内只能在这一价格范围内交易的机制. 熔断分为两种,第一种是当价格触及熔断点后,在随后一段时间内停止交易即熔而断.第 ...

  8. SpringCloud微服务的熔断机制和熔断的意义?

    什么是微服务的熔断机制 在2017年2月1日,GitLab公司的运维人员就出现过这样的事故.当时运维人员在进行数据库维护时,通过执行rm -rf命令,删除了约300GB生产环境数据.由于数据备份失效, ...

  9. 2008 mysql 本地安全_如何在Linux系统中建立mysql的本地安全机制?

    如何在Linux系统中对MySQL进行本地的安全机制?今天我们将给大家介绍下具体的操作方法. local-infile=0#关闭远程连接,即3306端口.这是LinuxMySQL的默认监听端口.由于此 ...

最新文章

  1. Mac系统Git生成ssh公钥
  2. C#中常用的经典文件操作方法
  3. FPGA作为从机与STM32进行SPI协议通信---Verilog实现
  4. 防止网站内容被人小偷和采集的ASP代码
  5. c语言回调函数_C语言学习第26篇---函数与指针分析 回调函数
  6. DBUtils连接池,websocket
  7. 每日程序C语言29-将数组逆序输出
  8. DE1-LINUX运行
  9. php7 对象转数组,php7中为对象/关联数组进行解构赋值
  10. 社交系统ThinkSNS-plus(TS+)V1.0发布!
  11. MNIST竞赛准确度99+%技术详解,文末有福利~
  12. windows安装fdfs_lient报错fdfs_client/sendfilemodule: fatal error C1189: #error: platfom not supported
  13. 【Unity】天气特效:打雷下雨
  14. 换个角度感受华为云的GPU云服务器
  15. js实现音乐列表循环播放或单曲循环
  16. Android 在build.gradle文件中读取json文件
  17. 直播系统开发之ios对接腾讯云直播sdk
  18. ppt拼图 批量生成 N多ppt一键生成拼图
  19. Android 自带工具生成图标
  20. vue实现仿阿里云官网的ace-view-fullColumn模块

热门文章

  1. inflater.inflate 三个方法区别
  2. 2016网易安卓实习生offer经验
  3. 智慧社区----互联网时代的未来家园(读书笔记)
  4. 大学生压力主要来源于社会就业(转)
  5. 海明校验码c语言源代码,校验码辅导之海明校验
  6. PDF转换软件有哪些?分享免费好用的PDF转换工具!
  7. 新零售系统软件怎么开发?数字化新零售系统有什么优势?
  8. windows10用u盘安装LINUX,Windows 10下U盘安装 Ubuntu 17.10
  9. Python学习笔记之威虎山武器库
  10. GitLab搭建与使用简介