前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Sentinel漏桶匀速限流

Sentinel漏桶匀速限流

作者头像
瓜农老梁
发布2020-11-11 11:11:30
1.4K0
发布2020-11-11 11:11:30
举报
文章被收录于专栏:瓜农老梁瓜农老梁

前言

本文接着聊Sentinel的QPS流控效果基于漏桶算法的排队等待模式,Sentinel排队等待为什么只支持QPS在1000以下?另外,Sentinel在新版版中还提供了一种预热+等待的模式,这种模式执行逻辑是怎么样的?

一、漏桶算法含义

漏桶算法(Leaky Bucket):随机突发流量通过漏桶后以稳定的速率流出,起到流量控制和平滑作用,如下图所示。

二、排队等待模式

Sentinel中的排队等待由RateLimiterController实现,通过控制请求通过的时间间隔来实现达到匀速的目的。

代码逻辑 @1 计算请求通过的间隔时间 假如设置的阈值为count=100即每秒允许100个请求,每次通过一个请求acquireCount=1,套入公式costTime=10。即两次请求的时间间隔为10秒 @2 计算这次请求通过的预期时间=上次请求通过的时间+时间间隔 @3 当前时间大于预期时间,则允许通过并更新上次请求时间戳 @4 当前时间小于预期时间,则需要等待;计算需要等待的时间 @5 需要等待的时间大于超时时间则拒绝,默认超时时间为500毫秒 @6 再算一遍等待时间,算法跟第4步一样,并再次判断是否超过等待时间 @7 线程sleep等待时间后允许请求通过

三、匀速模式局限

Sentinel等待模式为什么只支持1000以内QPS?文章开头提出的问题。下面看下时间间隔计算公式,每次通过一个请求acquireCount=1。

代码语言:javascript
复制
long costTime = Math.round(1.0 * (acquireCount) / count * 1000);

下个请求的预期通过时间为:

代码语言:javascript
复制
long expectedTime = costTime + latestPassedTime.get();

随着阈值count即一秒期望通过的请求数,下面观察随着阈值的变化,时间间隔变化情况。

count

costTime

expectedTime

100

10

latestPassedTime.get() + 10

1000

1

latestPassedTime.get() + 1

2000

1

latestPassedTime.get() + 1

3000

0

latestPassedTime.get() + 0

10000

0

latestPassedTime.get() + 0

由上表看出阈值count大于1000小于2000,时间间隔一致为1毫秒,而大于2000后,时间间隔则掉为0,即后面的所有判断将失效。因此Sentinel提供的匀速器只支持QPS在1000以内的请求场景。

四、预热模式+排队等待

Sentinel还提供一种预热+排队等待相结合的限流模式,也就是令牌桶和漏桶相结合的模式,示意图如下:请求的通过需要从令牌桶中获取令牌,获取令牌的流量需要经过漏桶匀速通过。

源码分析

备注 整体可以分配两个部分,上部分基于令牌桶计算部分,下部分基于漏桶计算部分。

@1 warningToken令牌桶中的一个阈值,超过该值时开启预热 @2 小于warningToken不开启预热,根据阈值计算下个请求通过时距离上个请求的时间间隔 @3 warmingQps根据斜率计算出预热时的Qps @4 计算预热时下个请求通过时距离上个请求的时间间隔 @5 这部分与上面匀速排队逻辑一致

小结:预热模式+排队等待模式比单纯的预热模式,在请求通过是增加了请求之间时间间隔的判断;相比单纯的排队模式,在时间间隔上更加灵活,根据预热时的Qps计算时间间隔。

作者丨梁勇 来源丨瓜农老梁

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-11-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 瓜农老梁 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档