服务雪崩效应

基础服务的故障导致级联故障,进而造成了整个分布式系统的不可用,这种现象被称为服务雪崩效应。服务雪崩效应描述的是一种因服务提供者的不可用导致服务消费者的不可用,并将不可用逐渐放大的过程。

服务雪崩效应形成的原因

  1. 服务提供者不可用

    • 硬件故障
    • 程序Bug
    • 缓存击穿
    • 用户大量请求
  2. 重试加大流量
    • 用户重试
    • 代码逻辑重试
  3. 服务调用者不可用
    • 同步等待造成的资源耗尽

服务雪崩的应对策略

  1. 流量控制

    • 网关限流
    • 用户交互限流
    • 关闭重试
  2. 改进缓存模式
    • 缓存预加载
    • 同步改为异步刷新
  3. 服务自动扩容
    • AWS的auto scaling
  4. 服务调用者降级服务
    • 资源隔离
    • 对依赖服务进行分类
    • 不可用服务的调用快速失败

打铁还需自身硬,本篇文章不展开论述各种应对策略,主要探讨微服务自身如何来保护自己,避免奔溃?即微服务如何进行容错设计?

容量设计在生活中经常见到,每家每户都有保险丝,用电超负荷了,就会跳闸。微服务的容错组件Hystrix就吸收了这些思想。

Hystrix

