目录

前言:

服务雪崩定义:

雪崩应对策略:

使用Hystrix解决雪崩:

特色:

设计原则

Hystrix的内部处理逻辑


前言:

分布式系统中经常会出现某个基础服务不可用造成整个系统不可用的情况, 这种现象被称为服务雪崩效应. 为了应对服务雪崩, 一种常见的做法是手动服务降级. 而Hystrix的出现,给我们提供了另一种选择.

服务雪崩定义:

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

上图中, A为服务提供者, B为A的服务调用者, C和D是B的服务调用者. 当A的不可用,引起B的不可用,并将不可用逐渐放大C和D时, 服务雪崩就形成了.

服务雪崩形成的原因:

按照雪崩参与者可以分为调用者和提供者,并可以把造成雪崩分为下面三个阶段来分析原因:

  • 服务提供者不可用
  • 服务调用者不可用
  • 重试增大流量

服务雪崩的每个阶段都可能由不同的原因造成, 比如造成 服务不可用 的原因有:

  • 硬件故障

  • 程序Bug

  • 缓存击穿

  • 用户大量请求

硬件故障可能为硬件损坏造成的服务器主机宕机, 网络硬件故障造成的服务提供者的不可访问.
缓存击穿一般发生在缓存应用重启, 所有缓存被清空时,以及短时间内大量缓存失效时. 大量的缓存不命中, 使请求直击后端,造成服务提供者超负荷运行,引起服务不可用.
在秒杀和大促开始前,如果准备不充分,用户发起大量请求也会造成服务提供者的不可用.

而形成 重试加大流量 的原因有:

  • 用户重试

  • 代码逻辑重试

在服务提供者不可用后, 用户由于忍受不了界面上长时间的等待,而不断刷新页面甚至提交表单.
服务调用端的会存在大量服务异常后的重试逻辑.
这些重试都会进一步加大请求流量.

最后, 服务调用者不可用 产生的主要原因是:

  • 同步等待造成的资源耗尽

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

雪崩应对策略:

针对造成服务雪崩的不同原因, 可以使用不同的应对策略:

  1. 流量控制

  2. 改进缓存模式

  3. 服务自动扩容

  4. 服务调用者降级服务

流量控制 的具体措施包括:

  • 网关限流

  • 用户交互限流

  • 关闭重试

改进缓存模式:

  • 缓存预加载
  • 同步改异步

自动扩容:

  • 增加机器数量
  • 升级硬件配置

使用Hystrix解决雪崩:

特色:

Hystrix是一个低延迟和容错的第三方组件库。旨在隔离远程系统、服务和第三方库的访问点。官网上已经停止维护并推荐使用resilience4j:https://github.com/resilience4j/resilience4j。 但是国内的话我们有springcloud alibaba。

Hystrix 通过隔离服务之间的访问来实现分布式系统中延迟及容错机制来解决服务雪崩场景并且基于hystrix可以提供备选方案(fallback)。

  • 对网络延迟及故障进行容错

  • 阻断分布式系统雪崩

  • 快速失败并平缓恢复

  • 服务降级

  • 实时监控、警报

设计原则

  1. 资源隔离
  2. 熔断器
  3. 命令模式

资源隔离:

这种资源隔离减少风险的方式被称为:Bulkheads(舱壁隔离模式).Hystrix将同样的模式运用到了服务调用者上.

比如调用三个依赖服务会共享商品详情服务的线程池. 如果其中的商品评论服务不可用, 就会出现线程池里所有线程都因等待响应而被阻塞, 从而造成服务雪崩. 如图所示:

Hystrix通过将每个依赖服务分配独立的线程池进行资源隔离, 从而避免服务雪崩.
如下图所示, 当商品评论服务不可用时, 即使商品服务独立分配的20个线程全部处于同步等待状态,也不会影响其他依赖服务的调用.

熔断器模式:

熔断器模式定义了熔断器开关相互转换的逻辑:

