范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

新来个技术总监,把限流实现的那叫一个优雅,佩服

  在电商高并发场景下,我们经常会使用一些常用方法,去应对流量高峰,比如限流、熔断、降级,今天我们聊聊限流。
  什么是限流呢?限流是限制到达系统的并发请求数量,保证系统能够正常响应部分用户请求,而对于超过限制的流量,则通过拒绝服务的方式保证整体系统的可用性。
  根据限流作用范围,可以分为单机限流和分布式限流;根据限流方式,又分为计数器、滑动窗口、漏桶限令牌桶限流,下面我们对这块详细进行讲解。常用限流方式计数器
  计数器是一种最简单限流算法,其原理就是:在一段时间间隔内,对请求进行计数,与阀值进行比较判断是否需要限流,一旦到了时间临界点,将计数器清零。
  这个就像你去坐车一样,车厢规定了多少个位置,满了就不让上车了,不然就是超载了,被交警叔叔抓到了就要罚款的,如果我们的系统那就不是罚款的事情了,可能直接崩掉了。
  程序执行逻辑:可以在程序中设置一个变量 count,当过来一个请求我就将这个数 +1,同时记录请求时间。当下一个请求来的时候判断 count 的计数值是否超过设定的频次,以及当前请求的时间和第一次请求时间是否在 1 分钟内。如果在 1 分钟内并且超过设定的频次则证明请求过多,后面的请求就拒绝掉。如果该请求与第一个请求的间隔时间大于计数周期,且 count 值还在限流范围内,就重置 count。
  那么问题来了,如果有个需求对于某个接口 /query 每分钟最多允许访问 200 次,假设有个用户在第 59 秒的最后几毫秒瞬间发送 200 个请求,当 59 秒结束后 Counter 清零了,他在下一秒的时候又发送 200 个请求。
  那么在 1 秒钟内这个用户发送了 2 倍的请求,这个是符合我们的设计逻辑的,这也是计数器方法的设计缺陷,系统可能会承受恶意用户的大量请求,甚至击穿系统。这种方法虽然简单,但也有个大问题就是没有很好的处理单位时间的边界。
  不过说实话,这个计数引用了锁,在高并发场景,这个方式可能不太实用,我建议将锁去掉,然后将 l.count++ 的逻辑通过原子计数处理,这样就可以保证 l.count 自增时不会被多个线程同时执行,即通过原子计数的方式实现限流。
  为了不影响阅读,代码详见:github.com/lml20070115…滑动窗口
  滑动窗口是针对计数器存在的临界点缺陷,所谓滑动窗口(Sliding window)是一种流量控制技术,这个词出现在 TCP 协议中。滑动窗口把固定时间片进行划分,并且随着时间的流逝,进行移动,固定数量的可以移动的格子,进行计数并判断阀值。
  上图中我们用红色的虚线代表一个时间窗口(一分钟),每个时间窗口有 6 个格子,每个格子是 10 秒钟。每过 10 秒钟时间窗口向右移动一格,可以看红色箭头的方向。我们为每个格子都设置一个独立的计数器 Counter,假如一个请求在 0:45 访问了那么我们将第五个格子的计数器 +1(也是就是 0:40~0:50),在判断限流的时候需要把所有格子的计数加起来和设定的频次进行比较即可。
  那么滑动窗口如何解决我们上面遇到的问题呢?来看下面的图:
  当用户在 0:59 秒钟发送了 200 个请求就会被第六个格子的计数器记录 +200,当下一秒的时候时间窗口向右移动了一个,此时计数器已经记录了该用户发送的 200 个请求,所以再发送的话就会触发限流,则拒绝新的请求。
  其实计数器就是滑动窗口啊,只不过只有一个格子而已,所以想让限流做的更精确只需要划分更多的格子就可以了,为了更精确我们也不知道到底该设置多少个格子,格子的数量影响着滑动窗口算法的精度,依然有时间片的概念,无法根本解决临界点问题。
  为了不影响阅读,代码详见:github.com/RussellLuo/…漏桶
  漏桶算法(Leaky Bucket),原理就是一个固定容量的漏桶,按照固定速率流出水滴。
  用过水龙头都知道,打开龙头开关水就会流下滴到水桶里,而漏桶指的是水桶下面有个漏洞可以出水,如果水龙头开的特别大那么水流速就会过大,这样就可能导致水桶的水满了然后溢出。
  图片如果看不清,可单击图片并放大。
  一个固定容量的桶,有水流进来,也有水流出去。对于流进来的水来说,我们无法预计一共有多少水会流进来,也无法预计水流的速度。但是对于流出去的水来说,这个桶可以固定水流出的速率(处理速度),从而达到流量整形和流量控制的效果。
  漏桶算法有以下特点:漏桶具有固定容量,出水速率是固定常量(流出请求)如果桶是空的,则不需流出水滴可以以任意速率流入水滴到漏桶(流入请求)如果流入水滴超出了桶的容量,则流入的水滴溢出(新请求被拒绝)
  漏桶限制的是常量流出速率(即流出速率是一个固定常量值),所以最大的速率就是出水的速率,不能出现突发流量。
  为了不影响阅读,代码详见:github.com/lml20070115…令牌桶
  令牌桶算法(Token Bucket)是网络流量整形(Traffic Shaping)和速率限制(Rate Limiting)中最常使用的一种算法。典型情况下,令牌桶算法用来控制发送到网络上的数据的数目,并允许突发数据的发送。
  图片如果看不清,可单击图片并放大。
  我们有一个固定的桶,桶里存放着令牌(token)。一开始桶是空的,系统按固定的时间(rate)往桶里添加令牌,直到桶里的令牌数满,多余的请求会被丢弃。当请求来的时候,从桶里移除一个令牌,如果桶是空的则拒绝请求或者阻塞。
  令牌桶有以下特点:令牌按固定的速率被放入令牌桶中桶中最多存放 B 个令牌,当桶满时,新添加的令牌被丢弃或拒绝如果桶中的令牌不足 N 个,则不会删除令牌,且请求将被限流(丢弃或阻塞等待)
  令牌桶限制的是平均流入速率(允许突发请求,只要有令牌就可以处理,支持一次拿3个令牌,4个令牌...),并允许一定程度突发流量,所以也是非常常用的限流算法。
  为了不影响阅读,代码详见:github.com/lml20070115…Redis + Lua 分布式限流
  单机版限流仅能保护自身节点,但无法保护应用依赖的各种服务,并且在进行节点扩容、缩容时也无法准确控制整个服务的请求限制。
  而分布式限流,以集群为维度,可以方便的控制这个集群的请求限制,从而保护下游依赖的各种服务资源。
  分布式限流最关键的是要将限流服务做成原子化,我们可以借助 Redis 的计数器,Lua 执行的原子性,进行分布式限流,大致的 Lua 脚本代码如下:local key = "rate.limit:" .. KEYS[1] --限流KEY local limit = tonumber(ARGV[1])        --限流大小 local current = tonumber(redis.call("get", key) or "0") if current + 1 > limit then --如果超出限流大小   return 0 else  --请求数+1,并设置1秒过期   redis.call("INCRBY", key,"1")    redis.call("expire", key,"1")    return current + 1 end 复制代码
  限流逻辑(Java 语言):public static boolean accquire() throws IOException, URISyntaxException {     Jedis jedis = new Jedis("127.0.0.1");     File luaFile = new File(RedisLimitRateWithLUA.class.getResource("/").toURI().getPath() + "limit.lua");     String luaScript = FileUtils.readFileToString(luaFile);      String key = "ip:" + System.currentTimeMillis()/1000; // 当前秒     String limit = "5"; // 最大限制     List keys = new ArrayList();     keys.add(key);     List args = new ArrayList();     args.add(limit);     Long result = (Long)(jedis.eval(luaScript, keys, args)); // 执行lua脚本,传入参数     return result == 1; } 复制代码聊聊其它
  上面的限流方式,主要是针对服务器进行限流,我们也可以对容器进行限流,比如 Tomcat、Nginx 等限流手段。
  Tomcat 可以设置最大线程数(maxThreads),当并发超过最大线程数会排队等待执行;而 Nginx 提供了两种限流手段:一是控制速率,二是控制并发连接数。
  对于 Java 语言,我们其实有相关的限流组件,比如大家常用的 RateLimiter,其实就是基于令牌桶算法,大家知道为什么唯独选用令牌桶么?
  对于 Go 语言,也有该语言特定的限流方式,比如可以通过 channel 实现并发控制限流,也支持第三方库 httpserver 实现限流,详见这篇 《Go 限流的常见方法》。
  在实际的限流场景中,我们也可以控制单个 IP、城市、渠道、设备 id、用户 id 等在一定时间内发送的请求数;如果是开放平台,需要为每个 appkey 设置独立的访问速率规则。限流对比
  下面我们就对常用的线程策略,总结它们的优缺点,便于以后选型。
  计数器:优点:固定时间段计数,实现简单,适用不太精准的场景;缺点:对边界没有很好处理,导致限流不能精准控制。
  滑动窗口:优点:将固定时间段分块,时间比"计数器"复杂,适用于稍微精准的场景;缺点:实现稍微复杂,还是不能彻底解决"计数器"存在的边界问题。
  漏桶:优点:可以很好的控制消费频率;缺点:实现稍微复杂,单位时间内,不能多消费,感觉不太灵活。
  令牌桶:优点:可以解决"漏桶"不能灵活消费的问题,又能避免过渡消费,强烈推荐;缺点:实现稍微复杂,其它缺点没有想到。
  Redis + Lua 分布式限流:优点:支持分布式限流,有效保护下游依赖的服务资源;缺点:依赖 Redis,对边界没有很好处理,导致限流不能精准控制。
  作者:楼仔
  链接:https://juejin.cn/post/7145435951899574302

太原深处的青藏高原九寨沟桂林滇池不用走远看遍全国的秋今年的的防控举措异常严密,你的旅行被打乱了吗?爱旅行的你,一定心痒难耐,哪里也去不了,不过为了全国防控大局,舍小家为大家,还是暂缓出行为好。为了安抚一颗不能远足旅行的心,推荐你几个城口开往亢家寨却误入大巴山深处,意外发现3处绝美风光不输景区秋日生活打卡季来到城口的第二天一早醒来,人还在迷蒙之中就听到外面雨点滴滴哒哒的声音,心头一阵凄苦,看来这一趟的城口之旅,怕是都要在雨中度过了,原本计划的今天前往亢谷景区,晚上前往黄骑行甘南火车托运受损认赔,雷音寺落荒而逃,黄河三峡风光真美终于开始整理我的甘南骑行游记了,乡巴佬式的激动又开始了。每次写长途骑行时都是这样,就像前几年骑行318川藏线晋陕黄河大峡谷秦岭环线后,我在整理图片笔记时就像重走了一样的兴奋,如几个金九银十风光不在,钢材步入冬季后应该如何应对市场趋势核心观点金九银十不在,钢材步入冬季后应该如何应对市场趋势宏观信息国际局势上美国及欧盟的CPI数据仍维持上扬,变化在于上周五美联储突然释放鸽派发言有减缓加息的言论,该消息给了市场一定川藏线上康巴第一关翻死人的折多山折多山,远处的贡嘎群峰白雪皑皑(角度没拍好,看得不是特别清晰)折多山位于四川省甘孜州境内,海拔4298米,是康巴第一关,位于川藏318国道线上,自驾或骑行都会经过此地,是318国道新疆AAAAA级景区之帕米尔高原秋冬新疆帕米尔旅游风景区位于喀什塔什克尔干塔吉克自治县!2019年12月入选国家5A旅游景区!帕米尔是塔吉克语世界屋脊的意思!拥有许多高峰也是亚洲大陆南部和中部地区主要山脉的汇集处白癜风光疗使用紫外线光疗仪经典问答1。使用紫外线光疗仪照射距离多大?一般35。2。对于照射后变黑的皮肤,多久可以恢复呢?一般是23个月,但也有个体差异。3。在光照之后,皮肤非常痒怎么办?光照后皮肤会干,通常是因为皮川藏线上的穷游女,各个长相漂亮,司机却避而远之?真相来了虽然旅游是一个消耗钱财和时间的过程,但在旅途中可以开阔视野增长见识。身临其境地感受自然的鬼斧神工,亲眼目睹历史遗留的名胜古迹,行万里路的同时也能放松心情并陶冶情操。尤其是在生活节奏银杏吃对才是宝过了赏银杏这个最具诗意的时节后,很多市民还喜欢采摘或捡走银杏果食用。银杏果,又称白果,从中医讲,白果性平,味甘苦涩,归肺肾经。功效有温肺定喘,缩小便,止白带。多用于治疗咳嗽痰多带下千年古刹银杏黄来源晋城市人民政府晋城动态又是一年寒霜降,千年古刹银杏黄。近日,千年古刹青莲寺的两株银杏树的叶儿一片金黄,迎来了不少游客和摄影爱好者。张少毅摄创建于北齐天保年间(公元550年)的青广东队损失惨重!杜润旺被驱逐,赵睿伤退,跟队记者透露赵睿伤情疆粤大战,新疆男篮主场对决广东男篮!两队的核心阿布都沙拉木和易建联复出,同时齐麟和任骏飞因伤缺阵!第一节广东队3018领先新疆队12分球!广东队的准备非常充分,他们限制住了法尔,易
四外援踢不过单外援?又一支山东队,陈洋该下课了,冠军几无悬念北京时间9月20日,中超第16轮补赛,长春亚泰主场对决武汉三镇!亚泰目前为止的表现无疑是让队迷失望的,拥有五名外援的他们,15轮仅仅取得四场胜利,排名仅仅在第十一位。此役对上领头羊放弃恶念,才能成为一个真正的好人吗?(一)读了一本书,名字叫停止讨好。读了感触颇深,这本书一共是221页。我会用读后感的形式,为你讲述书中精髓,读书后感的篇章比较长,我会用两大篇章来讲述这本书的精髓,本文是第一篇章。我们的夜读组诗向边关(80)金色秋光金色秋光秋闪着金光走来让大漠雪山蓝天碧波中的迷彩浸染一片恢宏一片嘹亮一片新天地泛出四季的高光牵引钢铁与骨骼撞击的声响涌动着战位阵地万千雷霆迷彩沉寂血液轰鸣旗帜在引领在冲锋在呐喊在淬继姆巴佩合同曝光后,巴黎人报再揭梅西与内马尔的合同就在透露法国球星姆巴佩的巨额合同几个小时后,巴黎人报还透露了其在巴黎的两位世界级巨星队友梅西和内马尔的合同细节。毋庸置疑的是,巴黎的这三位球员都在世界收入最高的足球运动员的前十名榜罗纳尔多不想看到梅西举起世界杯,即使他是值得的巴西前国脚罗纳尔多在2022年世界杯前夕接受英国媒体采访时表示,他不希望看到梅西最终与阿根廷国家队一起赢得卡塔尔世界杯,他承认,由于梅西的国家阿根廷和巴西之间的竞争关系,他甚至不想拉斐尔瓦拉内在世界杯前不会再为曼联出场了拉斐尔瓦拉内的伤势并没有最初担心的那么严重,消息人士告诉ESPN,这名后卫将缺席三到四周,但他不会在世界杯前再次为曼联出场。29岁的瓦拉内在周六11战平切尔西的英超比赛中受伤离场,张元英同款胎毛刘海,有了它谁还去植发呀爱豆的打歌舞台上,总是会涌现出最新的趋势,亮片眼影仙子毛睫毛彩色挑染,我们都能在舞台上找到他们的踪迹。最近,爱豆的发型又被化妆师玩儿出了新花样,胎毛刘海在女爱豆们之间悄悄流行起来,前国足队长豪宅1。29亿卖出!林子祥夫妇买下,郜林净赚九千万想必熟悉国足的人对郜林这个名字一定很熟悉,他在球场上司职前锋,曾经是中国国家足球队的队长,如今在深圳足球俱乐部效力。最近郜林因为卖掉自己的豪宅而再次走进了大家的视线,这究竟是怎么一跨越十年,看安徽如何铸造硬核创新力合肥先进计算中心巢湖明月外景。记者程兆摄当今世界,创新是引领发展的第一动力。谁下好创新这步先手棋,谁就能占领先机赢得主动。党的十八大以来,以习近平同志为核心的党中央高度重视科技创新诺拜家最热门的陈年酒香香水丨诺拜1942鲁德诺拜1942鲁德Nobile1942RudisProfumo前调葡萄干果香柠檬中调雪松玫瑰藏红花天竺葵康乃馨后调皮革焚香不凋花香根草广藿香麝香前调微酸的香柠檬与藏红花葡萄酒(这里的斯波洛瑞首战表现不会让我们恐慌希望阿德巴约继续出手直播吧10月22日讯今天,热火将对阵凯尔特人。在赛前接受采访时,主帅斯波被问及了洛瑞首战的糟糕表现,对此斯波这样说道赛季只打了一场难道就会出现恐慌?我们知道他能为我们带来什么,他是