IT学习站-137zw.com

more +资源更新Forums

more +随机图赏Gallery

10节课让你成为滚床单高手  强烈推荐 屌丝的福音10节课让你成为滚床单高手 强烈推荐 屌丝的福音
Spring Boot编程思想(核心篇) PDF 电子书 百度云 网盘下载Spring Boot编程思想(核心篇) PDF 电子书 百度云 网盘下载
最新流出的传智博学谷黑马python5.0课程最新流出的传智博学谷黑马python5.0课程
MySQL视频教程价值288元MySQL面试指南视频教程 百度云 百度...MySQL视频教程价值288元MySQL面试指南视频教程 百度云 百度...
python基础教程编程数据分析excel源代码pandas视频教学数据处理python基础教程编程数据分析excel源代码pandas视频教学数据处理
价值388元 Spark Streaming实时流处理项目实战视频教程 百度云盘价值388元 Spark Streaming实时流处理项目实战视频教程 百度云盘

3. Sentinel源码分析— QPS流量控制是如何实现的?

3. Sentinel源码分析— QPS流量控制是如何实现的?

[复制链接]
123456848 | 显示全部楼层 发表于: 2019-11-14 10:50:02
123456848 发表于: 2019-11-14 10:50:02 | 显示全部楼层 |阅读模式
查看: 94|回复: 0

你还没有注册,无法下载本站所有资源,请立即注册!

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
终于在这周内写了一篇源码解析,每周一篇即使再忙也不能打破
Sentinel源码解析系列:
1.Sentinel源码分析—FlowRuleManager加载规则做了什么?
2. Sentinel源码分析—Sentinel是如何进行流量统计的?
  上回我们用基于并发数来讲了一下Sentinel的整个流程,这篇文章我们来讲一下Sentinel的QPS流量控制是如何实现的。
先上一个极简的demo,我们的代码就从这个demo入手:
在这个例子中我们首先新建了一个FlowRule实例,然后调用了loadRules方法加载规则,这部分的代码都和基于并发数的流量控制的代码是一样的,想要了解的朋友可以去看看我的这一篇文章1.Sentinel源码分析—FlowRuleManager加载规则做了什么?,下面我们说说不一样的地方。
在调用FlowRuleManager的loadRules方法的时候会创建一个rater实例:
FlowRuleUtil#buildFlowRuleMap
我们进入到generateRater看一下是怎么创建实例的:
FlowRuleUtil#generateRater
这个方法里面如果设置的是按QPS的方式来限流的话,可以设置一个ControlBehavior属性,用来做流量控制分别是:直接拒绝、Warm Up、匀速排队。
接下来的所有的限流操作全部在FlowSlot中进行,不熟悉Sentinel流程的朋友可以去看看我的这一篇文章:2. Sentinel源码分析—Sentinel是如何进行流量统计的?,这篇文章介绍了Sentinel的全流程分析,本文的其他流程基本都在这篇文章上讲了,只有FlowSlot部分代码不同。
接下来我们来讲一下FlowSlot里面是怎么实现QPS限流的
FlowSlot#entry
FlowSlot在实例化的时候会实例化一个FlowRuleChecker实例作为checker。在checkFlow方法里面会继续调用FlowRuleChecker的checkFlow方法,其中ruleProvider实例是用来根据根据resource来从flowRules中获取相应的FlowRule。
我们进入到FlowRuleChecker的checkFlow方法中
FlowRuleChecker#checkFlow
这里是调用ruleProvider来获取所有FlowRule,然后遍历rule集合通过canPassCheck方法来进行过滤,如果不符合条件则会抛出FlowException异常。
我们跟进去直接来到passLocalCheck方法:
这个方法里面会选择好相应的节点后调用rater的canPass方法来判断是否需要阻塞。
Rater有四个,分别是:DefaultController、RateLimiterController、WarmUpController、WarmUpRateLimiterController,我们挨个分析一下。
其中DefaultController是直接拒绝策略,我们在上一篇文章中已经分析过了,这次我们来看看其他三个。
RateLimiterController匀速排队

它的中心思想是,以固定的间隔时间让请求通过。当请求到来的时候,如果当前请求距离上个通过的请求通过的时间间隔不小于预设值,则让当前请求通过;否则,计算当前请求的预期通过时间,如果该请求的预期通过时间小于规则预设的 timeout 时间,则该请求会等待直到预设时间到来通过(排队等待处理);若预期的通过时间超出最大排队时长,则直接拒接这个请求。
这种方式适合用于请求以突刺状来到,这个时候我们不希望一下子把所有的请求都通过,这样可能会把系统压垮;同时我们也期待系统以稳定的速度,逐步处理这些请求,以起到“削峰填谷”的效果,而不是拒绝所有请求。
要想使用这个策略需要在实例化FlowRule的时候设置rule1.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER)这样的一句代码。
在实例化Rater的时候会调用FlowRuleUtil#generateRateri创建一个实例:
MaxQueueingTimeMs默认是500 ,Count在我们这个例子中传入的是20。
我们看一下具体的canPass方法是怎么实现限流的:
[code]public boolean canPass(Node node, int acquireCount, boolean prioritized) {     // Pass when acquire count is less or equal than 0.     if (acquireCount
137zw.com IT学习站致力于免费提供精品的java技术教程和python技术教程,CCNA书籍/资料/CCNP书籍/资料教程/CCIE书籍/资料/H3C学习/认证/一级建造师考试/微软学习/认证/包括基础教程和高级实战教程,同时也提供分享网站源码下载和互联网相关一系列的技术教程,我们想做的就是让知识分享更有价值!(IT学习站官方唯一域名地址:www.137zw.com 请谨防假冒网站!)本站所有资源全部收集于互联网或网友自行分享,分享目的仅供大家学习与参考,如无意中侵犯您的合法权益,请联系本站管理员进行删除处理!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

浙ICP备19022368号-1|Archiver|手机版|IT学习站-137zw.com

GMT+8, 2020-7-10 23:38 , Processed in 0.319256 second(s), 33 queries .

快速回复 返回顶部 返回列表