服务的健康状况 = 请求失败数 / 请求总数.
熔断器开关由关闭到打开的状态转换是通过当前服务健康状况和设定阈值比较决定的.

  1. 当熔断器开关关闭时, 请求被允许通过熔断器. 如果当前健康状况高于设定阈值, 开关继续保持关闭. 如果当前健康状况低于设定阈值, 开关则切换为打开状态.

  2. 当熔断器开关打开时, 请求被禁止通过.

  3. 当熔断器开关处于打开状态, 经过一段时间后, 熔断器会自动进入半开状态, 这时熔断器只允许一个请求通过. 当该请求调用成功时, 熔断器恢复到关闭状态. 若该请求失败, 熔断器继续保持打开状态, 接下来的请求被禁止通过.

熔断器的开关能保证服务调用者在调用异常服务时, 快速返回结果, 避免大量的同步等待. 并且熔断器能在一段时间后继续侦测请求执行结果, 提供恢复服务调用的可能.

 命令模式:

Hystrix使用命令模式(继承HystrixCommand类)来包裹具体的服务调用逻辑(run方法), 并在命令模式中添加了服务调用失败后的降级逻辑(getFallback).
同时我们在Command的构造方法中可以定义当前服务线程池和熔断器的相关参数. 如下代码所示:

public class Service1HystrixCommand extends HystrixCommand<Response> {private Service1 service;private Request request;public Service1HystrixCommand(Service1 service, Request request){supper(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("ServiceGroup")).andCommandKey(HystrixCommandKey.Factory.asKey("servcie1query")).andThreadPoolKey(HystrixThreadPoolKey.Factory.asKey("service1ThreadPool")).andThreadPoolPropertiesDefaults(HystrixThreadPoolProperties.Setter().withCoreSize(20))//服务线程池数量.andCommandPropertiesDefaults(HystrixCommandProperties.Setter().withCircuitBreakerErrorThresholdPercentage(60)//熔断器关闭到打开阈值.withCircuitBreakerSleepWindowInMilliseconds(3000)//熔断器打开到关闭的时间窗长度))this.service = service;this.request = request;);}@Overrideprotected Response run(){return service1.call(request);}@Overrideprotected Response getFallback(){return Response.dummy();}
}

在使用了Command模式构建了服务对象之后, 服务便拥有了熔断器和线程池的功能.

Hystrix的内部处理逻辑

下图为Hystrix服务调用的内部逻辑:

  1. 构建Hystrix的Command对象, 调用执行方法.

  2. Hystrix检查当前服务的熔断器开关是否开启, 若开启, 则执行降级服务getFallback方法.

  3. 若熔断器开关关闭, 则Hystrix检查当前服务的线程池是否能接收新的请求, 若超过线程池已满, 则执行降级服务getFallback方法.

  4. 若线程池接受请求, 则Hystrix开始执行服务调用具体逻辑run方法.

  5. 若服务执行失败, 则执行降级服务getFallback方法, 并将执行结果上报Metrics更新服务健康状况.

  6. 若服务执行超时, 则执行降级服务getFallback方法, 并将执行结果上报Metrics更新服务健康状况.

  7. 若服务执行成功, 返回正常结果.

  8. 若服务降级方法getFallback执行成功, 则返回降级结果.

  9. 若服务降级方法getFallback执行失败, 则抛出异常.

Hystrix原理讲解相关推荐

  1. php 伪静态 page-18.html,PHP 伪静态实现技术原理讲解

