常见的限流算法

限流的作用:

应对

1.热点业务带来的突发请求

2.调用方 bug 导致的突发请求

3.恶意攻击的请求

常见的限流算法有

1)固定窗口计数器:将时间划分为多个窗口;在每个窗口内每有一次请求就讲计数器+1;如果计数器超过了限制的数量,则本窗口内所有的请求都被丢弃,当时间到达下一个窗口时,计数器重置。

算法问题:会让通过请求量是允许量的两倍。

2)滑动窗口计数器:将时间划分为多个区间;在每个区间没有一次请求就将计数器+1维持一个时间窗口,占据多个区间;每经过一个区间时间,则抛弃最老的一个区间,并纳入最新的一个区间;如果当前窗口内区间的请求技术总和超过了限制的数量,则本窗口内所有的请求都被丢弃。

问题:滑动窗口计数器是通过将窗口再细分,并且按照时间"滑动",这种算法避免了固定窗口计数器带来的双倍突发请求,但时间区间的精度越高,算法需要的空间容量越大。

3)漏桶算法:将每个请求看做'水滴'放入'漏桶' 进行存储;'漏桶'以固定的速率向外'漏'出请求来执行,如果'漏桶'空了则停止'漏水';如果'漏桶'满了则多余的'水滴'会被直接丢弃;

漏桶算法多使用消息队列实现,服务的请求会存到队列中,服务的提供方按照固定的速度从队列中去除请求并执行,过多的请求则放在队列中排队或者直接拒绝。

漏桶算的缺点是,当短时间内有大量的突发请求时,即便此时服务器没有任何负载,每个请求也得再队列中等待一段时间才能被响应。

4)令牌桶:令牌以固定的速率生成;生成的令牌放入令牌桶中存放,如果令牌桶满了则多余的令牌会被直接丢弃,当请求到达时,会尝试从令牌桶中取令牌,取到了令牌的请求可以执行;如果桶空了,那么尝试取令牌的请求 会被直接丢弃。

令牌桶算法就能够将所有 的请求平均分不到时间区间内,又能接受服务器能够承受范围内的突发请求,一次是目前使用广泛的一种限流算法。


开源的限流项目:

Google 的开源项目 guava 提供了 RateLimiter 类,实现了单点的令牌桶限流。


限流策略:多维防护+纵身防御

常见的三种:限制请求数,限制并发连接数 (请求频率),限制传输速度(请求体积)


各层级限流:

全局统一接入:

google 叫 GFE,baidu 是BFE,jd 叫 GFE,这类产品会将公司所有对外流量进行统计的接入呵呵调度,同时具备较强的通用防护能力,比如抗 D,WAF等。


熔断:

熔断的本质是一个过载保护机制。互联网系统中通常是:当下游服务因为访问压力过大而响应变慢或者失败,上游服务为了保护自己以及系统整体的可用性,可以暂时切断对下游服务的调用。

熔断的思路:

中心思想:量力而行。没有奇迹会发生,什么样的性能撑多少流量是固定的。

四个步骤:

1.定一个识别是否处于"不可用"状态的策略;

2.切断联系

3.定义一个识别是否处于'可用'状态的策略,并尝试探测;

4.重新恢复正常

如何识别是否处于不正常的策略:

1.是不是能调通

2.如果能够调通,耗时是不是超过预期的长

由于网络并不是100%的可靠,所以不能将瞬时异常等同于系统不可用。

如何解决这个问题呢:时间窗口,在某个时间段内 的情况

比如:

阈值:在10s 内出现100次无法连接或者出现大于100次大于5s 的请求

百分比:在10s 内有30%的请求无法连接或者30%的请求大 于5s。


切断联系:

切断联系要尽可能的果断,既然已经认定了对方不可用,那么索性默认失败,避免作无用功,也可以缓解对方的压力。


定义一个识别是否处于可用的状态的策略,并尝试探测

切断联系后,功能的完整性必然会受到影响,所以还是要尽快恢复回来,以提供完整的服务能力。如何自动的识别依赖系统是否可用呢。可以考虑的策略如下:

一般来说 这个策略与识别不可用的策略类似,是个反向指标:

 阈值。比如,在 10 秒内出现 100 次“调用成功”并且耗时都小于 1 秒。

百分比。比如,在 10 秒内有 95% 请求“调用成功”并且 98% 的请求小于 1 秒。

但是验证可用是个复杂的过程:

1.按照一定的比例流量去验证;

2.如果在整个通信框架都是统一的情况下,可以统一给每个系统增加一个专门用于验证程序健康状态的检测的独立接口。这个接口额外可以多返回一些系统负载信息用于判断健康状态,如 CPU、I/O 的情况等。

重新恢复正常

一旦通过了衡量可否可用的验证,整个系统就恢复了正常的状态。重新开启不可用策略。这样整体就是一个循环。


做熔断的最佳实践

什么场景最适合做熔断

一个事物在不同的场景里会发挥出不同的效果。以下是我能想到最适合熔断发挥更大优势的几个场景:

• 所依赖的系统本身是一个共享系统,当前客户端只是其中的一个客户端。这是因为,如果其它客户端进行胡乱调用也会影响到你的调用。

• 所以依赖的系统被部署在一个共享环境中(资源未做隔离),并不独占使用。比如,和某个高负荷的数据库在同一台服务器上。

• 所依赖的系统是一个经常会迭代更新的服务。这点也意味着,越“敏捷”的系统越需要“熔断”。

• 当前所在的系统流量大小是不确定的。比如,一个电商网站的流量波动会很大,你能抗住突增的流量不代表所依赖的后端系统也能抗住。这点也反映出了我们在软件设计中带着“面向怀疑”的心态的重要性。


需要注意的地方:

1.依赖系统的个别节点异常不等于所有的节点异常

2.熔断是最后的选择,优先使用降级或者限流的方案。因为'部分胜于无',虽然无法提供完整的服务,但尽可能的降低影响。比如,抛弃非核心业务,友好提示等;

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

推荐阅读更多精彩内容

  • 1、令牌桶算法令牌桶算法是比较常见的限流算法之一,大概描述如下:1)、所有的请求在处理之前都需要拿到一个可用的令牌...
    kevin0016阅读 5,931评论 1 6
  • 缓存 缓存比较好理解,在大型高并发系统中,如果没有缓存数据库将分分钟被爆,系统也会瞬间瘫痪。使用缓存不单单能够提升...
    阿斯蒂芬2阅读 12,121评论 1 28
  • 摘要:在开发高并发系统时有三把利器用来保护系统:缓存、降级和限流。而有些场景并不能用缓存和降级来解决,因此需有一种...
    落羽成霜丶阅读 2,147评论 0 18
  • 如果有一天我突然结婚了,绝对是因为我够不着裙子背后的拉链以及深夜我总是饿。 虽然深知即使以后结婚了也躲不开这些琐事...
    兠哥没有安全感阅读 119评论 0 0
  • 入梦的,带不走 初醒的,看不透 重逢前,临别后 拨雪寻春,烧灯续昼 长行的,不停留 归来的,飘零久 此生葬风波,还...
    42b9e5dca292阅读 123评论 0 0