访问频率限制——桶相关算法

其实业务被攻击过一次之后,我就概览过限流算法一次,当时发现所用的库主要是利用了Golang现成的标准库来做的,没很深入继续研究下去。
前几周回头看这个问题,发现这个库的Readme赫然写着“以前的版本弄错啦,根本提供不了之前说的那些功能, 大家赶紧改改吧”。顿时心里一惊,决定这次抽空好好研究一下。

简单点说,常用的限流算法有两种:令牌桶(token bucket)和漏桶(leaky bucket)。
漏桶:比较像街边小摊的叫号,甭管排了多少人,只能隔一小段时间买一次商品
令牌桶:比较像餐馆的叫号,本来餐馆有一定的容量, 填满之前,顾客都可以进,填满之后,就跟漏桶差不多了。

一般情况下,令牌桶就够用了。你可以定义最初有多少个令牌(burst),并且定义令牌增加的频率(每秒多少个),每次请求来的时候看有没有令牌可用。Golang库里一个好的实现是tollbooth,除了实现限流算法外,还附带了很多方便的方法取ip,header域等。另外,要说明一点,虽然令牌桶算法是一定时间放一个令牌,但是实现的时候,并不需要新开一个goroutine去隔一段时间增加计数(事实上,用户量很小的情况下,完全可以这么做,见官方例子),而是逻辑上计算时间差对应的令牌差额即可,详细可见golang.org/x/time/rate的实现,对CPU和Memory非常友好,所以不用担心并发量大了要怎么办。

不过,上述包里的令牌桶算法有几个限制:

  1. 从写法上看,频率规则必须是以秒为单位。其实他们都会转化成令牌增加速度。例如,1秒10次,那么逻辑上令牌桶里面每0.1秒会增加一个令牌(除非已经满了)。你当然可以设置成1分钟60次,但最终都会转化成1秒1次。
  2. 从定义上可以看出,它并不能精确限制每个时间单位的个数。例如,定义桶里3个令牌, 每秒新增2个令牌, 那么一秒内(闭区间的话,意味着首尾跨越了一个间隔),可能有2(0 + 2,对应开始时是空桶)到 5(3 + 2, 对应开始时是满桶)个令牌,设定值时,需要注意这点。

有点迷糊?不要慌,下面举个栗子。比如,需要实现“每分钟60个请求”,可能令牌桶并不能特别好的胜任。 假设桶满是20个(相当于一个buffer), 每分钟新增40, 那么就是60个了。但是,爆发的最大值(几乎同一时刻请求)其实达不到60, 因为桶最多就20。同时,如果桶空了,其后的一分钟最多只能接受40个请求。
所以, 爆发值太大,会造成每分钟的请求限制抖动很大。爆发值设置太小,又可能扛不住突然的大量访问。

这该如何是好?下面要讲的东西还有一些,那就下回分解吧。


更新:
重读文章的时候发现之前的理解有误。

对于每分钟60次这样的限制,其实就是设置每秒1次的速率即可。桶大小(Burst)只是用来处理突发的大请求的,即最多一次处理满桶那么多请求。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,470评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,393评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,577评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,176评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,189评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,155评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,041评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,903评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,319评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,539评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,703评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,417评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,013评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,664评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,818评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,711评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,601评论 2 353

推荐阅读更多精彩内容

  • 一、写在最前 轰轰烈烈的双十二已经过去小半个月了,程序猿的我坐在办公桌上思考,双十二这么大的访问量,这群电商是怎么...
    爱情小傻蛋阅读 7,919评论 0 13
  • 摘要:在开发高并发系统时有三把利器用来保护系统:缓存、降级和限流。而有些场景并不能用缓存和降级来解决,因此需有一种...
    落羽成霜丶阅读 2,151评论 0 18
  • 最近一直都在研究压力测试客户端的问题,如果突破客户端压力测试线程,端口等问题,如果服务器端处理网络请求处理不过来,...
    望月成三人阅读 8,642评论 1 25
  • 聊聊高并发系统限流特技-1来自开涛的博客 在开发高并发系统时有三把利器用来保护系统:缓存、降级和限流。缓存的目的是...
    meng_philip123阅读 6,634评论 1 20
  • 三十立什么? 三十岁的人,应该能依靠自己的本领独立承担起自己应承受的责任,并已经确定自己的人生目标与发展方向。简单...
    小叶榕阅读 531评论 0 0