一种流量控制方法及装置
技术领域
本申请涉及网络技术领域,尤其涉及一种流量控制方法及装置。
背景技术
随着互联网和计算机技术的迅速发展,很多业务诸如电子商务业务、通讯业务、金融业务等,都可以在网上进行,给人们的生活带来了很大的便利。
一般地,可以由服务器侧的多个节点构成业务链,用于进行业务处理。业务以流量的形式在业务链上流动,流量到达上游节点时,可以流入上游节点,由上游节点对流入的流量处理后再流向下游节点。当从上游节点流出的流量规模较大时,为了防止下游节点处理负担过重,可以采用流量控制应用,对上游节点和下游节点之间的流量进行控制。具体地,上游节点流出的流量会流入流量控制应用,并在流量控制应用的控制下流出,以使得每秒流出量不超过每秒限流值,进而流向下游节点,每秒限流值可以根据下游节点的处理能力进行设定。
在现有技术中,流量控制应用一般采用定时批量释放令牌的方式进行流量控制。假定每秒限流值为N个单位流量,则可以在每秒开始时批量释放N-M个令牌,其中,M为当前尚未用完的令牌数量。流量控制应用的流出线程每占用一个令牌,流量控制应用可以允许该流量线程流出一个单位流量,以使得每秒从流量控制应用流出的单位流量数不超过N。
但是,在实际应用中,如果流量控制应用的前一秒的流入量远小于N个单位流量,而后一秒的流入量远大于N个单位流量(也即,在后一秒产生秒级流量毛刺),则在后一秒内尚未来得及批量释放令牌时,前一秒未用完的令牌就会被消耗掉,进而,在后一秒内仍然会批量释放N个令牌,且这N个令牌也会被全部消耗掉,导致后一秒内的流出量会远大于N个单位流量。
由此可见,现有技术中的流量控制方式在出现秒级流量毛刺的情况下,流量控制准确性很差。
发明内容
本申请实施例提供一种流量控制方法及装置,用以解决现有技术中的流量控制方式在出现秒级流量毛刺的情况下,流量控制准确性很差的问题。
本申请实施例提供的一种流量控制方法,每秒限流值为N个单位流量,所述方法包括:
按照设定的令牌释放周期,周期性地对至少一个令牌分别进行重复释放,使得每秒内释放令牌的总次数不大于N,其中,所述令牌释放周期是根据所述每秒限流值和所述至少一个令牌的数量设定的,释放的每个令牌用于准许将流入的一个单位流量流出;以及
通过所述至少一个令牌,对流入的各单位流量的流出进行控制。
本申请实施例提供的一种流量控制装置,每秒限流值为N个单位流量,所述装置包括:
令牌释放模块,用于按照设定的令牌释放周期,周期性地对至少一个令牌分别进行重复释放,使得每秒内释放令牌的总次数不大于N,其中,所述令牌释放周期是根据所述每秒限流值和所述至少一个令牌的数量设定的,释放的每个令牌用于准许将流入的一个单位流量流出;
流量控制模块,用于通过所述至少一个令牌,对流入的各单位流量的流出进行控制。
本申请实施例通过上述至少一种技术方案,可以使得每秒内释放令牌的总次数不大于每秒限流值,由于释放的每个令牌用于准许将流入的一个单位流量流出,因此,每秒流出的单位流量的最大数量也不会超过每秒限流值,从而可以准确地进行流量控制,解决了现有技术中的问题。
附图说明
此处所说明的附图用来提供对本申请的进一步理解,构成本申请的一部分,本申请的示意性实施例及其说明用于解释本申请,并不构成对本申请的不当限定。在附图中:
图1为本申请实施例提供的流量控制方法的过程;
图2为本申请实施例提供的一种实际应用场景下,流量控制方法的实施过程的简略示意图;
图3为本申请实施例提供的一种实际应用场景下,流量控制方法的实施过程在某1秒内的详细示意图;
图4为本申请实施例提供的流量控制装置结构示意图。
具体实施方式
为使本申请的目的、技术方案和优点更加清楚,下面将结合本申请具体实施例及相应的附图对本申请技术方案进行清楚、完整地描述。显然,所描述的实施例仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
除了背景技术中提到的现有技术以外,还有一种相关技术也可以用于进行流量控制,但是,这种相关技术也存在问题。在此对这种相关技术以及其存在的问题也一并说明。
在这种相关技术中,可以采用对流量控制应用的流出线程设置延时的方式,进行流量控制。具体的,可以让流出线程每流出一个单位流量后都休眠(Sleep)一段时间后再流出下一个单位流量,Sleep的时间即为延时。当每秒限流值过大时,比如每秒限流值远大于1000个单位流量时,为了保证实际流出峰值可以接近每秒限流值,需要将Sleep的时间设置在1毫秒以下,但是,受目前操作系统和编程语言本身的精度限制,无法将Sleep的时间设置在1毫秒以下,这样的话,实际流出峰值可能会远小于每秒限流值,从而会产生上游节点的流量不能被下游节点及时处理,而下游节点的处理资源却会闲置的问题。
本申请的方案不仅可以解决背景技术中提到的问题,还可以解决这种相关技术存在的问题。下面进行具体说明。
图1为本申请实施例提供的流量控制方法的过程,该过程的执行主体可以是流量控制应用或搭载有流量控制应用的设备。为了便于描述,本申请实施例均以执行主体是流量控制应用作为示例进行说明。
流量控制应用可以是一个独立的软件,也可以是任意软件中的一个功能模块。流量控制应用可以在上游节点上,比如上游节点的流量流出端;可以在下游节点上,比如下游节点的流量流入端;也可以在上游节点和下游节点之间。总而言之,流量控制应用的位置满足以下条件即可:上游节点的流量流出后,会流入流量控制应用,并在流量控制应用的控制下流出,流出的流量流向下游节点。
上游节点、流量控制应用、下游节点可以在不同的设备上,也可以在相同的设备上。设备可以是终端或服务器等。终端包括但不限于:个人计算机、手机、平板电脑、智能手表、车载移动台等;服务器包括但不限于:作为服务器的个人计算机、大中型计算机、计算机集群等。
假定每秒限流值为N个单位流量,N为不小于1的整数,其中,每秒限流值可以根据下游节点的处理能力设定,本申请对此并不做限定。
在本申请实施例中,在不同的场景下,“单位流量”包括的具体内容可以不同,以两个例子进行说明。
例如,当流量是应用层的流量(如业务流量)时,则一个单位流量可以包括一笔业务对应的流量,一般地,在实际应用中会基于事务对业务进行处理,在这种情况下,一笔业务对应的流量可以为:该笔业务对应的事务。当然,除了包括该事务以外,该笔业务对应的流量还可以包括:针对该笔业务要执行的、除了数据库操作以外的业务逻辑。该例可以适用于针对每秒事务数(Transaction Per Second,TPS)进行流量控制的场景。
又例如,当流量是网络层的流量时,则一个单位流量可以包括一个数据包。数据包可以是互联网协议(Internet Protocol,IP)包。
图1中的过程可以包括以下步骤:
S101:按照设定的令牌释放周期,周期性地对至少一个令牌分别进行重复释放,使得每秒内释放令牌的总次数不大于N,其中,所述令牌释放周期是根据所述每秒限流值和所述至少一个令牌的数量设定的,释放的每个令牌用于准许将流入的一个单位流量流出。
在本申请实施例中,为了防止误解,对“每秒内释放令牌的总次数”这个概念进行澄清。在每秒内,将一个令牌释放一次算作所述总次数中的一次,比如,假定有20个令牌,每秒内周期性地对这20个令牌分别重复释放50次,则每秒内释放令牌的总次数为50×200=1000次。
在本申请实施例中,仍然可以采用令牌进行流量控制,但是,释放令牌的方式与现有技术有较大区别。具体地,本申请的方案是对固定数量的令牌(也即,所述的至少一个令牌)进行重复地释放,而不是像现有技术中每秒会批量释放一批新的令牌,因此,不会出现令牌累积的现象,从而可以防止以下问题:秒级流量毛刺出现导致令牌累积过量,进而使得实际可用令牌数量大于每秒限流值,无法保证流量控制准确性。
固定数量可以为一个或多个。以只有一个令牌为例,假定N=1000,则设定的令牌释放周期应当不小于1毫秒(也即,
),这样的话,每秒内释放令牌的总次数不大于1000,相应地,对于流入流量控制应用的各单位流量,每秒内被准许从流量控制应用的单位流量的数量也不大于1000个。
进一步地,在上述的相关技术中提到,受目前操作系统和编程语言本身的精度限制,无法将Sleep的时间设置在1毫秒以下。类似地,由于同样的原因,令牌释放周期可能也无法设定在1毫秒以下,在这种情况下,假定只有一个令牌,N大于1000,比如N=2000时,则设定的令牌释放周期应当不小于0.5毫秒(也即,
),这可能无法实现。但是,若有多个令牌,则可以解决这个问题,仍以N=2000为例,假定有20个令牌,为每个令牌设定的令牌释放周期相同,则设定的令牌释放周期应当不小于10毫秒(也即,
),这是可以实现的。
需要说明的是,在实际应用中,由于“将单位流量流出”这样的操作耗时十分短暂,通常远小于令牌释放周期(令牌释放周期一般为毫秒级别),因此,在本申请实施例中,根据每秒限流值和令牌的数量设定令牌释放周期已经可以满足绝大多数场景的流量控制精度需求,而可以不用考虑“将单位流量流出”的操作耗时。
在本申请实施例中,若有多个令牌,可以为每个令牌设定相同的令牌释放周期,也可以设定不同的令牌释放周期,只要能够满足步骤S101中提到的“使得每秒内释放令牌的总次数不大于N”即可。进一步地,对于各个令牌,可以同步地释放,也可以不同步地释放。本申请对此并不做限定。
S102:通过所述至少一个令牌,对流入的各单位流量的流出进行控制。
在本申请实施例中,可以由流量控制应用中流出线程或进程,负责将流入流量控制应用的各单位流量流出,本申请实施例中均以流出线程为例进行说明。
流出线程可以有一个或多个,各个流出线程可以相互独立地执行占用令牌以及流出流量等动作,流出线程是否被准许流出流量是由流出线程对令牌的占用情况决定的。
具体地,流出线程每占用一个已释放的令牌,可以相应地被准许流出一个单位流量,流出这个单位流量后,可以认为流出线程占有的这个令牌由“未使用”状态转变为“已使用”状态,直至这个令牌的下一个令牌释放周期到来时,流量控制应用或者流出线程可以将这个令牌再次释放,再次释放后,可以认为这个令牌由“已使用”状态又转变为“未使用”状态,进而,这个令牌可以再次被流出线程占用,以用于再流出一个单位流量。
以此类推,随着令牌周期性地被重复释放,流出线程相应地也可以重复地占用被重复释放的令牌,进而可以被准许流出一个又一个的单位流量。在这种情况下,一个流出线程对令牌的占用次数即等于这个流出线程可流出的单位流量的数量。
根据以上说明可知,在实际应用中,一方面流量控制应用在周期性地重复释放令牌,另一方面,流出线程在占用已释放的令牌,以便于流出流量。因此,步骤S101和S102可以没有严格的执行顺序,这两个步骤可以是交替执行的,也可以是并行执行的,等等,本申请对此并不做限定。
通过图1中的方法,可以使得每秒内释放令牌的总次数不大于每秒限流值,由于释放的每个令牌用于准许将流入的一个单位流量流出,因此,每秒流出的单位流量的最大数量也不会超过每秒限流值,从而可以准确地进行流量控制,解决了现有技术中的问题。不仅如此,由于即使N远大于1000,也可以通过增加令牌数量的方式,使得无需将令牌释放周期设定在1毫秒以下,也可以准确地进行流量控制,因此,也解决了上述的相关技术中的问题。
综上所述,采用本申请的方案可以达到这样的效果:即使有秒级流量毛刺出现,仍然可以准确地进行流量控制,使每秒流出量不超过每秒限流值,以及使每秒流出峰值可以达到每秒限流值,而且,每秒限流值的大小不会受到本申请的方案的限制。
为了便于理解,下面对图1中的步骤进一步地说明。
在本申请实施例中,当有多个令牌时,为了便于管理,可以为这些令牌设定相同的令牌释放周期。以下主要基于这种情况进行说明。
令牌释放周期可以在预先设定,也可以在执行步骤S101时再设定。对于步骤S101,根据每秒限流值和所述至少一个令牌的数量,设定所述令牌释放周期,具体可以包括:确定所述每秒限流值和所述至少一个令牌的数量,所述每秒限流值为N个单位流量,所述至少一个令牌的数量为n,n为不小于1的整数;根据所述每秒限流值和所述至少一个令牌的数量,为所述至少一个令牌设定令牌释放周期,使得若按照所述令牌释放周期,周期性地对所述至少一个令牌分别进行重复释放,则每秒内释放令牌的总次数不大于N;其中,所述令牌释放周期为T,T的单位为秒,
显然,步骤S101中提出的条件“使得每秒内释放令牌的总次数不大于N”是通过基于上述公式
的限定得到满足的。上面已经以N=2000为例进行过说明,在此不再赘述。
进一步地,在为各令牌设定的令牌释放周期不全相同的情况下,假定一共设定了m
个不同的令牌释放周期,分别记作T
1、T
2…、T
m,单位均为秒,对应于这m个令牌释放周期的令
牌数量分别记作n
1、n
2…、n
m。则设定m个令牌释放周期应当满足:
在本申请实施例中,对首次释放令牌的时间点(将这个时间点称为:初始时)并不做限定。流出线程在未占有令牌时不被准许流出流量,在流量控制应用开始释放令牌后,流出线程可以准备占用释放的令牌,以便于得到流出流量的准许。
步骤S101即为流量控制释放令牌的整体过程,对于步骤S101,按照设定的令牌释放周期,周期性地对至少一个令牌分别进行重复释放,具体可以包括:初始时,释放所述至少一个令牌;按照设定的令牌释放周期,在每一个所述令牌释放周期开始时,分别针对所述至少一个令牌中的每个令牌执行:若确定该令牌在所述开始时被占用着,则将该令牌释放。
“令牌释放周期开始时”指的是当前的令牌释放周期开始的时刻,“若确定该令牌在所述开始时被占用着”中所述的“占用”这个动作发起的时刻应当是在当前的令牌释放周期之前的某个令牌释放周期内,而不是在当前的令牌释放周期内。也即,若一个令牌被占用,则这个令牌会在自己的下一个令牌释放周期开始时被释放,每个令牌在其每个令牌释放周期内,最多只能被占用一次。
当然,在实际应用中,释放令牌的具体方式并不只限于上面两段中的方式。比如,还可以在初始时只释放全部令牌中的一部分令牌,然后根据流入流量控制应用的各单位流量的数量的变化情况,再释放更多的令牌或收回已释放的令牌,等等。
在本申请实施例中,对于步骤S102,通过所述至少一个令牌,对流入的各单位流量的流出进行控制,具体可以包括:针对流入的每个单位流量,执行以下步骤:当确定所述至少一个令牌中存在已释放未被占用的令牌时,占用一个已释放未被占用的令牌;基于占用的令牌的准许,将这个单位流量流出。
在实际应用中,流出线程可以通过实时监控或者轮询等方式,判断是否存在已释放未被占用的令牌。
进一步地,当有多个流出线程时,多个流出线程可以对已释放的令牌进行抢占,或者,多个流出线程也可以按照预定规则,由预定规则指定的流出线程占用已释放的令牌。未成功占有令牌的流出线程可以等待直至下一个已释放未被占用的令牌出现,再尝试占有。
当流出线程占有一个令牌,并基于占用的令牌的准许,将这个单位流量流出后,可以认为这个令牌从“未使用”状态转变为“已使用”状态。通常地,令牌的状态可以用预定字段的取值进行表示,比如,预定字段可以有第一值和第二值这两个取值,第一值表示“未使用”状态,第二值表示“已使用”状态,则每当释放令牌时,若该令牌的预定字段的取值为第二值,则可以将其修改为第一值后再释放该令牌,则释放后的该令牌可以被流出线程再次占用及使用。
在本申请实施例中,在前面已经提到,每个单位流量可以包括一笔业务对应的事务。以电子商务业务为例,对秒级流量毛刺出现的一种场景进行说明。
例如,电子商务业务的一笔业务具体可以是:一笔交易对应的事务。上游节点可以是收银台(cashier),流量控制应用可以是一种特定的分布式队列,下游节点可以是支付核心(paycore)。一般的交易流程是:用户进入cashier确定付款金额,并选择支付方式,然后点击付款按钮以发送支付请求(也即,该笔交易对应的事务);cashier将该支付请求提交到该分布式队列,由该分布式队列按照设定的每秒限流值,采用某种流量控制方式,进行流量控制(也即,限流),将限流后的流量提交至paycore;由paycore处理各支付请求,并得到支付结果。
基于对交易流程的说明,对于在某年11月11日0点会开始进行的购物促销,在11月10日0点之前一段时间内的每1秒的交易数量可能会远小于每秒限流值,但是,在11月10日0点之后一段时间内的每1秒的交易数量可能会远大于每秒限流值,则在这两段时间的交界处会产生秒级流量毛刺。对于这种秒级流量毛刺,若采用现有技术中的流量控制方式,无法准确地进行流量控制,而基于本申请的方案,可以准确地进行流量控制。
上面对图1中的步骤进一步地进行了说明。基于这些说明,本申请实施例还提供了一种实际应用场景下的流量控制方法的实施过程,如图2、图3所示。
图2示出了该实施过程的简略示意图。
在图2中,流量从上游节点流入流量控制应用,当存在可用令牌(也即,已释放且未被占用的令牌)时,可以占用令牌并流出流量,流出的流量流向下游节点,当不存在可用令牌时,等待重试。其中,令牌会被周期性地重复释放。
图3示出了该实施过程在某1秒内的详细示意图。
在图3中,令牌的数量是1个,每秒限流值为N个单位流量,在这1秒内一共流入了M个单位流量,N<M。相邻的两个“释放该令牌”时刻之间的时间长度即为令牌释放周期的长度。可以看到,1秒内的令牌释放周期的个数为N个,只有当该令牌每次释放后,才能相应地流出一个单位流量,在1秒内一共流出了N个单位流量,因此,图3中的流量控制是准确的,达到了既定目标。
以上为本申请实施例提供的流量控制方法,基于同样的思路,本申请实施例还提供相应的流量控制装置,如图4所示。
图4为本申请实施例提供的流量控制装置结构示意图,每秒限流值为N个单位流量,N为不小于1的整数,所述装置具体包括:
令牌释放模块401,用于按照设定的令牌释放周期,周期性地对至少一个令牌分别进行重复释放,使得每秒内释放令牌的总次数不大于N,其中,所述令牌释放周期是根据所述每秒限流值和所述至少一个令牌的数量设定的,释放的每个令牌用于准许将流入的一个单位流量流出;
流量控制模块402,用于通过所述至少一个令牌,对流入的各单位流量的流出进行控制。
可选地,令牌释放模块401还用于:根据所述每秒限流值和所述至少一个令牌的数量,设定所述令牌释放周期;
可选地,令牌释放模块401具体用于:确定所述每秒限流值和所述至少一个令牌的数量,所述每秒限流值为N个单位流量,所述至少一个令牌的数量为n,n为不小于1的整数;根据所述每秒限流值和所述至少一个令牌的数量,为所述至少一个令牌设定令牌释放周期,使得若按照所述令牌释放周期,周期性地对所述至少一个令牌分别进行重复释放,则每秒内释放令牌的总次数不大于N;其中,所述令牌释放周期为T,T的单位为秒,
可选地,令牌释放模块401具体用于:初始时,释放所述至少一个令牌;按照设定的令牌释放周期,在每一个所述令牌释放周期开始时,分别针对所述至少一个令牌中的每个令牌执行:若确定该令牌在所述开始时被占用着,则将该令牌释放。
可选地,流量控制模块402具体用于:针对流入的每个单位流量,执行以下步骤:当确定所述至少一个令牌中存在已释放未被占用的令牌时,占用一个已释放未被占用的令牌;基于占用的令牌的准许,将这个单位流量流出。
可选地,每个所述单位流量包括一笔业务对应的事务。
通过图4中的装置,可以使得每秒内释放令牌的总次数不大于每秒限流值,由于释放的每个令牌用于准许将流入的一个单位流量流出,因此,每秒流出的单位流量的最大数量也不会超过每秒限流值,从而可以准确地进行流量控制,解决了现有技术中的问题。不仅如此,由于即使N远大于1000,也可以通过增加令牌数量的方式,使得无需将令牌释放周期设定在1毫秒以下,也可以准确地进行流量控制,因此,也解决了上述的相关技术中的问题。
具体的上述如图4所示的装置可以位于搭载有流量控制应用的设备上。
本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
在一个典型的配置中,计算设备包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。
内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。内存是计算机可读介质的示例。
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。
以上所述仅为本申请的实施例而已,并不用于限制本申请。对于本领域技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本申请的权利要求范围之内。