|
马上注册玉林红豆网会员,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
单位时间按照一定速率匀速的生产放入桶内,直到达到桶容量上限。处理请求,每次尝试获取一个或多个令牌,如果拿到则处理请求,失败则拒绝请求。[url=http:///www.wangsu.com/]cdn[/url]的相关问题可以到网站了解下,我们是业内领域专业的平台,您如果有需要可以咨询,相信可以帮到您,值得您的信赖![align=center][/align]
本文转载自微信「微服务践」,作者欧阳安。转载本文请联系微服务践。
上篇文章提到固定时间窗口限流法处理突然请求洪峰情况,本文讲述的令牌桶线路算法则可以比较好的处理此场景。
工作原理
单位时间按照一定速率匀速的生产放入桶内,直到达到桶容量上限。
处理请求,每次尝试获取一个或多个令牌,如果拿到则处理请求,失败则拒绝请求。
优缺点
优点
可以有效处理瞬间的突发流量,桶内存量即可作为流量缓冲区平滑处理突发流量。
缺点
现较为复杂。
代码现
分布式环境下考虑使用作为桶和令牌的存储容器,采用脚本现整个算法流程。
脚本
--每秒生成数量即生成速度=(ARGV[1])--桶容量=(ARGV[2])--当前时间戳=(ARGV[])--当前请求数量=(ARGV[4])--需要多少秒才能填满桶_=--向下取整,为填满时间的2倍=(_*2)--当前时间桶容量_=((,KEYS[1]))--如果当前桶容量为0,说明是第一次进入,则默认容量为桶的最大容量_==_=--上一次刷新的时间_=((,KEYS[2]))--第一次进入则设置刷新时间为0_==_=0--距离上次请求的时间跨度=(0,-_)--距离上次请求的时间跨度,总共能生产的数量,如果超多最大容量则丢弃多余的_=(,_+(*))--本次请求数量是否足够=_=--桶剩余数量_=_--允许本次申请,计算剩余数量_=_---设置剩余数量(,KEYS[1],,_)--设置刷新时间(,KEYS[2],,)
令牌桶限流器定义
TL{每秒生产速率桶容量存储容器*RK桶刷新时间KLM健康标识A2故障时采用进程内令牌桶限流器L*L监控探测任务标识S}NTL(,,*R,)*TL{K:=S(F,)K:=S(F,)TL{:,:,:,K:K,K:K,A:1,L:NL(E(SD()),),}}
获取令牌
(*TL)N(T,){判断是否健康故障时采用进程内限流器兜底保障LU2(A)==0{LAN(,)}执行脚本获取令牌,:=E(,[]{K,K,},[]{I(),I(),FI(U(),10),I(),})==L-N特殊处理不存在的情况==N{}!={E(:%,-,)执行异常,开启健康探测任务同时采用进程内限流器作为兜底M()LAN(,)},:=(64)!{E(:%,-,)M()LAN(,)}==L-1==1}
故障时兜底策略
兜底策略的设计考虑得非常细节,当不可用的时候,启动单机版的做备用限流,确保基本的限流可用,服务不会被冲垮。
开启健康探测(*TL)M(){LL()LU()防止重复开启S{}设置任务和健康标识S=SU2(A,0)健康探测FR()}健康探测定时任务(*TL)FR(){:=NT(I)健康探测成功时回调此函数(){S()LL()S=LU()}()C{属于内置健康探测命令P(){健康探测成功,设置健康标识SU2(A,1)}}}
项目地址
-
欢迎使用-并支持我们! |
|