Sentinel 万字教程.docx
《Sentinel 万字教程.docx》由会员分享,可在线阅读,更多相关《Sentinel 万字教程.docx(29页珍藏版)》请在第一文库网上搜索。
1、Sentinel万字教程限流作为现在微服务中常见的稳定性措施,在面试中肯定也是经常会被问到的,我在面试的时候也经常喜欢问一下你对限流算法知道哪一些?有看过源码吗?实现原理是什么?第一部分先讲讲限流算法,最后再讲讲源码的实现原理。限流算法关于限流的算法大体上可以分为四类:固定窗口计数器、滑动窗口计数器、漏桶(也有称漏斗,英文Leaky bucket)、令牌桶(英文 Token bucket)o固定窗口,相比其他的限流算法,这应该是最简单的一种。它简单地对一个固定的时间窗口内的请求数量进行计数,如果超过请求数量的阈值,将被直接丢弃。这个简单的限流算法优缺点都很明显。优点的话就是简单,缺点举个例子来
2、说。比如我们下图中的黄色区域就是固定时间窗口,默认时间范围是60s,限流数量是100o如图中括号内所示,前面一段时间都没有流量,刚好后面30秒内来了 1 00个请求,此时因为没有超过限流阈值,所以请求全部通过,然后下一个窗口的20秒内同样通过了 100个请求。所以变相的相当于在这个括号的40秒的时间内就通过了 200个请求,超过了我们限流的阈值。60s, B艮流 100限流为了优化这个问题,于是有了滑动窗口算法,顾名思义,滑动窗就是时间窗口在随着时间推移不停地移动。滑动窗口把一个固定时间窗口再继续拆分成N个小窗口,然后对每个小窗口分别进行计数,所有小窗口请求之和不能超过我们设定的限流阈值。以下
3、图举例子来说,假设我们的窗口拆分成了 3个小窗口,小窗口都是20s,同样基于上面的例子,当在第三个20s的时候来了 100个请求,可以通过。然后时间窗口滑动,下一个20s请求乂来了 100个请求,此时我们滑动窗口的60s范围内请求数量肯定就超过100 了啊,所以请100Leaky bucket漏桶算法,人如其名,他就是一个漏的桶,不管请求的数量有多少,最终都会以固定的出口流量大小匀速流出,如果请求的流量超过漏桶大小,那么超出的流量将会被丢弃。也就是说流量流入的速度是不定的,但是流出的速度是恒定的。这个和MQ削峰填谷的思想比较类似,在面对突然激增的流量的时候,通过漏桶算法可以做到匀速排队,固定速
4、度限流。漏桶算法的优势是匀速,匀速是优点也是缺点,很多人说漏桶不能处理突增流量,这个说法并不准确。漏桶本来就应该是为了处理间歇性的突增流量,流量一下起来了,然后系统处理不过来,可以在空闲的时候去处理,防止了突增流量导致系统崩溃,保护了系统的稳定性。但是,换一个思路来想,其实这些突增的流量对于系统来说完全没有压力,你还在慢慢地匀速排队,其实是对系统性能的浪费。所以,对于这种有场景来说,令牌桶算法比漏桶就更有优势。令牌桶令牌桶算法是指系统以一定地速度往令牌桶里丢令牌,当一个请求过来的时候,会去令牌桶里申请一个令牌,如果能够获取到令牌,那么请求就可以正常进行,反之被丢弃。现在的令牌桶算法,像Guav
5、a和Sentinel的实现都有冷启动/预热的方式,为了避免在流量激增的同时把系统打挂,令牌桶算法会在最开始一段时间内冷启动,随着流量的增加,系统会根据流量大小动态地调整生成令牌的速度,最终直到请求达到系统的阈值o源码举例我们以s e n t i n e 1举例,sentinel中统计用到了滑动窗口算法,然后也有用到漏桶、令牌桶算法。sentinel中就使用到了滑动窗口算法来进行统计,不过他的实现和我上面画的图有点不一样,实际上sentinel中的滑动窗口用一个圆形来描述更合理一点。前期就是创建节点,然后slot串起来就是一个责任链模式,Statist icSlot通过滑动窗口来统计数据,Flo
6、wSlot是真正限流的逻辑,还有一些降级、系统保护的措施,最终形成了整个sentinelSlot chainRuntime statisticsStatisticSlotTimestamp 1527574049ActionSystemSlotAuthorizeslot |DegradeSlot |FlowSlotrules就看看官方图吧,这圆形画起来好恶心滑动窗口的实现主要可以看LeapArray的代码,默认的话定义了时间窗口的相关参数。对于sent inel来说其实窗口分为秒和分钟两个级别,秒的话窗口数量是2,分钟则是60个窗口,每个窗口的时间长度是1 s ,总的时间周期就是60s ,分成6
7、0个窗口,这里我们就以分钟级别的统.protected int windowLengthlnMs;protected int samplrCo”ntprotected int interval InMsprivate double interval InSecond ;protected final AtomicReferenceArrayWindowWrap array;然后我们要看的就是它是怎么计算出当前窗口的,其实源码里写的听清楚的,但是如果你按照之前想象把他当做一条直线延伸去想的话估计不太好理解。首先计算数组索引下标和时间窗口时间这个都比较简单,难点应该大部分在于第三点窗口大于old这
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Sentinel 万字教程 教程