背景技术
在日常生活中经常会出现突发的高并发场景,诸如:在购物狂欢节期间一些热门商品的降价促销,导致平台的服务接口被几十万、上百万甚至上千万次访问,会形成一个较大的流量,这种情况下每一次查询库存请求都集中到数据库,导致效率低。在实现本发明的过程中,发明人发现,目前的限流措施并不能进行平滑的限流,并会产生突刺现象,从而造成网络拥堵,导致用户体验低。以下为目前限流措施存在的缺陷:
计数器限流法存在的缺陷:
计数器限流一般会通过控制一秒钟能够通过的请求数,比如qps为1000,算法的实现思路就是从第一个请求进来开始计数,在下来的一秒钟内,每过来一个请求,就把计数器的值加1,如果累加数字达到了1000,那么后续的请求将会被拒绝。等到一秒钟结束后,把计数器的值恢复为0,重新开始计数。这种算法的缺点是,如果在单位时间一秒内的前10ms,请求了1000次,那么后面的990ms内的请求将会被拒绝,会产生“突刺现象”,不能进行平滑的限流。
漏桶限流法存在的缺陷:
漏桶(Leaky Bucket)算法实现思路,水(请求)先进入到漏桶里,漏桶以一定的速度出水(接口有响应速率),当水流入速度过大会直接溢出(访问频率超过接口响应速率),然后就拒绝请求,可以看出漏桶算法能强行限制数据的传输速率。因为漏桶一直以一定的速度出水,所以无法应对短时间的突发流量。
令牌桶限流法存在的缺陷:
令牌桶算法(Token Bucket)和Leaky Bucket效果一样但方向相反的算法,更加容易理解。随着时间流逝,系统会按恒定1/QPS时间间隔(如果QPS=1000,则间隔是1ms)往桶里加入Token,如果桶已经满了就不再加了。新请求来临时,会各自取走一个Token,如果没有Token可取就阻塞或者拒绝服务。令牌桶算法是对漏桶算法的一种改进,桶算法能够限制请求调用的速率,而令牌桶算法能够在限制调用的平均速率的同时还允许一定程度的突发调用。Google guava提供的工具库中的Rate Limit就是基于令牌桶算法实现的,但是这仅限制在单节点,如果是分布式系统,每个节点的QPS是一样的,请求量到服务接口那的话就是QPS*节点数了。所以这种方案在分布式的情况下不适用。
基于Redis的String数据结构的限流方案存在的缺陷:
可以使用接口名来作为key,初始值为1,通过设置其过期时间来进行限流;即(setex(key,expire time,1))当每次访问时如果存在该key,就将值加1;(即incr(key))如果不存在,设置默认值为1即可;(即setex(key,expire time,1))这种方法虽然解决了分布式下的限流问题,但是在一段时间内进行限流,这样存在两个时间段分别不超过阈值,但是可能存在两个时间段之间的时间段超过阈值的情况,不能进行精准的限流。
发明内容
为了解决上述技术问题或者至少部分地解决上述技术问题,本申请提供了一种基于服务接口的限流方法、装置、电子设备及存储介质。
第一方面,本申请提供了基于服务接口的限流方法,包括:
确定待调用接口在滑动时间窗口内的调用阈值;
根据当前时间戳以及所述滑动时间窗口确定第一时间区间;
统计所述第一时间区间内所述待调用接口的第一调用次数;
当所述第一调用次数大于所述调用阈值时,执行限流操作。
可选的,所述方法还包括:
获取缓存中的有序集;
根据所述有序集中的权重值确定所述滑动时间窗口。
可选的,所述确定待调用接口在滑动时间窗口内的调用阈值,包括:
获取所述待调用接口的接口标识;
根据所述接口标识从缓存中查询所述待调用接口在每个滑动时间窗口内的调用阈值。
可选的,所述方法还包括:
当所述缓存中不存在所述待调用接口的调用阈值时,根据所述接口标识从数据库中读取所述待调用接口的调用阈值;
将所述调用阈值同步至所述缓存,并为所述调用阈值分配过期时间。
可选的,所述统计所述第一时间区间内所述待调用接口的第一调用次数,包括:
确定起始时间至所述当前时间戳的第二时间区间;
获取所述第二时间区间内所述待调用接口的第二调用次数;
计算所述第二时间区间减去所述第一时间区间后得到的第三时间区间;
统计所述第三时间区间内所述待调用接口的第三调用次数;
计算所述第二调用次数与第三调用次数的差值,根据所述差值确定所述第一调用次数。
可选的,所述执行限流操作,包括:
拒绝调用请求;
或,
将所述调用请求放入队列,并按照所述调用请求的优先级进行排序。
可选的,所述方法还包括:
当所述第一调用次数小于或等于所述调用阈值时,将所述待调用接口的接口标识作为键名添加至缓存中的有序集,并在所述有序集中将所述接口标识对应的权重值以及键值更新为所述当前时间戳。
第二方面,本申请提供了一种基于服务接口的限流装置,包括:
确定模块,用于确定待调用接口在滑动时间窗口内的调用阈值;
获取模块,用于根据当前时间戳以及所述滑动时间窗口确定第一时间区间;
统计模块,用于统计所述第一时间区间内所述待调用接口的第一调用次数;
执行模块,用于当所述第一调用次数大于所述调用阈值时,执行限流操作。
第三方面,本申请提供了一种电子设备,包括:处理器、通信接口、存储器和通信总线,其中,处理器,通信接口,存储器通过通信总线完成相互间的通信;
所述存储器,用于存放计算机程序;
所述处理器,用于执行计算机程序时,实现上述方法步骤。
第四方面,本申请提供了一种计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现上述方法步骤。
本申请实施例提供的上述技术方案与现有技术相比具有如下优点:通过采用滑动时间窗口的设计不仅实现了两个相邻时间段内接口的调用次数与不会超过预设的调用阈值,而且两个时间段内的任一时间区间的调用次数也不会超过预设的调用阈值,从而达到平滑限流。另外,本申请提供的限流方法还可以应对突发流量,并且进行精准的限流。
具体实施方式
为使本申请实施例的目的、技术方案和优点更加清楚,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本申请的一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本申请保护的范围。
本申请提供了一种基于服务接口的限流方法、装置、电子设备及存储介质。本发明实施例所提供的方法可以应用于任意需要的电子设备,例如,可以为服务器、终端等电子设备,在此不做具体限定,为描述方便,后续简称为电子设备。
下面首先对本发明实施例所提供的一种基于服务接口的限流方法进行介绍。
图1为本申请实施例提供的一种基于服务接口的限流方法的流程图。如图1所示,该方法包括以下步骤:
步骤S11,确定待调用接口在滑动时间窗口内的调用阈值;
步骤S12,根据当前时间戳以及滑动时间窗口确定第一时间区间;
步骤S13,统计第一时间区间内待调用接口的第一调用次数;
步骤S14,当第一调用次数大于调用阈值时,执行限流操作。
本实施例中,通过采用滑动时间窗口的设计不但解决了两个相邻时间段内接口的调用次数与不会超过预设的调用阈值,同时两个时间段内的任一时间区间的调用次数也不会超过预设的调用阈值。
例如:第一时间段为0-1min,第二时间段为1-2min,每个时间段内接口的调用阈值为100次/min,在第一时间段的0-0.5min时,调用次数为20次,0.5min-1min的调用次数为70次。在第二时间段的1-1.5min时,调用次数为60次,0.5min-1min的调用次数为30次。由此可知两个相邻的时间段内的调用次数均没有超过调用阈值,但是0.5-1.5min这一时间段的调用次数大于调用阈值,这就会使数据库在短时间内拥堵。然而通过设计滑动时间窗口能够任意一个时间段进行平滑限流,并且还可以应对突发流量,并且进行精准的限流。
本实施例中,接收调用请求,调用请求可以由客户端发起。根据调用请求确定待调用的服务接口,确定待调用接口在每个滑动时间窗口内的调用阈值。
本实施例利用的Redis缓存中(Remote Dictionary Server远程字典服务)的有序集(zset)数据结构,有序集(zset)中的包括:权重值(score)、接口标识(key)以及键值(value),通过权重值(score)设置每个接口对应的滑动时间窗口。
本实施例中,确定待调用接口的接口标识,根据接口标识从缓存中查询待调用接口在每个滑动时间窗口的调用阈值。具体的,图2为本申请实施例提供的接口标识与调用阈值的存储结构示意图,如图2所示,本实施例中接口标识与调用阈值以列表形式存储,首先根据待调用接口从对列表的表头中查询相匹配的接口标识,然后将接口标识对应的调用阈值作为待调用接口在滑动时间窗口内的调用阈值。
例如:m1是付款接口的接口标识,其在滑动时间窗口的调用阈值n1为500次,m2是生成订单接口的接口标识,其在滑动时间窗口的调用阈值n2为550次,m3是店铺收藏接口的接口标识,其在滑动时间窗口的调用阈值n3为300次。
本实施例中,当缓存中不存在待调用接口的调用阈值时,根据接口标识从数据库中读取待调用接口的调用阈值,并将待调用接口的调用阈值同步至缓存,并为调用阈值分配过期时间。本申请实施例通过先访问缓存,能够降低数据库的压力,避免同时访问数据库,导致数据库拥堵。另外,为调用阈值分配过期时间能够防止缓存的内容占用过多。
为了进行精准的限流,本申请获取当前时间戳以微秒为单位,然后确定当前时间戳与当前时间窗口的第一时间区间,其中第一时间区间的时间长度与滑动时间窗口的时间长度相等。
然后统计第一时间区间内待调用接口的调用次数。图3为本申请实施例提供的滑动时间窗口的示意图,如图3所示,当前时间戳为now Tu,当前时间戳与滑动时间窗口的第一时间区间为now Tu-period*1000*1000—now Tu。
可选的,统计第一时间区间内待调用接口的调用次数,具体通过一以下方式实现:确定起始时间至当前时间戳的第二时间区间;获取第二时间区间内待调用接口的第二调用次数;计算第二时间区间减去第一时间区间后得到的第三时间区间;统计第三时间区间内待调用接口的第三调用次数;计算第二调用次数与第三调用次数的差值,根据差值确定第一调用次数。
以付款接口为例,起始时间至当前时间戳的第二时间区间为0—now Tu,第二时间区间内付款接口的第二调用次数(即总调用次数)为1600次,然后计算第二时间区间减去第一时间区间后得到的第三时间区间为0—now Tu-period*1000*1000。统计得到第三时间区间内付款接口的第三调用次数为1000次,此时采用第二调用次数与第三调用次数作差,即1600次-1000次,将得到的差值确定为第一时间区间内付款接口的第一调用次数,即600次。
如上述示例,600次大于500次,即确认第一调用次数大于调用阈值时,执行限流操作。
可选的,执行限流操作,可以是:获取第一调用次数中大于调用阈值的第三调用次数,拒绝所述第三调用次数对应数量的调用请求。例如:拒绝调用次数为501-600对应的调用请求。
或,将第三调用次数对应数量的调用请求放入队列,并按照调用请求的优先级进行排序。如上述示例,将调用次数为501-600对应的调用请求放入队列,确定调用请求的优先级,优先级可以是按照时间排序,也可以确定调用请求对应的会员信息,例如会员等级等等。
本实施例中,当第一调用次数小于或等于所述调用阈值时,将待调用接口的接口标识作为键名添加至缓存中的有序集,并在有序集中将接口标识对应的权重值以及键值更新为当前时间戳。同时为待调用接口的接口标识添加过期时间。避免一段时间内此接口未调用,造成缓存的内存过高。
本实施例中,通过将待调用接口的接口标识作为键名添加至缓存中的有序集,并在有序集中将接口标识对应的权重值以及键值更新为当前时间戳。能够便于后续依据有序集(zset)统计执行限流的时间区间以及未执行限流的时间区间。具体的,可以将有序集中权重值确定未执行限流操作的时间区间以及执行限流操作的时间区间。
作为一个示例,可以通过统计有序集(zset)的权重值(score),确定某些服务接口在特定时间段滑动时间窗口的调用阈值。
例如:通过统计有序集(zset)的权重值(score),确定付款接口在21:00-22:00中对应有90%的滑动时间窗口执行限流操作,由此可以将付款接口在21:00-22:00的滑动时间窗口对应的调用阈值增加,保证用户的体验。
作为一个示例,还可以通过统计有序集(zset)中的权重值(score),确定某些服务接口在特定时间段内不设置滑动时间窗口,或在该时间段内增加滑动时间窗口的时间长度。
例如:通过统计24小时内有序集(zset)中的权重值(score),能够确定商品收藏接口在2:00am-11:00am中对应有98%的滑动时间窗口没有执行限流操作。由此,可以将商品收藏接口在2:00am-11:00am这一时间段的滑动时间窗口的时间长度增加,或在2:00am-11:00am这一时间段不为商品收藏接口设置滑动时间窗口。
作为一个示例,还可以通过分析有序集(zset)中的权重值(score),确定某些服务接口在特定时间段将滑动时间窗口的时间长度缩短。
例如:购物狂欢节的凌晨,在保证调用阈值不变的情况下,将商品收藏、添加购物车、付款以及生成订单等接口的滑动时间窗口的时间长度缩短,以此能够应对突发流量,进行有效的限流。
图4为本申请实施例提供的一种基于服务接口的限流装置的框图,该装置可以通过软件、硬件或者两者的结合实现成为电子设备的部分或者全部。如图4所示,该装置包括:
确定模块41,用于确定待调用接口在滑动时间窗口内的调用阈值;
获取模块42,用于根据当前时间戳以及滑动时间窗口确定第一时间区间;
统计模块43,用于统计第一时间区间内待调用接口的第一调用次数;
执行模块44,用于当第一调用次数大于调用阈值时,执行限流操作。
本申请实施例还提供一种电子设备,如图5所示,电子设备可以包括:处理器1501、通信接口1502、存储器1503和通信总线1504,其中,处理器1501,通信接口1502,存储器1503通过通信总线1504完成相互间的通信。
存储器1503,用于存放计算机程序;
处理器1501,用于执行存储器1503上所存放的计算机程序时,实现上述实施例的步骤。
上述电子设备提到的通信总线可以是外设部件互连标准(Peripheral ComponentInterconnect,P C I)总线或扩展工业标准结构(Extended Industry StandardArchitecture,EISA)总线等。该通信总线可以分为地址总线、数据总线、控制总线等。为便于表示,图中仅用一条粗线表示,但并不表示仅有一根总线或一种类型的总线。
通信接口用于上述电子设备与其他设备之间的通信。
存储器可以包括随机存取存储器(Random Access Memory,RAM),也可以包括非易失性存储器(Non-Volatile Memory,NVM),例如至少一个磁盘存储器。可选的,存储器还可以是至少一个位于远离前述处理器的存储装置。
上述的处理器可以是通用处理器,包括中央处理器(Central Processing Unit,CPU)、网络处理器(Network Processor,NP)等;还可以是数字信号处理器(DigitalSignalProcessing,DSP)、专用集成电路(Application Specific Integrated Circuit,ASIC)、现场可编程门阵列(Field-Programmable Gate Array,FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。
本申请还提供一种计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现以上述步骤。
需要说明的是,对于上述装置、电子设备及计算机可读存储介质实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
进一步需要说明的是,在本文中,诸如“第一”和“第二”等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
以上所述仅是本发明的具体实施方式,使本领域技术人员能够理解或实现本发明。对这些实施例的多种修改对本领域的技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本发明的精神或范围的情况下,在其它实施例中实现。因此,本发明将不会被限制于本文所示的这些实施例,而是要符合与本文所申请的原理和新颖特点相一致的最宽的范围。