2021年7月22日星期四

Java限流策略与算法

在这里插入图片描述

概要

在大数据量高并发访问时,经常会出现服务或接口面对暴涨的请求而不可用的情况,甚至引发连锁反映导致整个系统崩溃。此时你需要使用的技术手段之一就是限流,当请求达到一定的并发数或速率,就进行等待、排队、降级、拒绝服务等。
对一般的限流场景来说它具有两个维度的信息:
时间:限流基于某段时间范围或者某个时间点,也就是我们常说的"时间窗口",比如对每分钟、每秒钟的时间窗口做限定
资源:基于可用资源的限制,比如设定最大访问次数,或最高可用连接数

上面两个维度结合起来看,限流就是在某个时间窗口对资源访问做限制,比如设定每秒最多100个访问请求。但在真正的场景里,我们不止设置一种限流规则,而是会设置多个限流规则共同作用。
主要的几种限流规则如下:
在这里插入图片描述

QPS和连接数控制

对于图中连接数和QPS)限流来说,我们可设定IP维度的限流,也可以设置基于单个服务器的限流。

在真实环境中通常会设置多个维度的限流规则,比如设定同一个IP每秒访问频率小于10,连接数小于5,再设定每台机器QPS最高1000,连接数最大保持200。更进一步,我们可以把某个服务器组或整个机房的服务器当做一个整体,设置更high-level的限流规则,这些所有限流规则都会共同作用于流量控制。

传输速率

对于"传输速率"大家都不会陌生,比如资源的下载速度。有的网站在这方面的限流逻辑做的更细致,比如普通注册用户下载速度为100k/s,购买会员后是10M/s,这背后就是基于用户组或者用户标签的限流逻辑。

黑白名单

黑白名单是各个大型企业应用里很常见的限流和放行手段,而且黑白名单往往是动态变化的。举个例子,如果某个IP在一段时间的访问次数过于频繁,被系统识别为机器人用户或流量攻击,那么这个IP就会被加入到黑名单,从而限制其对系统资源的访问,这就是我们俗称的"封IP"。
我们平时见到的爬虫程序,比如说爬知乎上的美女图片,或者爬券商系统的股票分时信息,这类爬虫程序都必须实现更换IP的功能,以防被加入黑名单。有时我们还会发现公司的网络无法访问12306这类大型公共网站,这也是因为某些公司的出网IP是同一个地址,因此在访问量过高的情况下,这个IP地址就被对方系统识别,进而被添加到了黑名单。使用家庭宽带的同学们应该知道,大部分网络运营商都会将用户分配到不同出网IP段,或者时不时动态更换用户的IP地址。
白名单就更好理解了,相当于御赐金牌在身,可以自由穿梭在各种限流规则里,畅行无阻。比如某些电商公司会将超大卖家的账号加入白名单,因为这类卖家往往有自己的一套运维系统,需要对接公司的IT系统做大量的商品发布、补货等等操作。

分布式环境

分布式区别于单机限流的场景,它把整个分布式环境中所有服务器当做一个整体来考量。比如说针对IP的限流,我们限制了1个IP每秒最多10个访问,不管来自这个IP的请求落在了哪台机器上,只要是访问了集群中的服务节点,那么都会受到限流规则的制约。

从上面例子不难看出,我们最好将限流信息保存在一个"中心化"的组件上,这样它就可以获取到集群中所有机器的访问状态,目前有两个比较主流的限流方案:

网关层限流 将限流规则应用在所有流量的入口处
中间件限流 将限流信息存储在分布式环境中某个中间件里(比如Redis缓存),每个组件都可以从这里获取到当前时刻的流量统计,从而决定是拒绝服务还是放行流量
sentinel,springcloud生态圈为微服务量身打造的一款用于分布式限流、熔断降级等组件

限流方案常用算法介绍

说到限流,至少我们需要对限流的底层原理有个大致的了解,才好更深入的进行学习,下面我们挑选令牌桶算法、漏桶算法、滑动窗口和计数器算法来说一下

令牌桶算法

Token Bucket令牌桶算法是目前应用最为广泛的限流算法,顾名思义,它有以下两个关键角色:

