Hello World

吞风吻雨葬落日 欺山赶海踏雪径

0%

超时,重试,熔断,限流

超时,重试,熔断,限流的扼要说明

超时(timeout)

当consumer调用provider的时候,provider处理非常慢,比如10s后才会响应,那么consumer至少也是10s,如果调用链路长,一层一层向上影响会拖慢整个链路,所以consumer不会无限等待provider的返回,在调用的时候设置一个等待的阈值,超过了这个时间阈值,则不继续等待。当consumer调用provider等待时长超过阈值,即调用超时。

超时机制避免了consumer调用provider长时间等待的情况。超时是设置在consumer端的。

重试(retry)

consumer调用provider失败的情况,有可能是provider的偶尔抖动,如果在重试一次可能就调用成功了,只是带来了调用多次增加的额外响应时间。
一般的重试策略是换一台provider调用,有可能失败的情况是当前provider负载过高,如果依旧重试次provider可能加剧当前机器的性能问题。换一台provider,成功的可能性会大一些。

幂等(idempotent)

做到可以重试的前提是provider提供的服务逻辑必须支持幂等。即多次调用结果都应该是一致的。

熔断(circuit break)

当调用provider持续超时的情况下,如果此服务是非核心服务,那么当调用provider时可以不比等到其超时,而是快速失败掉其调用,避免影响核心链路造成超时。

provider可能在一段时间后自主或人为的恢复。如果是自主恢复,需要具备探测服务恢复的能力。

熔断处理逻辑参见Netflix开源的Hystrix的代码: https://github.com/Netflix/Hystrix

降级

服务降级一般原则

  1. 两害相权取其轻,一定是先降级优先级低的接口
  2. 从外到内开始降级
  3. 如果服务能检测到自身负载上升,那么可以从这个服务自身做降级

熔断和降级的区别

熔断又称过载保护,是保护的服务的提供方,在服务提供方处理不过来的时候为了防止雪崩效应而减少对服务端的压力,让服务端恢复的策略。
降级是在资源紧张的情况下保护服务消费方的核心流程最终取悦用户,对非核心流程做的措施。

consumer端

当provider熔断之后,此时consumer可以自己准备一个本地的fallback回调,返回一个缺省值。

provider端

当provider 发现调用流量激增的时候为了保护自身的稳定性,也可能考虑降级服务。
比如:

  1. 直接给consumer返回固定数据
  2. 需要实时写入数据库的,先缓存到队列里,异步写入数据库。

限流(current limiting)

当provider是一个核心服务,被一个非核心consumer因为代码逻辑问题造成的大量调用而拖垮性能,影响其他核心调用,此时provider应该有策略保证核心链路而适当放弃非核心调用。
provider端根据consumer的重要程度、平时的QPS大小,给每个consumer设置一个流量上线,超过限制则等待或者直接拒绝。

令牌桶算法

限流的原理–令牌桶算法,Guava的RateLimiter也已经有成熟做法.此处想强调的是,令牌桶算法针对的是限制速率。至于其他限制策略,比如限制总数,限制某个业务量的count值,则要具体业务场景具体分析。

资源隔离

provider对consumer来的流量进行限流,防止provider被异常流量拖垮。
同样consumer 也需要对调用provider的线程资源进行隔离,确保调用某个provider逻辑不会耗光整个consumer的线程池资源。(可能provider因为限流造成大量consumer调用等待)

级联失败(cascading failure)

系统中有某个服务出现故障,不可用,传递性地导致整个系统服务不可用的问题。

关键路径

关键路径就是,服务想正常工作,必须要完整依赖的下游服务链,比如数据库一般就是关键路径里面的一个节点。
尽量减少关键路径依赖的数量,是提高服务稳定性的一个措施。
数据库一般在服务体系的最底层,如果你的服务可以会自己完整缓存使用的数据,解除数据库依赖,那么数据库挂掉,你的服务就暂时是安全的。

最长路径

想要优化你的服务的响应时间,需要看服务调用逻辑里面的最长路径,只有缩短最长时间路径的用时,才能提高你的服务的性能。

参考

服务熔断、降级、限流、异步RPC – HyStrix
https://blog.csdn.net/chunlongyu/article/details/53259014

熔断,限流,降级
https://www.cnblogs.com/raoshaoquan/articles/6636067.html

spring-retry重试与熔断详解
https://blog.csdn.net/broadview2006/article/details/72841056

微服务架构—服务降级
http://www.relangba.com/140/110711.html