[0084] 确定所述当前值与预设升级系数的乘积,得到容量上调值。其中,预设升级系数可以根据实际需要进行设定,例如可以是0.5、1等。本说明书实施例中,预设升级系数可以是固定的数值,也可以是变化的数值。例如,(预设异常事件率阈值-异常事件率)≤B1时,预设降级系数f2取值为p1,B1<(预设异常事件率阈值-异常事件率)
[0085] 确定所述当前值与所述容量上调值的和值,所述当前值与所述容量上调值的和值作为升级处理后的所述令牌存储容量上限的值。即升级处理后的令牌存储容量上限的值=C1+C1*f2,其中,C1表示令牌存储容量上限的当前值;f2表示预设升级系数。
[0086] 实际应用中,会经过线下容量评估以确定第二服务节点所对应令牌存储池的令牌存储容量上限的初始值,该初始值一般为令牌存储容量上限的最大值,可以将线下评估确定的初始值存储在配置数据库中。在进行升级处理时,在将当前值与所述容量上调值的和值作为升级处理后的所述令牌存储容量上限的值之前,可以从配置数据库中获取第二服务节点所对应令牌存储池的令牌存储容量上限的初始值,判断当前值与所述容量上调值的和值是否超过令牌存储容量上限的初始值,若未超过令牌存储容量上限的初始值,则可以将当前值与所述容量上调值的和值作为升级处理后的所述令牌存储容量上限的值;若超过令牌存储容量上限的初始值,则将令牌存储容量上限的初始值作为升级处理后的所述令牌存储容量上限的值。
[0087] S303,获取所述第二服务节点所对应的令牌生产进程的心跳信息。
[0088] 本说明书实施例中,第二服务节点所对应的令牌生产进程可以分布式部署在多台机器,每台机器可以部署多个该令牌生产进程,且每台机器的每个该令牌生产进程都会上报心跳信息,该上报的心跳信息可以存储在Key-Value数据库如redis或者关系型数据库如MySQL中。如此,当某个该令牌生产进程挂了时,可以使用其他该令牌生产进程继续生产令牌;当某个机器挂了,可以使用其他机器上的该令牌生产进程继续生产令牌。
[0089] S305,根据所述心跳信息,确定存活的令牌生产进程的第一数量。
[0090] 具体的,一个心跳信息代表一个存活的上述令牌生产进程,通过统计获取到的心跳信息可以确定当前存活的令牌生产进程的数量作为第一数量。
[0091] S307,根据所述第一数量和目标值,确定每个所述存活的令牌生产进程的令牌生产速率。
[0092] 具体的,将目标值除以第一数量可以得到每个存活的上述令牌生产进程的令牌生产速率。例如,目标值为100qps,存活的上述令牌生产进程的第一数量为2,则每个存活的上述令牌生产进程的令牌生产速率=100qps/2=50qps。
[0093] S309,将每个所述存活的令牌生产进程根据所述令牌生产速率生产的令牌存入所述令牌存储池中。
[0094] 本说明书实施例中,令牌存储池中的令牌存储可以采用队列形式,通过队列可以保证消耗的令牌不会超过令牌存储池中已有令牌的总数,也可以减少使用的复杂度和代码侵入性。
[0095] S207,针对所述第一服务节点发送的令牌申请请求,根据调整后的令牌存储容量上限确定所述第一服务节点的令牌申请是否成功。
[0096] 本说明书实施例中,第一服务节点在向第二服务节点发送业务请求之前,需要向流量控制服务器申请相应的令牌,只有在申请到令牌的情况下,才能向第二服务节点发送该业务请求。流量控制服务器针对第一服务节点发送的令牌申请请求,可以根据调整后的令牌存储容量上限来确定第一服务节点的令牌申请是否成功。具体的实施中,步骤S207可以包括:
[0097] 接收第一服务节点发送的令牌申请请求;所述令牌申请请求包括申请的令牌数量。
[0098] 根据调整后的令牌存储容量上限,判断所述令牌存储池中的令牌数量是否与所申请的令牌数量相匹配。
[0099] 在判断的结果为是时,确定所述第一服务节点的令牌申请成功。具体的,当令牌存储池中的令牌数量超过所申请的令牌数量时,表明令牌存储池中的令牌数量与所申请的令牌数量相匹配,此时可以确定第一服务节点的令牌申请成功,可以执行步骤S209;当令牌存储池中的令牌数量小于所申请的令牌数量时,表明令牌存储池中的令牌数量与所申请的令牌数量不匹配,此时可以确定第一服务节点的令牌申请失败。
[0100] S209,在确定所述第一服务节点的令牌申请成功时,向所述第一服务节点返回所述令牌申请成功的响应消息。
[0101] 其中,所述令牌申请成功的响应消息用于触发所述第一服务节点执行所述业务请求事件。
[0102] 本说明书实施例中,当确定第一服务节点的令牌申请成功时,生成令牌申请成功的响应消息,该响应消息中可以携带所申请的令牌数量的令牌,并向第一服务节点返回该令牌申请成功的响应消息,第一服务节点在接收到该令牌申请成功的响应消息后,可以执行向第二服务节点发送业务请求的事件即发起对第二服务节点的相应应用程序编程接口的调用。具体的实施中,在向第一服务节点返回令牌申请成功的响应消息后,可以将令牌存储池中的令牌数量减少所申请的令牌数量。
[0103] 实际应用中,当确定第一服务节点的令牌申请失败时,还可以向第一服务节点返回令牌申请失败的响应消息,第一服务节点在接收到该令牌申请失败的响应消息后对相应的业务请求进行丢弃,从而可以调整对第二服务节点的调用
频率。
[0104] 可以理解的,实际的流量控制过程中,当异常事件率超过预设异常事件率阈值时,对令牌存储池的令牌存储容量上限的一次降级处理往往很难将异常事件率控制在预设异常事件率阈值以下,因此,本发明实施例的上述实现流量控制的方法实际是一个动态调控的过程,即当异常事件率超过预设异常事件率阈值时,对第二服务节点所对应的令牌存储池的令牌存储容量上限进行降级处理,降级处理后可以继续执行上述方法中异常事件率的比对,如果异常事件率仍超过预设异常事件率阈值,则对第二服务节点所对应的令牌存储池的令牌存储容量上限继续进行降级处理,直至异常事件率未超过预设异常事件率阈值。在异常事件率未超过预设异常事件率阈值时,可以对第二服务节点所对应的令牌存储池的令牌存储容量上限进行升级处理,直至令牌存储容量上限到达初始值。
[0105] 请参阅图4a和图4b,其所示为采用本发明实施例提供的实现流量控制的方法进行流量控制的测试效果图,横坐标为时间,纵坐标为每分钟第一服务节点对第二服务节点的调用次数即业务请求事件总数。
[0106] 其中,图4a模拟过载流量:480-500qps,在17:32开启限流功能,可以看到第一服务节点对第二服务节点的请求频率从500qps被限制为了100qps。图4b中,在21:15模拟第二服务节点出现70%的超时率,在21:22超时率开始恢复,可以看到第一服务节点对第二服务节点发起的请求次数先是逐步衰减,在21:22-21:28的时间,请求次数逐步恢复正常。
[0107] 由本发明实施例的上述技术方案可见,本发明实施例可以根据被调用方即第二服务节点的服务状态对第二服务节点所承受的流量进行动态的控制,避免了被调用方大规模异常时对网络连接的占用,进而有效避免了整个业务的雪崩效应的出现。
[0108] 此外,本发明实施例还能够在业务请求量突增时,有效的判断被调用的服务节点的容量阈值,通过限流避免对被调用的服务节点产生影响。
[0109] 与上述几种实施例提供的实现流量控制的方法相对应,本发明实施例还提供一种实现流量控制的装置,由于本发明实施例提供的实现流量控制的装置与上述几种实施例提供的实现流量控制的方法相对应,因此前述实现流量控制的方法的实施方式也适用于本实施例提供的实现流量控制的装置,在本实施例中不再详细描述。
[0110] 请参阅图5,其所示为本发明实施例提供的一种实现流量控制的装置的结构示意图,该装置具有实现上述方法实施例中实现流量控制的方法的功能,所述功能可以由
硬件实现,也可以由硬件执行相应的软件实现。如图5所示,该装置可以包括:
[0111] 第一确定模块510,用于确定业务请求事件中的异常事件率,所述业务请求事件是指第一服务节点向第二服务节点发送业务请求的事件;
[0112] 比对模块520,用于将所述异常事件率与预设异常事件率阈值进行比对;
[0113] 调整模块530,用于根据比对的结果,对所述第二服务节点所对应的令牌存储池的令牌存储容量上限进行调整;
[0114] 第二确定模块540,用于针对所述第一服务节点发送的令牌申请请求,根据调整后的令牌存储容量上限确定所述第一服务节点的令牌申请是否成功;
[0115] 返回模块550,用于在确定所述第一服务节点的令牌申请成功时,向所述第一服务节点返回所述令牌申请成功的响应消息,所述令牌申请成功的响应消息用于触发所述第一服务节点执行所述业务请求事件。
[0116] 在一个可选的实施方式中,调整模块530可以包括:
[0117] 第三确定模块,用于根据比对的结果,确定所述第二服务节点所对应的令牌存储池的令牌存储容量上限的目标值;
[0118] 第一获取模块,用于获取所述第二服务节点所对应的令牌生产进程的心跳信息;
[0119] 第四确定模块,用于根据所述心跳信息,确定存活的令牌生产进程的第一数量;
[0120] 第五确定模块,用于根据所述第一数量和目标值,确定每个所述存活的令牌生产进程的令牌生产速率;
[0121] 存储模块,用于将每个所述存活的令牌生产进程根据所述令牌生产速率生产的令牌存入所述令牌存储池中。
[0122] 在一个可选的实施方式中,第三确定模块可以包括:
[0123] 降级处理模块,用于在比对的结果为所述异常事件率超过所述预设异常事件率阈值时,对所述第二服务节点所对应的令牌存储池的令牌存储容量上限进行降级处理,将降级处理后的所述令牌存储容量上限的值作为所述目标值;
[0124] 第一判断模块,用于在比对的结果为所述异常事件率未超过所述预设异常事件率阈值时,判断所述第二服务节点所对应的令牌存储池的令牌存储容量上限的当前值是否达到所述令牌存储容量上限的初始值;
[0125] 升级处理模块,用于在第一判断模块判断的结果为否时,对所述令牌存储池的令牌存储容量上限进行升级处理,将升级处理后的所述令牌存储容量上限的值作为所述目标值。
[0126] 在一个可选的实施方式中,降级处理模块可以包括:
[0127] 第二获取模块,用于获取所述第二服务节点所对应的令牌存储池的令牌存储容量上限的当前值;
[0128] 第六确定模块,用于确定所述当前值与预设降级系数的乘积,得到容量下调值;
[0129] 第七确定模块,用于确定所述当前值与所述容量下调值的差值,所述当前值与所述容量下调值的差值作为降级处理后的所述令牌存储容量上限的值。
[0130] 在一个可选的实施方式中,所述升级处理模块包括:
[0131] 第三获取模块,用于获取所述第二服务节点所对应的令牌存储池的令牌存储容量上限的当前值;
[0132] 第八确定模块,用于确定所述当前值与预设升级系数的乘积,得到容量上调值;
[0133] 第九确定模块,用于确定所述当前值与所述容量上调值的和值,所述当前值与所述容量上调值的和值作为升级处理后的所述令牌存储容量上限的值。
[0134] 在一个可选的实施方式中,第一确定模块510可以包括:
[0135] 第四获取模块,用于获取预设时间间隔内的业务请求事件所对应的请求时长;
[0136] 第十确定模块,用于确定所述请求时长超过预设时长的业务请求事件的第二数量;
[0137] 第十一确定模块,用于确定所述第二数量与所述预设时间间隔内的业务请求事件的总数量的比值,将所述比值作为所述异常事件率。
[0138] 在一个可选的实施方式中,第二确定模块540可以包括:
[0139] 接收模块,用于接收第一服务节点发送的令牌申请请求;所述令牌申请请求包括申请的令牌数量;
[0140] 第二判断模块,用于根据调整后的令牌存储容量上限,判断所述令牌存储池中的令牌数量是否与所申请的令牌数量相匹配;
[0141] 第十二确定模块,用于在第二判断模块判断的结果为是时,确定所述第一服务节点的令牌申请成功。
[0142] 需要说明的是,上述实施例提供的装置,在实现其功能时,仅以上述各功能模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能模块完成,即将设备的内部结构划分成不同的功能模块,以完成以上描述的全部或者部分功能,如图6提供的另一种实现流量控制的装置的结构示意图,该装置可以包括:令牌存储模块610,令牌生产模块620,令牌中控模块630、动态限流模块640和初始化配置模块650。
[0143] 其中,令牌存储模块610可以存储第二服务节点所对应的令牌,并可以用于执行图5中第二确定模块540和返回模块550的相应功能。
[0144] 令牌生产模块620和令牌中控模块630可以用于执行图5中调整模块530的相应功能。具体的,令牌中控模块630可以根据动态限流模块640同步过来的信息以及令牌生产模块620中存活的令牌生产进程数量安排令牌生产模块620中每个机器的每个存活的令牌生产进程具体每秒给第二服务节点生产令牌的数量。
[0145] 动态限流模块640可以包括Elasticsearch、接口异常率统计模块和阈值判断动态限流模块,其中,Elasticsearch可以用于请求日志的存储;接口异常率统计模块可以用于执行图5总第一确定模块510的相应功能;阈值判断动态限流模块可以用于执行图5中比对模块520的相应功能,并将比对结果同步到令牌中控模块630。
[0146] 初始化配置模块650可以用于存储第二服务节点所对应的令牌存储池的令牌存储容量上限的初始值。例如,第二服务节点经过线下容量评估只能到100qps,则初始化配置模块里就存储100qps的数值作为上述的初始值。
[0147] 另外,上述实施例提供的装置与方法实施例属于同一构思,其具体实现过程详见方法实施例,这里不再赘述。
[0148] 本发明实施例的实现流量控制的装置通过业务请求事件中的异常事件率与预设异常事件率阈值的比对结果来对第二服务节点所对应的令牌存储池的令牌存储容量上限进行调整,进而针对第一服务节点发送的令牌申请请求,可以根据调整后的令牌存储容量上限来确定该第一服务节点的令牌申请是否成功,并在确定令牌申请成功时,向该第一服务节点返回用于触发该第一服务节点执行业务请求事件的令牌申请成功的响应消息,从而实现根据被调用方(即第二服务节点)的服务状态对流量进行控制,避免了被调用方大规模异常时对网络连接的占用,进而有效避免了整个业务的雪崩效应的出现。
[0149] 此外,本发明实施例的实现流量控制的装置还能够在业务请求量突增时,有效的判断被调用的服务节点的容量阈值,通过限流避免对被调用的服务节点产生影响。
[0150] 本发明实施例提供了一种服务器,该服务器包括处理器和存储器,该存储器中存储有至少一条指令、至少一段程序、代码集或指令集,该至少一条指令、该至少一段程序、该代码集或指令集由该处理器加载并执行以实现如上述方法实施例所提供的实现流量控制的方法。
[0151] 存储器可用于存储软件程序以及模块,处理器通过运行存储在存储器的软件程序以及模块,从而执行各种功能应用以及流量控制。存储器可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、功能所需的应用程序等;存储数据区可存储根据所述设备的使用所创建的数据等。此外,存储器可以包括高速
随机存取存储器,还可以包括
非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他易失性固态存储器件。相应地,存储器还可以包括存储器
控制器,以提供处理器对存储器的访问。
[0152] 本发明实施例所提供的方法实施例可以在计算机终端、服务器或者类似的运算装置中执行。以运行在服务器上为例,图7是本发明实施例提供的运行一种实现流量控制的方法的服务器的硬件结构框图,如图7所示,该服务器700可因配置或性能不同而产生比较大的差异,可以包括一个或一个以上
中央处理器(Central Processing Units,CPU)710(处理器710可以包括但不限于
微处理器MCU或
可编程逻辑器件FPGA等的处理装置)、用于存储数据的存储器730,一个或一个以上存储应用程序723或数据722的存储介质720(例如一个或一个以上海量存储设备)。其中,存储器730和存储介质720可以是短暂存储或持久存储。存储在存储介质720的程序可以包括一个或一个以上模块,每个模块可以包括对服务器中的一系列指令操作。更进一步地,中央处理器710可以设置为与存储介质720通信,在服务器700上执行存储介质720中的一系列指令操作。服务器700还可以包括一个或一个以上电源
760,一个或一个以上有线或无线网络接口750,一个或一个以上输入输出接口740,和/或,一个或一个以上操作系统721,例如Windows ServerTM,Mac OS XTM,UnixTM,LinuxTM,FreeBSDTM等等。
[0153] 输入输出接口740可以用于经由一个网络接收或者发送数据。上述的网络具体实例可包括服务器700的通信供应商提供的无线网络。在一个实例中,输入输出接口740包括一个
网络适配器(Network Interface Controller,NIC),其可通过基站与其他网络设备相连从而可与互联网进行通讯。在一个实例中,输入输出接口740可以为射频(Radio Frequency,RF)模块,其用于通过无线方式与互联网进行通讯。
[0154] 本领域普通技术人员可以理解,图7所示的结构仅为示意,其并不对上述
电子装置的结构造成限定。例如,服务器700还可包括比图7中所示更多或者更少的组件,或者具有与图7所示不同的配置。
[0155] 本发明的实施例还提供了一种计算机可读存储介质,所述存储介质可设置于终端之中以保存用于实现一种实现流量控制的方法相关的至少一条指令、至少一段程序、代码集或指令集,该至少一条指令、该至少一段程序、该代码集或指令集由该处理器加载并执行以实现上述方法实施例提供的实现流量控制的方法。
[0156] 可选地,在本实施例中,上述存储介质可以包括但不限于:U盘、
只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、移动
硬盘、磁碟或者光盘等各种可以存储程序代码的介质。
[0157] 需要说明的是:上述本发明实施例先后顺序仅仅为了描述,不代表实施例的优劣。且上述对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
[0158] 本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于装置实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
[0159] 本领域普通技术人员可以理解实现上述实施例的全部或部分步骤可以通过硬件来完成,也可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算机可读存储介质中,上述提到的存储介质可以是只读存储器,磁盘或光盘等。
[0160] 以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何
修改、等同替换、改进等,均应包含在本发明的保护范围之内。