令牌 获取到令牌的Request才会被处理,其他Requests要么排队要么被直接丢弃
桶 用来装令牌的地方,所有Request都从这个桶里面获取令牌
用图简单描述如下
在这里插入图片描述

主要涉及到2个过程:

令牌生成

这个流程涉及到令牌生成器和令牌桶,前面我们提到过令牌桶是一个装令牌的地方,既然是个桶那么必然有一个容量,也就是说令牌桶所能容纳的令牌数量是一个固定的数值。
对于令牌生成器来说,它会根据一个预定的速率向桶中添加令牌,比如我们可以配置让它以每秒100个请求的速率发放令牌,或者每分钟50个。注意这里的发放速度是匀速,也就是说这50个令牌并非是在每个时间窗口刚开始的时候一次性发放,而是会在这个时间窗口内匀速发放。
在令牌发放器就是一个水龙头,假如在下面接水的桶子满了,那么自然这个水(令牌)就流到了外面。在令牌发放过程中也一样,令牌桶的容量是有限的,如果当前已经放满了额定容量的令牌,那么新来的令牌就会被丢弃掉。

令牌获取

每个访问请求到来后,必须获取到一个令牌才能执行后面的逻辑。假如令牌的数量少,而访问请求较多的情况下,一部分请求自然无法获取到令牌,那么这个时候我们可以设置一个"缓冲队列"来暂存这些多余的令牌。
缓冲队列其实是一个可选的选项,并不是所有应用了令牌桶算法的程序都会实现队列。当有缓存队列存在的情况下,那些暂时没有获取到令牌的请求将被放到这个队列中排队,直到新的令牌产生后,再从队列头部拿出一个请求来匹配令牌。
当队列已满的情况下,这部分访问请求将被丢弃。在实际应用中我们还可以给这个队列加一系列的特效,比如设置队列中请求的存活时间,或者将队列改造为PriorityQueue,根据某种优先级排序,而不是先进先出。

漏桶算法

Leaky Bucket,又是个桶,限流算法是跟桶杠上了,那么漏桶和令牌桶有什么不同呢?我们来看图说话:
在这里插入图片描述

漏桶算法的前半段和令牌桶类似,但是操作的对象不同,令牌桶是将令牌放入桶里,而漏桶是将访问请求的数据包放到桶里。同样的是,如果桶满了,那么后面新来的数据包将被丢弃。
漏桶算法的后半程是有鲜明特色的,它永远只会以一个恒定的速率将数据包从桶内流出。打个比方,如果我设置了漏桶可以存放100个数据包,然后流出速度是1s一个,那么不管数据包以什么速率流入桶里,也不管桶里有多少数据包,漏桶能保证这些数据包永远以1s一个的恒定速度被处理。
漏桶 vs 令牌桶的区别

根据它们各自的特点不难看出来,这两种算法都有一个"恒定"的速率和"不定"的速率。令牌桶是以恒定速率创建令牌,但是访问请求获取令牌的速率"不定",反正有多少令牌发多少,令牌没了就干等。而漏桶是以"恒定"的速率处理请求,但是这些请求流入桶的速率是"不定"的。
从这两个特点来说,漏桶的天然特性决定了它不会发生突发流量,就算每秒1000个请求到来,那么它对后台服务输出的访问速率永远恒定。而令牌桶则不同,其特性可以"预存"一定量的令牌,因此在应对突发流量的时候可以在短时间消耗所有令牌,其突发流量处理效率会比漏桶高,但是导向后台系统的压力也会相应增多。

滑动窗口

根据图示,我们将时间窗口的限流原理拆解描述一下其过程:

在这里插入图片描述