    PHP 伪静态实现技术原理讲解 发布于 2015-01-18 23:52:58 | 129 次阅读 | 评论: 0 | 来源: 网友投递 PHP开源脚本语言PHP(外文名: Hypertext Pre ...

  2. nginx反向代理原理讲解

    一 .概述                  反向代理(Reverse Proxy)方式是指以代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络上的服务器:并将从服务器上得到的结果 ...

  3. 微信小游戏开发教程-2D游戏原理讲解

    微信小游戏开发教程-2D游戏原理讲解 原理 为了更加形象的描述,这里先上一张图: 背景 a. 首先,我们看到背景好像是一张无限长的图片在向下移动.实际则不然,这是一张顶部和底部刚好重叠的图片.这是一种 ...

  4. 解密汽车全景行车安全系统的前世和今生——第二讲:原理讲解

    解密汽车全景行车安全系统的前世和今生--第二讲:原理讲解 来源:深圳市汽车电子行业协会 作者:姜卫忠 发布时间:2013-3-7  浏览(4648)次 解密汽车全景行车安全系统的前世和今生 第二讲:全 ...

  5. Spring cloud——Hystrix 原理解析

    1.背景 分布式系统环境下,服务间类似依赖非常常见,一个业务调用通常依赖多个基础服务.如下图,对于同步调用,当库存服务不可用时,商品服务请求线程被阻塞,当有大批量请求调用库存服务时,最终可能导致整个商 ...

  6. pureMVC简单示例及其原理讲解四(Controller层)

    本节将讲述pureMVC示例中的Controller层. Controller层有以下文件组成: AddUserCommand.as DeleteUserCommand.as ModelPrepCom ...

  7. IoT物联网嵌入式设备中30种常见传感器模块简介及原理讲解

    IoT物联网嵌入式设备中30种常见传感器模块简介及原理讲解 0.前言 一.光学传感器模块: 1. 光敏传感器模块: 2. 红外避障模块 3. 循迹传感器模块 4. U型光电传感器模块 5. 红外接收模 ...

  8. 艺点动画-跟随原理讲解

    艺点动画-跟随原理讲解 如果要想顺便解决就业问题的话,可以去试试看成都艺点动画,这家教学质量, 蛮高的毕业后是可以直接在公司里面上班的 方法/步骤 1.什么是动画里的跟随? 动画的跟随指的是:物体在运 ...

  9. 酷狗音乐的爬取,基于python,从无到有完整教程-上:搭建环境及爬取原理讲解

    酷狗音乐的爬取,基于python,从无到有完整教程,使用微软新edge作为虚拟浏览器 搭建环境及爬取原理讲解 ⬇⬇⬇ 编码环境及工具准备: 编码工具:PyCharm 所需的库: import requ ...

最新文章

  1. 第二大数 滑动窗口 第九届“图灵杯”NEUQ-ACM程序设计竞赛个人赛
  2. 深入理解TCP/IP协议-TCP建立与终止连接
  3. 如何测试判断云服务器的稳定性?
  4. 博客访问量,有没有可能是系统所为?
  5. 微信8.0自动发送炸弹python脚本
  6. 一天搞懂深度学习(李宏毅)-学习笔记
  7. win7字体安装_PR CC 下载和安装教程
  8. php 使用gd库,PHP的gd库使用基础教程
  9. html图片闪现循环效果,CSS实现图片无缝无限循环展示效果
  10. Oracle实验三 基于大数据集的数据库操作
  11. MySQL 排序规则
  12. springboot教学工作量管理毕业设计-附源码221541
  13. [翻译]CryEngine3中ClothShader详解
  14. SteamVR Unity工具包(VRTK)之概览和控制器事件
  15. 5T的资源大礼包整合,总有你想要的!
  16. 完数:求1000以内所有完数
  17. python怎么变成竖行,python更改文字为竖排
  18. oracle add_months()函数
  19. 微信接口验证类php,微信公众平台消息接口校验与消息接口响应实例
  20. 日语标点符号用法解说!

热门文章

  1. JS数据结构初识(一)-栈
  2. 使用recyclerView实现无限循环banner效果
  3. JDK 9 中有哪些 jmod 文件?
  4. loadrunner-3-1创建测试场景
  5. Mac OS X上安装配置apache服务器
  6. Mysql ERROR 2002 (HY000) Can't connect to local MySQL server through socket
  7. ActiveMQ学习总结(5)——Java消息服务JMS详解
  8. 电商、快递最后一公里的解决方案
  9. PHP导出excel
  10. jqGrid数据增删查改