幼儿饰品瑜伽美体用品微软
投稿投诉
微软创意
爱情通信
用品婚姻
爱好看病
美体软件
影音星座
瑜伽周边
星座办公
饰品塑形
搞笑减肥
幼儿两性
智家潮品

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

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

荣誉虽迟必到!中国选手3天递补5枚奥运奖牌没奥运但中国队迎来夺牌狂潮,中国选手已有望递补获得2金1银2铜,共5枚奥运奖牌。所以我们中国的运动员都是干干净净的比赛、干干净净的拿牌,祝贺!!!3月21日,据国际田联官……强大到你想不到帕尔马历史最佳阵容帕尔马俱乐部成立于1913年7月,原名威尔第足球俱乐部(VerdiFootballClub),以一位出生于帕尔马的作曲家威尔第的名字命名而成立足球俱乐部。成立后,帕尔马长期屈居……哈利波特手游有被狠狠狙击到心动点!大数据已经牢记你的喜好啦每一位《哈利波特:魔法觉醒》的玩家们在日常生活中都多多少少会刷一些好玩有趣的同人作品!从画作,文字再到视频,粉丝们都在不断为爱发电!如今,在网络上也已经展出了非常多的优秀作品,……潋滟沉香锁玉台,婀娜淡雅梦魂猜潋滟沉香锁玉台,婀娜淡雅梦魂猜。锦饰品气红芳诱,引得娇媚几徘徊。一缕藤蔓几花开,拂意融融恋香来。秋梦渐进剪落红,凝眸霜雨落青苔。……在滇央企上市在即作者:小杰近日,证监会同意了昆船智能技术股份有限公司拟在深圳证券交易所创业板IPO注册申请,我省上市公司有望再添1家。近年来,该公司营业收入、净利润虽保持增长,但增……蔡姓顶流基金经理本周失联?诺安基金及蔡嵩松最新回应来了,但仍21世纪经济报道记者李域深圳报道9月20日晚间,一则蔡姓顶流基金经理本周失联的传闻在行业内持续发酵。传言称,蔡姓顶流基金经理本周失联,同一公司的另一基金经理近日被刑……朋友圈日常简短文案1、臂事少心情好。2、和考试和解。3、别管了千玺说好看所以就发了。4、陈让说:笑一个吧。5、还会一起吹风吗。6、把负面情绪调成静音模式。7、……11中4!不传球!火箭落选秀抢风头引不满,29号秀成新希望北京时间7月15日,2022年NBA夏季联赛进行到了第六个比赛日,今天火箭队迎来了自己夏季联赛的第四个对手开拓者队,最终经过了四节的较量,火箭最终以7785输给了开拓者,遭遇到……马来西亚这座岛什么来头?每天限制50人上岛,上岛还需要军队护时间过得真快,一眨眼疫情已经持续两年了,相信大部分的国人都没有走出国门去旅游度假吧。没事,据说今天疫情会好转,大家也将有机会走出去看一看,玩一玩。对于出境游,除了大家都喜欢的购……1300W白金电源实测RTX4090显卡850W电源瑟瑟发抖RTX4090全面解禁了,公版卡与各大AIC厂商的非公版卡都已亮相。整体性能强出预期,黑科技DLSS3确实强,但体积尺寸前所未有的大只,电表还跟着倒转。其实自发布那一刻起……蒂特无法想象在内马尔身上发生的事情,这可能让球员无缘世界杯直播吧9月28日讯世界杯前最后一场友谊赛,巴西以51的比分大胜突尼斯。赛后,巴西主帅蒂特发表了自己的看法。蒂特说道:我们处在大部分球迷都来自突尼斯的环境下。在某个时刻,我……超级计算机预测韩国球迷最喜欢的球队!托特纳姆热刺竟是第4预测,通过SonSasional孙兴慜(26岁)成为韩国球迷最喜欢的球队的托特纳姆热刺队将在英超联赛(EPL)中升至第四位)在新赛季。据英国《镜报》25日(韩国时间)报道……
身材微胖不漂亮,这位50妈妈凭啥赢过大多数人?年过五十照样靓都说人越缺什么越会重视什么,很多人上了年纪后,面临大不如前的身材、皮肤状态,她们会在这些上面浪费很多时间,比如抱怨岁月无情,一味减龄结果走了弯路等等。但事实上,衣品与气质……SpaceX成功载人飞天大航天时代来临2020年美国东部时间5月30日下午3点22分,一枚来自SpaceX公司的猎鹰9号火箭在美国佛罗里达州的肯尼迪航天中心发射升空,计划将SpaceX的载人龙飞船送入轨道。点……再见太阳,你们太软了!场均94,顶替塔克,我要辅佐巴特勒冲冠前言季后赛才是真正检验一支球队真正硬度的舞台,像上赛季的热火和凯尔特人,以及夺下总冠军的勇士,球队都经历了多多少少的伤病,但是依旧坚持到了最后,硬度包括比赛中的强硬对抗和……再见了,AC米兰!英超土豪重磅官宣,伊布吉鲁大失所望,穆帅窃和纽卡斯尔联一样,AC米兰同样易主,而这也是AC米兰五年内三次易主!AC米兰刚刚夺得了意甲联赛冠军,红鸟资本已经与埃利奥特集团就收购俱乐部达成最终协议,红鸟方面表示,接下来的首……杨幂踩点发博给她庆生,这一对好甜hello大家好,我是吴小傻和李胖胖,一身戎装,文字是我最好的输出。我单枪匹马而来,战斗在文字的海洋!阔别11年,这一对终于又合体了,让一众网友为之动容。3月10日,是刘……妇科科普6月应季水果时间表,孕妈看过来新鲜瓜果可以补充不同的维生素、矿物质、膳食纤维,增加身体抗氧化能力提高自身身体免疫力,对于备孕或者已经在孕期的妈妈,正式补充营养的重要时段。应季水果应当首选,口感好,又新……你了解肝硬化吗?从症状到饮食给你讲讲肝硬化是一种常见的慢性肝病,可由一种或多种原因引起肝脏损害。肝脏呈进行性、弥漫性、纤维性病变。具体表现为肝细胞弥漫性变性坏死,继而出现纤维组织增生和肝细胞结节状再生,这三种改变……樊振东是一等功臣,为何没有被保送上军校?而是被上海交大录取?国乒男队一哥樊振东4月份被上海交通大学录取。成为刘国梁,马龙,孙颖莎,王曼昱等人的学弟。有的球迷会问了,东哥之前也是一名现役军人,并且还荣立一等功。为啥樊振东没有被保送的军队院……不打了!退出CBA?林书豪终于服老对阵福建队一战,林书豪连12人大名单都进不去,这或许成为压倒他的最后一颗稻草,从而心灰意冷做出了艰难决定。是的,可能真要离开了,为了让自己剩余不多的职业生涯得以有用武之地……Redis常见延迟问题排查手册!附优化建议Redis作为内存数据库,拥有非常高的性能,单个实例的QPS能够达到10W左右。但我们在使用Redis时,经常时不时会出现访问延迟很大的情况,如果你不知道Redis的内部实现原……Linux之iptables防火墙所谓防火墙也称之为防护墙,它是一种位于内部网络与外部网络之间的网络安全系统。一项信息安全的防护系统。按照给定的规则,允许或者限制网络报文通过。硬件防墙:通过硬件和软件的组合,基……看呆了!突发脉冲现象刚刚,A股港股人民币直线拉升!背后发生了中国基金报泰勒兄弟姐妹们,上午A股还在慢慢的低开高走,谁知道吃个午饭睡个午觉回来开盘,嗷一下直线拉升了!人民币汇率也在跳涨,半导体、旅游餐饮酒店瞬间涨停。一起来看看……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网