专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

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

  在电商高并发场景下,我们经常会使用一些常用方法,去应对流量高峰,比如限流、熔断、降级,今天我们聊聊限流。
  什么是限流呢?限流是限制到达系统的并发请求数量,保证系统能够正常响应部分用户请求,而对于超过限制的流量,则通过拒绝服务的方式保证整体系统的可用性。
  根据限流作用范围,可以分为单机限流和分布式限流;根据限流方式,又分为计数器、滑动窗口、漏桶限令牌桶限流,下面我们对这块详细进行讲解。常用限流方式计数器
  计数器是一种最简单限流算法,其原理就是:在一段时间间隔内,对请求进行计数,与阀值进行比较判断是否需要限流,一旦到了时间临界点,将计数器清零。
  这个就像你去坐车一样,车厢规定了多少个位置,满了就不让上车了,不然就是超载了,被交警叔叔抓到了就要罚款的,如果我们的系统那就不是罚款的事情了,可能直接崩掉了。
  程序执行逻辑:可以在程序中设置一个变量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

Linux中国版第一自曝精美流畅得不像话作为国内最受欢迎的Linux发行版本,Deepin深度操作系统正在开发全新的V23版本,最大变化就是采用行云设计(FlowDesign)。据官方介绍,行云设计理念遵循简约友好生命力早资道腾讯回应中国移动入股传闻B站首战双11上线购物专区腾讯回应中国移动可能入股腾讯不实消息10月24日,有消息称,中国移动可能入股腾讯。对此,腾讯官方回应称,该消息不实。B站首战双11上线购物专区,全量放开小黄车10月24日消息,据报前9月中国38。9万新能源车出海都去了哪儿10月24日,海关总署发布最新的统计数据显示,今年前三季度,我国汽车出口2598。4亿元,同比增长67。1。中国汽车工业协会的数据则显示,今年1到9月,中国汽车出口211。7万辆,他,16岁出道,35岁登顶中国首富,马云都对他礼让三分俗话说得好,时势造就英雄,在改革开放的新时代,好多人都搭上了顺风车,赚得盆满钵满。国美电器的掌舵人黄光裕就是其中典型的代表。黄光裕1969年出生在广东省汕头市,年少时的他,家境非常跟美国闹翻,沙特想要优质投资,中国汽车产业获海外扩张黄金机遇伴随着沙特半公开化地想要摆脱美元钳制,中国本土汽车产业迎来了进军沙特,建立海外产业桥头堡的黄金机遇。最近的全球政治经济舞台上,沙特很活跃,其一举一动也备受关注。先是沙特主导的欧佩克中国游客吃日本拉面,叮嘱加多点肉,上桌后嘀咕兰州拉面学着点引言每个国家都有自己独特的文化,在这一文化的影响下,也出现了不同的饮食和美味。就以我们国家来说,光是菜系就有好几十种,再加上形态和口味各异的小吃等等,用丰富二字来形容是再合适不过了国家为什么要让汉中崛起?汉中,陕西省地级市。汉中产业兴旺,经过50多年发展,汉中已成为重要的航空产业基地装备制造业基地现代材料工业基地和绿色食品药品基地。汉中有其得天独厚的优势,在西安以外的其他地市不可比回忆弦歌台突然想到了往昔所游的淮阳景区,最喜欢的当是弦歌台了,那里虽没有太昊陵的宏伟,没有八卦台的神秘,没有东湖接天莲叶无穷碧,映日荷花别样红的美丽,没有陈楚故街的繁华可不知道为什么,就是喜内蒙古额济纳旗胡杨林,景区账号显示暂停开放今年美景无人问津十月底,深秋季节,也是一年最美的季节,此时正是赏秋的季节,不论是北京香山,新疆的塔里木河胡杨林,再到辽宁本溪红叶节都比不过内蒙古额济纳旗的胡杨林,十月胡杨林是摄影师和游客们的天堂。2022我最满意的手机荣耀Magic4Pro因为128G实在不够用让我每天都处在内存焦虑中,刚好magic4系列发布,我就把最喜欢最好用的mate40Pro釉白换成了荣耀magic4Pro512釉白,5月中购买第一台,中途也再访松山湖华为终端基地由于孩子在深圳华为公司上班,今年又有机会到华为终端基地游玩,这个基地就是松山湖基地,是华为终端公司新总部所在,主要发展与手机等所有终端关联的研发销售和增值业务。基地很大,战地面积有
房县樱花岛第三届樱花文化旅游节3月25日盛大开幕!十堰广电讯(通讯员孙翠婷)如果说春天是追随花的约定,那么每年三月房县樱花岛景区的樱花节一定是十堰的春天最让人心生向往的一场花事,一年一度的樱花节将在3月25日正式启幕!本次樱花文化唐诗里的慈溪县城慈城文化慈城文化源自7000年前的河姆渡傅家山文化,自春秋始设句章建制以来,拥有2500年的建城史,2200多年的建县史,1200多年的县城史,可谓历史悠久,人文荟萃。慈城自唐设置为慈溪县魏晋南北朝与唐朝时期,反贪立法制度对比,历史变革与启示在魏晋南北朝时期,不仅地方官员贪污贿赂现象较为普遍,而且这一现象在中央官员中也大量存在。在北魏后期,拓跋贵族先祖的后裔与皇帝的子孙及旁系亲属都有贪迹可循。官员贪污贿赂权钱交易买官卖苏葛范彭的姓氏起源和名人故事37。苏苏姓起源以封地名为姓说昆吾氏的后人中有人获得封地苏邑,这一支的后人便以封邑名为姓,改姓为苏。苏姓名人战国时纵横家苏秦西汉大臣苏武唐代大将苏定方北宋文学家苏轼名人故事眉山三苏定了!2026年男足世界杯,新赛制来了国际足联确定2026年世界杯赛制国际足联14日在卢旺达召开理事会会议,会议确定了2026年男足世界杯赛制,同时宣布决赛将于2026年7月19日举行。2026年美加墨男足世界杯将首次SpringBoot启动控制台的banner是怎么回事前言每次启动SpringBoot项目时,总是能看到控制台打印了一串字符,隐约能辨认出是Spring,不知大家是否也好奇过是怎么实现的,是直接打印固定的字符串,还是根据什么算法去生成Excel提取单元格批注里的内容在Excel表格中,经常会插入一些批注,想要提取批注里面的内容,工作表函数是实现不了,但是却可以VBA定义一个函数来提取,提取以下图中批注的内容VBA写好VBA后,另存为。xls或发达国家反倒落后?一文读懂后发国家在移动支付的逆袭导读近日,肯尼亚移动支付的新闻受到网络关注,一些类似的互联网技术服务在传统认知中的落后地区的表现更好的现象也引发了讨论和思考,移动支付就是其中一个典型代表。本文以肯尼亚中国印度三个苹果5G基带完成组装高通华为泪目!苹果5G基带完成组装,三大运营商参与测试!根据2022年手机产业报告数据显示,苹果占据了整个行业85以上的利润,相当于剩下的那么多手机厂商,争夺的不过是15的利润,面毕其功于一役,3月16日百度将迎来最艰难一战文心一言百度作为中文互联网上最负盛名的搜索引擎巨头,近些年过得一直不是很顺利。在移动互联网爆发时,百度并没有抓住风口迅速扩张,在2018年推出手机百度APP勉强赶上了最后一趟车近几年因为魏谷歌开源PaLMAPIMeta再裁员10000人全国高中C9联盟成立日报君发自凹非寺量子位公众号QbitAI今天是3月15日星期三,国际消费者权益日。不只今天,每天都要很好的维权哦!最近科技圈都发生了哪些新鲜事?一起来和日报君看看谷歌在GmailD
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网