熔断限流
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了熔断限流相关的知识,希望对你有一定的参考价值。
参考技术A 限流: 原理是监控应用流量的QPS或并发线程数等指标,当达到指定阈值时对流量进行控制,避免系统被瞬时的流量高峰冲垮,保障应用高可用性。保护自身系统防止被外部调垮。熔断: 调用远程服务,后端服务不可避免的会产生调用失败(超时或者异常),防止应用程序不断地尝试可能超时和失败的服务,能达到应用程序执行而不必等待下游服务修正错误服务。
降级: 是指牺牲非核心的业务功能,保证核心功能的稳定运行。在后台通过开关控制,降级部分非主流程的业务功能,减轻系统依赖和性能损耗,从而提升集群的整体吞吐率。
Hystrix 的关注点在于以隔离和 熔断 为主的容错机制,超时或被熔断的调用将会快速失败,并可以提供 fallback 机制。Hystrix 提供两种隔离策略: 线程池隔离(Bulkhead Pattern) 和 信号量隔离。
线程池隔离: 针对不同的资源分别创建不同的线程池,不同服务调用都发生在不同的线程池中,在线程池排队、超时等阻塞情况时可以快速失败,并可以提供 fallback 机制。好处是隔离度比较高,单独处理某个资源;代价就是线程上下文切换的 overhead 比较大,会让机器资源碎片化,特别是对低延时的调用有比较大的影响。
信号量隔离: 限制对某个资源调用的并发数,更为轻量,开销更小。但缺点是无法对慢调用自动进行降级,只能等待客户端自己超时,因此仍然可能会出现级联阻塞的情况。
Sentinel 和 Hystrix 的熔断降级功能本质上都是基于熔断器模式(Circuit Breaker Pattern)。Sentinel 与 Hystrix 都支持基于 失败比率(异常比率) 的熔断降级, 在调用达到一定量级并且失败比率达到设定的阈值时自动进行熔断 ,此时所有对该资源的调用都会被 block,直到过了指定的时间窗口后才启发性地恢复。 Sentinel 还支持基于平均响应时间的熔断降级,可以在服务响应时间持续飙高的时候自动熔断 ,拒绝掉更多的请求,直到一段时间后才恢复。这样可以防止调用非常慢造成级联阻塞的情况。
Hystrix 和 Sentinel 的实时指标数据统计实现都是基于滑动窗口的。
Sentinel:轻量级和高性能, 可以针对不同的调用关系,以 不同的运行指标(如 QPS、并发调用数、系统负载等) 为基准,对资源调用进行流量控制,将随机的请求调整成合适的形状。
熔断策略: 平均响应时间 (DEGRADE_GRADE_RT):时间窗口内接口调用RT超过一定时间,下一时间窗口自动熔断; 异常比例 (DEGRADE_GRADE_EXCEPTION_RATIO) :每秒调用时间异常比例超过一定阈值,自动熔断; 异常数 (DEGRADE_GRADE_EXCEPTION_COUNT):当资源近 1 分钟的异常数目超过阈值之后会进行熔断。
流量控制(Flow Control),原理是监控应用流量的QPS或并发线程数等指标,当达到指定阈值时对流量进行控制,避免系统被瞬时的流量高峰冲垮,保障应用高可用性。
流量整形策略: 直接拒绝模式 :即超出的请求直接拒绝。
慢启动预热模式 :当流量激增的时候,控制流量通过的速率,让通过的流量缓慢增加,在一定时间内逐渐增加到阈值上限,给冷系统一个预热的时间,避免冷系统被压垮。
匀速器模式: 利用 Leaky Bucket 算法实现的匀速模式,严格控制了请求通过的时间间隔,同时堆积的请求将会排队,超过超时时长的请求直接被拒绝。
常用限流算法:
①计数器限流算法
通过一个计数器,限制每一秒钟能够接收的请求数。周期内,超过阈值后的请求就会被全部拒绝。
②滑动窗口算法(sentinel使用)
滑动窗口算法是将时间周期分为N个小周期(窗口),分别记录每个小周期内访问次数,然后根据时间将窗口往前滑动,统计时间窗口内调用次数。
③漏桶限流算法
实现一个容器,容量固定,访问请求到达时直接放入漏桶,如当前容量已达到上限(限流值),则进行丢弃(触发限流策略)。漏桶以固定的速率进行释放访问请求(即请求通过),直到漏桶为空。实际上消息中间件就使用了漏桶限流的思想,不管生产者的请求量有多大, 消息的处理能力取决于消费者。
④令牌桶限流算法
令牌桶是网络流量整形(Traffic Shaping)和速率限制(Rate Limiting)中最常使用的一种算法。对于每一个请求,都需要从令牌桶中获得一个令牌,如果没有获得令牌,则需要触发限流策略。
以上是关于熔断限流的主要内容,如果未能解决你的问题,请参考以下文章
Nginx保姆级教程-就怕你还学不会-Nginx之负载均衡限流熔断限流熔断动静分离