• Hystrix断路器


    分布式系统面临的问题

      复杂分布式体系结构中的应用程序有数十个依赖关系,每个依赖关系在某些时候将不可避免地失败。

    服务雪崩
      多个微服务之间调用的时候,假设微服务A调用微服务B和微服务C,微服务B和微服务C又调用其它的微服务,这就是所谓的“扇出”。
      如果扇出的链路上某个微服务的调用响应时间过长或者不可用,对微服务A的调用就会占用越来越多的系统资源,进而引起系统崩溃,所谓的“雪崩效应”.
      对于高流量的应用来说,单一的后端依赖可能会导致所有服务器上的所有资源都在几秒钟内饱和。比失败更糟糕的是,这些应用程序还可能导致服务之间的延迟增加,备份队列,线程和其他系统资源紧张,导致整个系统发生更多的级联故障。这些都表示需要对故障和延迟进行隔离和管理,以便单个依赖关系的失败,不能取消整个应用程序或系统。所以,通常当你发现一个模块下的某个实例失败后,这时候这个模块依然还会接收流量,然后这个有问题的模块还调用了其他的模块,这样就会发生级联故障,或者叫雪崩


    Hystrix简介

      Hystrix是一个用于处理分布式系统的延迟和容错的开源库, 在分布式系统里,许多依赖不可避免的会调用失败,比如超时、异常等,Hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性。
      “断路器”本身是一种开关装置, 当某个服务单元发生故障之后,通过断路器的故障监控(类似熔断保险丝) ,向调用方返回一个符合预期的、可处理的备选响应(FallBack) ,而不是长时间的等待或者抛出调用方无法处理的异常,这样就保证了服务调用方的线程不会被长时间、不必要地占用,从而避免了故障在分布式系统中的蔓延,乃至雪崩。

    大神论文

    Hystrix重要概念

    1、服务降级:服务器忙,请稍候再试,不让客户端等待并立刻返回一个友好提示,fallback。
    哪些情况会触发降级:

    • 程序运行异常
    • 超时
    • 服务熔断触发服务降级
    • 线程池/信号量打满也会导致服务降级

    2、服务熔断:类比保险丝,当达到最大服务访问后,直接拒绝访问,拉闸限电,然后调用服务降级的方法并返回友好提示。
     熔断机制概述:
      熔断机制是应对雪崩效应的一种微服务链路保护机制。当扇出链路的某个微服务出错不可用或者响应时间太长时,会进行服务的降级,进而熔断该节点微服务的调用,快速返回错误的响应信息。当检测到该节点微服务调用响应正常后,恢复调用链路。
      在Spring Cloud框架里,熔断机制通过Hystrix实现。Hystrix会监控微服务间调用的状况,当失败的调用到一定阈值, 缺省是5秒内20次调用失败,就会启动熔断机制。熔断机制的注解是@HystrixCommand.
    在这里插入图片描述
    2.1 参数设置

    	//服务熔断
        @HystrixCommand(fallbackMethod = "paymentCircuitBreaker_fallback",commandProperties = {
                @HystrixProperty(name = "circuitBreaker.enabled",value = "true"),  //是否开启断路器
                @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value = "10"),   //请求次数
                @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "10000"),  //时间范围
                @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "60"), //失败率达到多少后跳闸
        })
        public String paymentCircuitBreaker(@PathVariable("id") Integer id){
    
    • 启用断路器 @HystrixProperty(name = “circuitBreaker.enabled”, value = “true”)
    • 设置请求次数 @HystrixProperty(name = “circuitBreaker.requestVolumeThreshold”, value = “10”)
    • 设置时间窗口期 @HystrixProperty(name = “circuitBreaker.sleepWindowInMilliseconds”, value = “10000”)
    • 设置失败率 @HystrixProperty(name = “circuitBreaker.errorThresholdPercentage”, value = “50”)

    2.2 熔断参数

    • 时间窗口: 断路器确定是否打开需要统计一些请求和错误数据,而统计的时间范围就是时间窗口,默认为最近的10秒
    • 请求总数阈值: 在时间窗口时间内,必须满足请求总数阈值才有资格熔断,默认是20,以为着在10秒内,如果hystrix的调用次数不足20次,即使所有的请求都超时或者其他原因失败,断路器都不会打开。
    • 错误百分比阈值: 当请求总数在时间窗口内超过了阈值,比如发生了调用30次,如果30次中有15次发生了超时,则就是超过了50%的错误百分比,在默认设定50%的阈值情况下,这时候会将断路器打开。
    • 当开启断路器时,所有得请求都不会进行转发,而是直接进入服务降级指定的fallback方法中,一段时间后(默认是5秒),这时断路器进入半开状态,会让其中的一个请求进行转发,如果成功,断路器会关闭,如果失败,则继续开启,且熔断时间重新计时,然后重新进入半开状态

    2.3 官网步骤
    在这里插入图片描述
    2.4 HystrixCommand 全部配置参数详解

    //======================AlL
    @HystrixCommand(fallbackMethod = "str. _fallbackMethod" ,
    	groupKey = "strGroupCommand",
    	commandKey = " strCommartd",
    	threadPoolKey =" strThreadPool" ,
    	commandProperties = {
    		//没置隔离策峪,THREAD 表示线程池SEMAPHORE:信号池隔离
    		@HystrixProperty(name = "execution.isolation. strategy", value = "THREAD"),
    		//当隔离策峪选择信号池隔离的时候,用来设置信号池的大小(最大并发数)
    		@HystrixProperty(name = " execution. isolation. semaphore . maxConcurrentRequests", value =10"),
    		//配置命令执行的超时时间
    		@HystrixProperty(name = " execution. isolation. thread . timeoutinMilliseconds", value = "10"),
    		//是否启用超时时间
    		@HystrixProperty(name = " execution. timeout. enabled", value = "true"),
    		//执行超时的时候是否中断
    		@HystrixProperty(name = "execution. isolation. thread . interruptOnTimeout", value = "true"),
    		//执行被取消的时候是否中断
    		@HystrixProperty(name = " execution. isolation. thread . interruptOnCancel", value = "true"),
    		//允许回调方法执行的最大并发数
    		@HystrixProperty(name = "fallback. isolation. semaphore . maxConcurrentRequests", value = "10"),
    		//服务降级是否启用,是否执行回调西数
    		@HystrixProperty(name = "fallback. enabled", value = "true"),
    		//是否允许熔断
    		@HystrixProperty(name = "circuitBreaker .enabled", value = "true" ), 
    		//该属性用来没置在滚动时间窗中,断路器熔断的最小请求数。例如,默认该值为20的时候,
    		//如果滚动时间窗(默江10秒)内仅收到了19个请求,即使这19个请求都失败 了,断路器也不会打开。
    		@HystrixProperty(name = "circuitBreaker . requestVolumeThreshold", value = "20"),
    		//该属性用来没置在滚动时间窗中,表示在滚动时间窗中,在请求数量超过
    		// circuitBreaker. requestVolume Threshold的情况下,如果错误请求数的百分比超过50,
    		//就把断路器没置为“打开”状态,否则就设置为"关闭”状态。
    		@HystrixProperty(name = "circuitBreaker . errorThresholdPercentage", value = "50"),
    		//该属性用来没置当断路器打开之后的休眠时间窗。休眠时间窗结束之后,
    		//会将断路器置为“半开”状态,尝试熔断的请求命令,如果依然失败就将断路器继续设置为”打开”状态,
    		//如果成功就没置为"关闭”状态。
    		@HystrixProperty(name = " circuitBreaker . sleepWindowinMilliseconds", value = "5000"),
    		//断路器强制打开
    		@HystrixProperty(name =” circuitBreaker . forceOpen", value = "false"),
    		//断路器强制关闭
    		@HystrixProperty(name = "circuitBreaker . forceClosed", value = "false"),
    		//滚动时间窗没置,该时间用于断路器判断健康度时需要收集信息的持续时间
    		@HystrixProperty(name = "metrics. rollingStats . timeinMilliseconds", value = "10000"),
    		//该属性用来没置滚动时间窗统计指标信息时划分"桶"的数量,断路器在收集指标信息的时候会根据
    		//没置的时间窗长度拆分成多个”桶”来累计各度量值,每个” 桶"记录了-段时间内的来集指标。
    		//比如10秒内拆分成10个”桶”收集这样,所以timeinMilliseconds 必须能被numBuckets 整除。否则会抛异常
    		@HystrixProperty(name = "metrics .rollingStats . numBuckets", value = "10"),
    		//该属性用来没置对命令执行的延迟是否使用百分位数来跟踪和计算。如果设置为false,那么所有的概要统计都将返回-1。
    		@HystrixProperty(name = "metrics . rollingPercentile . enabled", value = "false"),
    		// 该属性用来设置百分位统计的滚动窗口的持续时间,单位为毫秒。
    		@HystrixProperty(name = "metrics . rollingPercentile . timeInMilliseconds", value = "60000"),
    		//该属性用来设置百分位统计熔动窗口中使用“桶”的数量。
    		@HystrixProperty(name = "metrics. rollingPercentile . numBuckets", value = "60000"),
    		//该属性用来没置在执行过程中每个 “桶” 中保留的最大执行次数。如果在滚动时间窗内发生超过该没定值的执行次数,
    		//就从最初的位置开始重写。例如,将该值没置为100, 熔动窗口为10秒,若在10秒内一个“桶”中发生了500次执行,
    		//那么该“桶”中只保留最后的100次执行的统计。另外,增加该值的大小将会增加内存量的消耗,并增加排序百分位数所需的计算时间。
    		@HystrixProperty(name = "metrics . rollingPercentile. bucketSize", value = "100"),
    		// 该属性用来没置采集影响断路器状态的健康快照(请求的成功、错误百分比) 的间隔等待时间。
    		@HystrixProperty(name = "metrics . healthSnapshot. intervalinMilliseconds", value = "500"),
    		//是否开启请求缓存
    		@HystrixProperty(name = " requestCache . enabled", value = "true"),
    		// HystrixCommand 的执行和事件是否打印日志到HystrixRequestLog中
    		@HystrixProperty(name = "requestLog. enabled", value = "true"),
    		@HystrixProperty(name = "metrics. rollingPercentile . bucketSize", value = "100"),
    		},
    		threadPoolProperties = {
    		//该参数用来没置执行命令线程他的核心线程数,该值也就是命令执行的最大并发量
    		@HystrixProperty(name = "coreSize", value = "10"),
    		//该参数用来没置线程他的最大队列大小。当汝置为-1 时,线程池将使用SynchronousQueue实现的队列,
    		//否则将使用LinkedBlockingQueue 实现的队列。
    		@HystrixProperty(name = "maxQueueSize", value = "-1"),
    		//该参数用来为队列设置拒绝阙值。通过该参数,即使队列没 有达到最大值也能拒绝请求。
    		//该参数主要是对LinkedBlockingQueue队列的补充,因为LinkedBlockingQueue
    		//队列不能动态修改它的对象大小,而通过该属性就可以调整拒绝请求的队列大小了。
    		@HystrixProperty(name = "queueSizeRejectionThreshold", value = "5"),
    }
    

    执行步骤:
    在这里插入图片描述
    3、服务限流:秒杀高并发等操作,严禁一窝蜂的过来拥挤,大家排队,一秒钟N个,有序进行。

  • 相关阅读:
    引擎设计跟踪(九.14.2h) 开发计划
    经典游戏重温
    引擎设计跟踪(九.14.2g) 将GNUMake集成到Visual Studio
    [工作积累] Android system dialog with native callback
    [工作积累] Software keyboard not shown on Activity.onCreate
    [工作积累] Android: Hide Navigation bar 隐藏导航条
    [工作积累] GCC 4.6 new[] operator内存对齐的BUG
    引擎设计跟踪(九.14.2f) 最近更新: OpenGL ES & tools
    [工作积累] Google Play Game SDK details
    [工作积累] Android dynamic library & JNI_OnLoad
  • 原文地址:https://www.cnblogs.com/firecode7/p/16120429.html
Copyright © 2020-2023  润新知