Hystrix [hɪst'rɪks]的中文含义是豪猪科动物,如下图所示, 因其背上长满了刺,而拥有自我保护能力.

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

Hystrix如何保护我们的应用?

How Does Hystrix Accomplish Its Goals?

  1. Wrapping all calls to external systems (or “dependencies”) in a HystrixCommand or HystrixObservableCommand object which typically executes within a separate thread (this is an example of the command pattern).(通过HystrixCommand封装外部系统的所有调用,它会在独立的线程中执行)即命令模式。
  2. Timing-out calls that take longer than thresholds you define. There is a default, but for most dependencies you custom-set these timeouts by means of “properties” so that they are slightly higher than the measured 99.5th percentile performance for each dependency.(简单说:修改超时时间的阈值,提高依赖的性能)
  3. Maintaining a small thread-pool (or semaphore) for each dependency; if it becomes full, requests destined for that dependency will be immediately rejected instead of queued up.(每个依赖维护一个小的线程池或者信号量,如果满了,请求调用依赖会被快速聚集而不是排队等待。)即资源隔离
  4. Measuring successes, failures (exceptions thrown by client), timeouts, and thread rejections.(测量成功率,失败率、超时次数、线程拒绝率)即服务监控的指标
  5. Tripping a circuit-breaker to stop all requests to a particular service for a period of time, either manually or automatically if the error percentage for the service passes a threshold.(当服务的错误率超过阈值时,通过手动或者自动的方式,对一定时间内特定的服务,采用链路中断器拒绝所有请求,)即熔断器、熔断机制
  6. Performing fallback logic when a request fails, is rejected, times-out, or short-circuits.(在请求失败、拒绝、超时、短路时执行回退逻辑)即请求回退
  7. Monitoring metrics and configuration changes in near real-time.(近实时监控指标和修改配置。)

下面主要展开讲述资源隔离、服务降级、服务熔断、请求合并以及服务监控等功能特性

资源隔离

资源隔离--设计思想来源

货船为了进行防止漏水和火灾等风险的扩散,会将货仓分隔为多个隔离区域,这种资源隔离减少风险的方式被称为:Bulkheads(舱壁隔离模式).

官网关于资源隔离的举例如下:

两种资源隔离模式

(1)线程池隔离模式:使用一个线程池来存储当前的请求,线程池对请求作处理,设置任务返回处理超时时间,堆积的请求堆积入线程池队列。这种方式需要为每个依赖的服务申请线程池,有一定的资源消耗,好处是可以应对突发流量(流量洪峰来临时,处理不完可将数据存储到线程池队里慢慢处理)

(2)信号量隔离模式:使用一个原子计数器(或信号量)来记录当前有多少个线程在运行,请求来先判断计数器的数值,若超过设置的最大线程个数则丢弃改类型的新请求,若不超过则执行计数操作请求来计数器+1,请求返回计数器-1。这种方式是严格的控制线程且立即返回模式,无法应对突发流量(流量洪峰来临时,处理的线程超过数量,其他的请求会直接返回,不继续去请求依赖的服务)

官网对比线程池与信号量

什么时候用线程池 or 信号量?

默认使用线程池

如果不涉及远程RPC调用(没有网络开销),比如访问内存缓存,则使用信号量来隔离,更为轻量,开销更小。

The Netflix API processes 10+ billion Hystrix Command executions per day using thread isolation. Each API instance has 40+ thread-pools with 5–20 threads in each (most are set to 10).

Netflix API每天使用线程隔离处理10亿次Hystrix Command执行。 每个API实例都有40多个线程池,每个线程池中有5-20个线程(大多数设置为10个)

@HystrixCommand(fallbackMethod = "stubMyService",
commandProperties = {
@HystrixProperty(name="execution.isolation.strategy", value="SEMAPHORE")
}
)

线程池核心配置:

服务降级、回退

降级就是当依赖的服务产生故障时,把产生故障的丢了,换一个轻量级的方案(比如返回一个固定值),是一种退而求其次的方法。比如微信刚上线红包功能时,过年那天大家都在发红包,很多人都会看到微信会弹出一个相同的页面,这个就是服务降级的使用,当服务不可用时,返回一个静态值(页面)。

Hystrix 6种降级回退模式:

  1. Fail Fast 快速失败
  2. Fail Silent 无声失败

  3. Fallback: Static 返回默认值
  4. Fallback: Stubbed 自己组装一个值返回
  5. Cache via Network

Sometimes if a back-end service fails, a stale version of data can be retrieved from a cache service such as memcached. 利用远程缓存

通过远程缓存的方式。在失败的情况下再发起一次remote请求,不过这次请求的是一个缓存比如redis。由于是又发起一起远程调用,所以会重新封装一次Command,这个时候要注意,执行fallback的线程一定要跟主线程区分开,也就是重新命名一个ThreadPoolKey。

  1. Primary + Secondary with Fallback 主次方式回退(主要和次要)

这个有点类似我们日常开发中需要上线一个新功能,但为了防止新功能上线失败可以回退到老的代码,我们会做一个开关比如(使用zookeeper)做一个配置开关,可以动态切换到老代码功能。那么Hystrix它是使用通过一个配置来在两个command中进行切换。

回退的处理方式也有不适合的场景:

以上几种情况如果失败,则程序就要将错误返回给调用者。

熔断器

熔断器就像家里的保险丝,当电流过载了就会跳闸,不过Hystrix的熔断机制相对复杂一些。



这两个图来自于两个博客,都是同一个意思。

服务的健康状况 = 请求失败数 / 请求总数.

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

  • 当熔断器开关关闭时, 请求被允许通过熔断器. 如果当前健康状况高于设定阈值, 开关继续保持关闭. 如果当前健康状况低于设定阈值, 开关则切换为打开状态.
  • 当熔断器开关打开时, 请求被禁止通过.
  • 当熔断器开关处于打开状态, 经过一段时间后, 熔断器会自动进入半开状态, 这时熔断器只允许一个请求通过. 当该请求调用成功时, 熔断器恢复到关闭状态. 若该请求失败, 熔断器继续保持打开状态, 接下来的请求被禁止通过.

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

熔断器工作流程图

熔断器核心配置:

Hystrix工作流程图

上图是官网原图,下图是中文版:

Hystrix sequence diagram

请求合并

服务监控

Hystrix还提供给我们一个监控功能Hystrix-dashboard,可以直接使用其开源项目进行配置,就能实时的观察我们的服务调用情况。

如果是集群,通过turbine进行监视。

监控如下:

Hystrix监控面板

Hystrix监控数据聚合

命令模式

Hystrix采用命令模式,将上述这些功能特性植入我们的业务代码,值得学习。

参考文献


tips:本文属于自己学习和实践过程的记录,很多图和文字都粘贴自网上文章,没有注明引用请包涵!如有任何问题请留言或邮件通知,我会及时回复。

springcloud实践(三)之断路器:Hystrix的更多相关文章

  1. SpringCloud学习系列之三----- 断路器(Hystrix)和断路器监控(Dashboard)

    前言 本篇主要介绍的是SpringCloud中的断路器(Hystrix)和断路器指标看板(Dashboard)的相关使用知识. SpringCloud Hystrix Hystrix 介绍 Netfl ...

  2. SpringCloud IDEA 教学 (四) 断路器(Hystrix)

    写在开始 在SpringCloud项目中,服务之间相互调用(RPC Remote Procedure Call —远程过程调用),处于调用链路底层的服务产生不可用情况时,请求会产生堆积使得服务器线程阻 ...

  3. .net framework 4.5 +steeltoe+ springcloud(三)实现Hystrix断路器

    在基于.net framework的服务客户端实现断路器功能,基本项目创建步骤可以参照我的另一篇发现和调用服务的笔记,地址:http://www.cnblogs.com/troytian/p/8621 ...

  4. springcloud 入门 6 (断路器hystrix)

    hystrix:断路器 断路器是为了解决服务故障的“雪崩”,   雪崩是指,由于网络原因或者自身的原因,服务并不能保证100%可用,如果单个服务出现问题,调用这个服务就会出现线程阻塞,此时若有大量的请 ...

  5. 玩转SpringCloud(F版本) 三.断路器(Hystrix)RestTemplate+Ribbon和Feign两种方式

    此文章基于: 玩转SpringCloud 一.服务的注册与发现(Eureka) 玩转SpringCloud 二.服务消费者(1)ribbon+restTemplate 转SpringCloud 二.服 ...

  6. SpringCloud断路器(Hystrix)和服务降级案列

    断路器(Hystrix) 为什么需要 Hystrix? 在微服务架构中,我们将业务拆分成一个个的服务,服务与服务之间可以相互调用(RPC).为了保证其高可用,单个服务又必须集群部署.由于网络原因或者自 ...

  7. 断路器Hystrix与Turbine集群监控-Spring Cloud学习第三天(非原创)

    文章大纲 一.Hystrix基础介绍二.断路器Hystrix简单使用三.自定义Hystrix请求命令四.Hystrix的服务降级与异常处理五.Hystrix的请求缓存与请求合并六.Hystrix仪表盘 ...

  8. springcloud实践(一)服务发现:Eureka

    Eureka 入门 是什么? Eureka 是 Netflix 开源的一个 RESTful服务,主要用于服务注册与发现. 它由Eureka server 和Eureka client组成. Eurek ...

  9. SpringCloud 在Feign上使用Hystrix(断路由)

    SpringCloud  在Feign上使用Hystrix(断路由) 第一步:由于Feign的起步依赖中已经引入了Hystrix的依赖,所以只需要开启Hystrix的功能,在properties文件中 ...

  10. SpringCloud----熔断机制 -- 断路器hystrix

    参考借鉴:http://www.cnblogs.com/chry/p/7279856.html SpringCloud Netflix实现了断路器库的名字叫Hystrix. 在微服务架构下,通常会有多 ...

随机推荐

  1. MySQL_数据库命令

    Mysql基础命令 开启MySQL服务:net start mysql 关闭MySQL服务:net stop musql 进入mysql:mysql -h localhost -u root -p 1 ...

  2. 自学电脑游戏第四天(Swing)

    继续之前的 3.组合框(JComboBox) 例题:利用JComboBox设计一个选择城市的程序. import java.awt.*; import javax.swing.*; public cl ...

  3. Hadoop-(Flume)

    Hadoop-(Flume) 1. Flume 介绍 1.1. 概述 Flume是一个分布式.可靠.和高可用的海量日志采集.聚合和传输的系统. Flume可以采集文件,socket数据包.文件.文件夹 ...

  4. mybatis-plus代码生成器两版(全部生成+部分生成)

    mybatis-plus代码生成器两版(全部生成+部分生成) 一次性生成全部文件 package com.layuicms.erp.utils; import java.util.List; impo ...

  5. Android Application的Gradle说明

    //引入插件 apply plugin: 'com.android.application' android { compileSdkVersion 29 buildToolsVersion &quo ...

  6. PHP生成中文验证码并检测对错实例

    PHP生成中文验证码并检测对错实例,中文验证码的例子还是比较少的,今天给大家分享一下,支持自定义中文.字体.背景色等 生成验证码,注意font字体路径要对,否则显示图片不存在 session_star ...

  7. 题解 P2879 【[USACO07JAN]区间统计Tallest Cow】

    题目链接: https://www.luogu.org/problemnew/show/P2879 思路: 先不管最大高度,我们读入一对x,y.说明,x+1~y-1之间牛的身高都小于x,y. 然后不妨 ...

  8. java实现spark常用算子之TakeSample

    import org.apache.spark.SparkConf;import org.apache.spark.api.java.JavaRDD;import org.apache.spark.a ...

  9. Java并发编程——线程池

    本文的目录大纲: 一.Java中的ThreadPoolExecutor类 二.深入剖析线程池实现原理 三.使用示例 四.如何合理配置线程池的大小 一.Java中的ThreadPoolExecutor类 ...

  10. vue2.0关于for循环 index的使用方法

    <!DOCTYPE html> <html> <head> <title>for循环</title> </head> <b ...