其他分享
首页 > 其他分享> > 微服务可用性设计(二):过载保护,限流

微服务可用性设计(二):过载保护,限流

作者:互联网

微服务可用性设计(一):隔离,超时

过载保护

令牌桶算法

是一个存放固定容量令牌的桶,按照固定速率往桶里添加令牌。令牌桶算法的描述如下:

token-bucket rate limit algorithm: /x/time/rate

令牌桶流入速度固定,允许请求激增。单机部署就可以实现稳定的微服务限流

漏桶算法

作为计量工具(The Leaky Bucket Algorithm as a Meter)时,可以用于流量整形(Traffic Shaping)和流量控制(TrafficPolicing),漏桶算法的描述如下:

单机版可以实现稳定的微服务限流

漏斗桶/令牌桶确实能够保护系统不被拖垮, 但不管漏斗桶还是令牌桶, 其防护思路都是设定一个指标, 当超过该指标后就阻止或减少流量的继续进入,当系统负载降低到某一水平后则恢复流量的进入。但其通常都是被动的,其实际效果取决于限流阈值设置是否合理,但往往设置合理不是一件容易的事情。

这些其实都是采用漏斗桶/令牌桶的缺点, 总体来说就是太被动, 不能快速适应流量变化。
因此我们需要一种自适应的限流算法,即: 过载保护,根据系统当前的负载自动丢弃流量。

计算系统临近过载时的峰值吞吐作为限流的阈值来进行流量控制,达到系统保护。

如何计算接近峰值时的系统吞吐?

限流

限流是指在一段时间内,定义某个客户或应用可以接收或处理多少个请求的技术。例如,通过限流,你可以过滤掉产生流量峰值的客户和微服务,或者可以确保你的应用程序在自动扩展(Auto Scaling)失效前都不会出现过载的情况。

分布式限流

分布式限流,是为了控制某个应用全局的流量,而非真对单个节点纬度。

如何基于单个节点按需申请,并且避免出现不公平的现象?

初次使用默认值,一旦有过去历史窗口的数据,可以基于历史窗口数据进行 quota 请求。

在这里插入图片描述

思考:

那么我们如何来分配资源呢?一种在实际中广泛使用的分享技术称作“最大最小公平分享”(Max-Min Fairness)。

直观上,公平分享分配给每个用户想要的可以满足的最小需求,然后将没有使用的资源均匀的分配给需要‘大资源’的用户。

最大最小公平分配算法的形式化定义如下:

在这里插入图片描述

重要性

每个接口配置阈值,运营工作繁重,最简单的我们配置服务级别 quota,更细粒度的,我们可以根据不同重要性设定 quota,我们引入了重要性(criticality):

gRPC 系统之间,需要自动传递重要性信息。如果后端接受到请求 A,在处理过程中发出了请求 B 和 C 给其他后端,请求 B 和 C 会使用与 A 相同的重要性属性。

熔断

断路器(Circuit Breakers): 为了限制操作的持续时间,我们可以使用超时,超时可以防止挂起操作并保证系统可以响应。因为我们处于高度动态的环境中,几乎不可能确定在每种情况下都能正常工作的准确的时间限制。断路器以现实世界的电子元件命名,因为它们的行为是都是相同的。断路器在分布式系统中非常有用,因为重复的故障可能会导致雪球效应,并使整个系统崩溃。

但一刀切的形式太过暴力,用户的请求失败率太高。

自适应保护的熔断

Google SRE中有这样一种是算法:
p = max(0, (requests - K*accepts) / (requests + 1))
p代表被丢掉流量的概率
K越小代表熔断越激进(K=2是默认值)
当request趋近于正无穷,那么这个公式的结果极限趋近1

这种方式实现了在系统允许的情况下,尽可能放多的流量进来,而不是全部拒绝。相对一刀切的情况,用户请求成功率会高很多。

客户端流控

positive feedback: 用户总是积极重试,访问一个不可达的服务。

Gutter

基于熔断的 gutter kafka ,用于接管自动修复系统运行过程中的负载,这样只需要付出10%的资源就能解决部分系统可用性问题(双熔断)。

我们经常使用 failover 的思路,但是完整的 failover 需要翻倍的机器资源,平常不接受流量时,资源浪费。高负载情况下接管流量又不一定完整能接住。所以这里核心利用熔断的思路,是把抛弃的流量转移到 gutter 集群,如果 gutter 也接受不住的流量,重新回抛到主集群,最大力度来接受。

Case Study

标签:令牌,请求,过载,可用性,用户,流量,限流
来源: https://blog.csdn.net/weixin_39172380/article/details/122730452