Skip to content

Latest commit

 

History

History
182 lines (112 loc) · 8.2 KB

网关之降级、熔断、限流、隔离、幂等性验证、超时重试机制.md

File metadata and controls

182 lines (112 loc) · 8.2 KB

网关之降级、熔断、限流、隔离、幂等性验证、超时重试机制的相关知识简单整理

1、微服务架构中没有接口限流,可能会遇到哪些问题?
2、针对微服务接口限流,如何选择合适的限流算法?
3、如何根据场景和性能要求权衡选择单机还是分布式限流?
4、如何根据业务需求灵活的选择不同的限流熔断机制?
5、如何对接口选择合适的限流时间粒度和最大限流值?
6、如何验证微服务接口限流功能的有效性和正确性?
7、如何打造高度容错、高TPS、低延迟的限流框架?

限流:限制服务/接口访问的流量。可以从总量+速率进行处理
熔断:熔断一般是指软件系统中,由于某些原因使得服务出现了过载现象,为防止造成整个系统故障,从而采用的一种保护措施,所以很多地方把熔断亦称为过载保护。
降级:在服务器压力剧增的情况下,根据实际业务情况和流量,对一些服务和页面不处理或简单处理,从而释放服务器资源保证核心交易正常运作。
隔离:保证其中某个服务坏掉,不会影响到其他服务。线程池/信号量隔离模式

超时重试机制:一种是请求的等待超时,一种是请求运行超时。
幂等性验证: 可能因为网络抖动或其他位置原因,服务端在短时间内可能会受到多笔相同的交易

接口返回:单个字段:脱敏、泛化,HASH单向加解密校验、加解密,

降级处理
1、服务降级模式:屏蔽降级【直接关闭相关服务】、容错降级【根据异常进行返回处理】、业务降级【业务调整】、非降级【其他】;
2、服务降级措施:返回NULL、抛出指定异常、调用本地MOCK服务、自定义降级策略。

熔断处理状态划分如下:

  1. Closed:熔断器关闭状态,调用失败次数积累,到了阈值(或一定比例)则启动熔断机制;
  2. Open:熔断器打开状态,此时对下游的调用都内部直接返回错误,不走网络,但设计了一个时钟选项,默认的时钟达到了一定时间(这个时间一般设置成平均故障处理时间,也就是MTTR),到了这个时间,进入半熔断状态;
  3. Half-Open:半熔断状态,允许定量的服务请求,如果调用都成功(或一定比例)则认为恢复了,关闭熔断器,否则认为还没好,又回到熔断器打开状态;

限流处理:
限流过滤器是在请求被转发之前调用的,一般类型有三种包括
1、请求参数
2、根据请求路径区分、API
3、origin客户端IP地址区分
4、根据用户授权区分、或者APP

限流的算法可以有以下几种算法但是不限于
1、令牌通限流
2、漏桶限流
3、计数器限流
4、固定时间窗口,
5、滑动时间窗口 滑动时间窗口算法是对固定时间窗口算法的一种改进

1、并发级别限流信号量
2、漏桶算法
3、令牌桶

超时处理

  1. 等待超时:在任务入队列时设置任务入队列时间,并判断队头的任务入队列时间是否大于超时时间,超过则丢弃任务。
  2. 运行超时:直接可使用线程池提供的get方法
    可以使用Future类判断运行时长等。

参考
https://www.deathearth.com/838.html
https://www.cnblogs.com/xiangkejin/p/9278729.html


限流框架:Sentinel、resilience4j、Hystrix、SnowJena

参考
/Users/yangzl/git/quickstart-netflix/quickstart-hystrix

常用限流降级组件对比
高可用架构Sentinel、Hystrix、resilience4j限流熔断技术选型

Sentinel:轻量级的强大流控制组件,可实现对微服务的可靠性和监视。 (轻量级的流量控制,熔断降级Java库)
Sentinel Github
Sentinel介绍

Resilience4j是为Java8和函数式编程设计的容错库
Resilience4j Github Resilience4j介绍

Hystrix是一个延迟和容错库,旨在隔离对远程系统,服务和第三方库的访问点,停止级联故障,并在不可避免发生故障的复杂分布式系统中实现弹性。
Hystrix 已经进入「维护状态」,现在 Netflix 已经启用「resilience4j」框架,作为替代方案。
Hystrix Github

Distributed lock-free current limiting framework based on token bucket algorithm.
基于令牌桶算法实现的分布式无锁限流框架。
SnowJena Github
SnowJena介绍

Java速率限制库/框架
Java rate limiting library/framework
Ratelimiter4j Github


限流处理方案

限流过滤器是在请求被转发之前调用的,一般类型有三种包括
1、请求参数
2、根据请求路径区分、API
3、origin客户端IP地址区分
4、根据用户授权区分、或者APP

限流的算法可以有以下几种算法但是不限于
1、令牌通限流 桶大小可以处理临界突发流量的能力
2、漏桶限流
3、计数器限流
4、固定时间窗口,
5、滑动时间窗口 滑动时间窗口算法是对固定时间窗口算法的一种改进

漏桶算法与令牌桶算法的区别在于,
漏桶算法能够强行限制数据的传输速率,
令牌桶算法能够在限制数据的平均传输速率的同时还允许某种程度的突发情况。
令牌桶还有一个好处是可以方便的改变速度。一旦需要提高速率,则按需提高放入桶中的令牌的速率。所以,限流框架的核心算法还是以令牌桶算法为主。

限流熔断
https://www.infoq.cn/article/microservice-interface-rate-limit
http://www.hatlonely.com/2018/06/21/%E5%BE%AE%E6%9C%8D%E5%8A%A1%E7%BB%84%E4%BB%B6%E4%B9%8B%E9%99%90%E6%B5%81%E5%99%A8%E4%B8%8E%E7%86%94%E6%96%AD%E5%99%A8/index.html

腾讯云限流
https://cloud.tencent.com/document/product/649/19046

漏桶算法+令牌算法参考
https://blog.csdn.net/charleslei/article/details/53152883
https://juejin.im/post/5d1ca60f6fb9a07ee63f81a8
https://cloud.tencent.com/developer/article/1455478
https://cloud.tencent.com/developer/article/1165247

Google开源工具包Guava提供了限流工具类RateLimiter,该类基于令牌桶算法实现流量限制
计数器算法参考
http://www.360doc.com/content/18/0222/08/10346540_731371833.shtml

Sentinel讲解
https://toutiao.io/posts/tyc131/preview
https://github.com/alibaba/Sentinel/wiki/Sentinel-%E4%B8%8E-Hystrix-%E7%9A%84%E5%AF%B9%E6%AF%94
https://aijishu.com/a/1060000000022486
https://www.kancloud.cn/jfun/java/1152547
https://juejin.im/post/5c26023151882545e24f2ed9

Hystrix讲解
https://www.iteye.com/blog/hot66hot-2155036
https://www.jianshu.com/p/c1c0d8305fb4

华为云微服务开发
https://liubao68.github.io/ReadTheDocDemo/start/first-sample.html