玉林社区   吃喝玩乐购   说说Go 分布式令牌桶限流 + 兜底保障
返回列表
查看: 370|回复: 0

说说Go 分布式令牌桶限流 + 兜底保障

[复制链接]

2万

主题

3万

帖子

10万

积分

论坛元老

Rank: 8Rank: 8

积分
100249
发表于 2022-2-23 10:48:00 | 显示全部楼层 |阅读模式

马上注册玉林红豆网会员,结交更多好友,享用更多功能,让你轻松玩转社区。

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

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)}}}
项目地址
-


欢迎使用-并支持我们!
回复

使用道具 举报

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

收藏:1 | 帖子:8万



侵权举报:本页面所涉内容均为用户发表并上传,岭南都会网仅提供存储服务,岭南都会网不承担相应的法律责任;如存在侵权问题,请权利人与岭南都会网联系删除!