黑色的大框就是时间窗口,我们设定窗口时间为5秒,它会随着时间推移向后滑动。我们将窗口内的时间划分为五个小格子,每个格子代表1秒钟,同时这个格子还包含一个计数器,用来计算在当前时间内访问的请求数量。那么这个时间窗口内的总访问量就是所有格子计数器累加后的数值。
比如说,我们在每一秒内有5个用户访问,第5秒内有10个用户访问,那么在0到5秒这个时间窗口内访问量就是15。如果我们的接口设置了时间窗口内访问上限是20,那么当时间到第六秒的时候,这个时间窗口内的计数总和就变成了10,因为1秒的格子已经退出了时间窗口,因此在第六秒内可以接收的访问量就是20-10=10个。
滑动窗口其实也是一种计算器算法,它有一个显著特点,当时间窗口的跨度越长时,限流效果就越平滑。打个比方,如果当前时间窗口只有两秒,而访问请求全部集中在第一秒的时候,当时间向后滑动一秒后,当前窗口的计数量将发生较大的变化,拉长时间窗口可以降低这种情况的发生概率
那么有了上面的基础理论之后,我们来简单总结下目前常用的限流方案有哪些呢?

Guawa限流

说起Guava大家一定不陌生,它是Google出品的一款工具包,我们经常用它做一些集合操作比如Lists.newArrayList()等,它最早源于2007的"Google Collections Library"项目。Guava不甘于将自己平凡的一生都耗费在Collections上面,于是乎它开始了转型,慢慢扩展了自己在Java领域的影响力,从反射工具、函数式编程、安全验证、数学运算等等方面,都提供了响应的工具包

在限流领域中,Guava也贡献了一份绵薄之力,在其多线程模块下提供了以RateLimiter为首的几个限流支持类,但是作用范围仅限于"当前"这台服务器,也就是说Guawa的限流是单机的限流,跨了机器或者jvm进程就无能为力了
在这里插入图片描述

比如说,目前我有2台服务器[Server 1,Server 2],这两台服务器都部署了一个登陆服务,假如我希望对这两台机器的流量进行控制,比如将两台机器的访问量总和控制在每秒20以内,如果用Guava来做,只能独立控制每台机器的访问量<=10。

尽管Guava不是面对分布式系统的解决方案,但是其作为一个简单轻量级的客户端限流组件,非常适合来讲解限流算法

网关层限流

在整个分布式系统中,如果有这么一个"一夫当关,万夫莫开"的角色,非网关层莫属。服务网关,作为整个分布式链路中的第一道关卡,承接了所有用......

原文转载:http://www.shaoqun.com/a/892104.html

跨境电商:https://www.ikjzd.com/

欧麦:https://www.ikjzd.com/w/2085

prime:https://www.ikjzd.com/w/129

新蛋:https://www.ikjzd.com/w/79


概要在大数据量高并发访问时,经常会出现服务或接口面对暴涨的请求而不可用的情况,甚至引发连锁反映导致整个系统崩溃。此时你需要使用的技术手段之一就是限流,当请求达到一定的并发数或速率,就进行等待、排队、降级、拒绝服务等。对一般的限流场景来说它具有两个维度的信息:时间:限流基于某段时间范围或者某个时间点,也就是我们常说的"时间窗口",比如对每分钟、每秒钟的时间窗口做限定资源:基于可用资源的限制,比如设定
智赢:https://www.ikjzd.com/w/1511
inkfrog:https://www.ikjzd.com/w/668
天津一日游攻略_天津旅游攻略 :http://www.30bags.com/a/412945.html
天津应季旅游时间表 给爱旅游的你:http://www.30bags.com/a/416589.html
天津优联投资集团精心筹划 柬埔寨七星海与桂林旅游学院合作云签约成功举行:http://www.30bags.com/a/230917.html
天津有什么风味小吃?:http://www.30bags.com/a/415839.html
男朋友说穿裙子方便做 脱了我内裤就直接进了:http://lady.shaoqun.com/a/248351.html
男人吃醋为什么会强啪 男朋友把我整哭了还继续:http://lady.shaoqun.com/m/a/247309.html
男女出轨都为了什么?婚姻出轨的7个动机你知道吗 :http://lady.shaoqun.com/a/428396.html
如果一个女人堕胎了,她身上通常会有几个明显的痕迹,仔细观察就能发现:http://lady.shaoqun.com/a/428397.html
男生第一次谈恋爱的方式:http://lady.shaoqun.com/a/428398.html
一个生过孩子的女人身上有这三个明显的痕迹。医生直言:没办法:http://lady.shaoqun.com/a/428399.html

没有评论:

发表评论