基于JAVA的系统自适应限流方法、装置及存储介质转让专利

申请号 : CN202210939923.8

文献号 : CN115114133B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 刘佳陈学森

申请人 : 广东车海洋环保科技有限公司

摘要 :

本发明公开了一种基于JAVA的系统自适应限流方法、装置及存储介质,该方法包括:创建系统健康度模型;设定系统健康度的采集方式及采集点;计算得到系统健康度良好状态的基准量化值;在系统健康度采集点按相应采集方式分别进行数据采集;对分别采集到的数据根据系统健康度模型进行系统健康度评估,分别得到系统健康度级别;分别判断系统健康度级别,当某一系统健康度级别为告警时,对系统接到的对应请求进行服务降级处理。本发明基于指标数值计算得到系统合理限流阈值,使系统充分利用服务器资源,降低运维成本,在最大可控的负载下保持健壮,提供最大的服务能力。

权利要求 :

1.一种基于JAVA的系统自适应限流方法,其特征在于,其包括以下步骤:S1、创建系统健康度模型;

系统健康度模型包括计算健康度模型及存储健康度模型;

所述计算健康度模型为:

C=max(Jm,Wn)(1)

其中,C为计算健康度,Jm为JVM计算健康度,具体为:其中,m为JVM堆内存已使用量占比,Jm为JVM计算健康度;

Wn为物理机计算健康度,具体为:

其中,n为物理机CPU或内存已使用量占比,Wn为物理机计算健康度;

所述存储健康度模型为:

其中,Dt为存储健康度,t为应用程序读取访问数据库链路的往返时间,T0为系统启动后应用程序平稳查询读取访问数据库链路的往返时间;

S2、设定系统健康度的采集方式及采集点;

所述系统健康度包括计算健康度及存储健康度;计算健康度的采集点为JVM堆内存及物理机CPU或内存,采集方式为按照第一标定时限间隔及第一标定次数,分别进行JVM堆内存已使用量及物理机CPU或内存已使用量的采集并记录;存储健康度的采集点在应用程序与数据库交互的链路上,采集方式为按照第二标定时限间隔及第二标定次数,使用AOP进行切面记录数据往返时间的采集并记录;

S3、计算得到系统健康度的基准量化值,具体步骤为:S31、采集计算JVM堆内存总量,得到JVM计算健康度基准量化值;

S32、采集计算物理机CPU或内存总量,得到物理机计算健康度基准量化值;

S33、使用AOP进行切面记录数据往返时间,计算得到存储健康度基准量化值,具体为:S331、在需要监测的方法路径上使用AOP进行切面记录数据往返时间;

S332、每间隔第二标定时限采集一次,共采集第二标定次数,得到第二标定次数个往返时间记录;

S333、对得到的往返时间记录进行平均值计算,得到往返时间平均值;

S334、将得到的往返时间平均值保存到redis中,并判断当前redis中是否有历史记录,如果没有,则令当前值为存储健康度基准量化值,即系统启动后应用程序平稳查询读取访问数据库链路的往返时间T0;

S4、在系统健康度采集点按相应采集方式分别进行数据采集;

S5、对分别采集到的数据根据系统健康度模型进行系统健康度评估,分别得到系统健康度级别,具体步骤包括:S51、采集评估得到计算健康度级别,具体为:

S511、将采集到的JVM堆内存已使用量计算平均值,并将平均值与JVM堆内存总量相比,得到JVM堆内存已使用量占比m,根据JVM计算健康度模型,得到JVM计算健康度Jm;

S512、将采集到的物理机CPU或内存已使用量计算平均值,并将平均值与物理机CPU或内存总量相比,得到物理机CPU或内存已使用量占比n,根据物理机计算健康度模型,得到物理机计算健康度Wn;

S513、将JVM计算健康度Jm及物理机计算健康度Wn代入计算健康度模型,求出max(Jm,Wn),即取Jm与Wn中的最大值为计算健康度C;

S514、令C=1时,计算健康度级别为良好;令C=2时,计算健康度级别为忙碌;令C=3时,计算健康度级别为告警;

S52、采集评估得到存储健康度级别,具体为:

S521、将按照采集方式采集得到的多个往返时间记录进行平均值计算,得到应用程序读取访问数据库链路的往返时间t;

S522、将得到的往返时间t与redis中存储健康度基准量化值T0代入存储健康度模型,得到存储健康度Dt;

S523、令Dt=1时,存储健康度级别为良好;令Dt=2时,存储健康度级别为忙碌;令Dt=

3时,存储健康度级别为告警;

S6、分别判断系统健康度级别,当某一系统健康度级别为告警时,对系统接到的对应请求进行服务降级处理。

2.根据权利要求1所述的基于JAVA的系统自适应限流方法,其特征在于,所述步骤S6中分别判断系统健康度级别,当某一系统健康度级别为告警时,对系统接到的对应请求进行服务降级处理,具体步骤为:S61、判断计算健康度级别:当计算健康度级别为告警时,对系统接到的访问层请求进行按几率拒绝部分请求的服务降级处理;

S62、判断存储健康度级别:当存储健康度级别为告警时,对系统接到的数据库请求进行只是将一部分数据放入rabbitMQ队列中的服务降级处理。

3.根据权利要求1所述的基于JAVA的系统自适应限流方法,其特征在于,所述第一标定时限间隔为10秒,所述第一标定次数为7次;所述第二标定时限间隔为10秒,所述第二标定次数为7次。

4.一种基于JAVA的系统自适应限流装置,其特征在于,包括:创建单元:用于创建系统健康度模型及系统健康度的采集方式及采集点;所述系统健康度模型包括计算健康度模型及存储健康度模型;

还包括设置系统服务降级处理的基础信息,包括影响到计算健康度的请求访问层的方法路径用于服务降级后拒绝部分请求及设置影响存储健康度的一些表操作方法路径;

获取单元,用于获取存储健康度良好级别时的系统基准量化值,及按照设定的系统健康度的采集方式及采集点对系统健康度的当前值进行获取采集;

检查单元,用于根据系统健康度模型及获取的系统基准量化值及系统当前值,通过计算,检查系统健康度,获取当前系统的计算健康度及存储健康度情况;

限流单元,用于根据当前系统的健康度情况,通过回调的方式告知应用系统,应用系统根据得到的信息做相应的服务降级处理。

5.一种计算机可读的存储介质,所述存储介质包括存储的程序,其特征在于,所述程序运行时执行所述权利要求1至3任一项中所述的方法。

说明书 :

基于JAVA的系统自适应限流方法、装置及存储介质

技术领域

[0001] 本发明属于系统限流领域,尤其涉及一种基于JAVA的系统自适应限流方法、装置及存储介质。

背景技术

[0002] 限流是流量限速(Rate Limit)的简称,是指只允许指定的事件进入系统,超过的部分将被拒绝服务、排队或等待、降级等处理。对于server服务而言,限流为了保证一部分的请求流量可以得到正常的响应,总好过全部的请求都不能得到响应,甚至导致系统雪崩。
[0003] 限流的常用处理手段有:计数器、漏桶、令牌桶。计数器:一种比较简单的限流算法,用途比较广泛。在一段时间内,进行计数,与阈值进行比较。漏桶:请求先进入到漏桶里,漏桶以一定的速度出水,当水流入速度过大会直接溢出,可以看出漏桶算法能强行限制数据的传输速率。令牌桶:在令牌桶算法中有一个程序以某种恒定的速度生成令牌,并存入令牌桶中,而每个请求需要先获取令牌才能执行。
[0004] 现有的限流手段都有一个共同的缺点:都需要系统发布前手动设置一个固定的限流阈值。首先这个阈值是需要预测评估的,往往准确的阈值评估是比较难的,不准确的阈值可能会使系统宕机或无法充分的利用服务器资源;其次每次系统更新或迁移至新的服务器上又需要重新评估,是比较繁琐与复杂的。
[0005] 因此,设计一种基于系统自身指标数值自动计算得到一个合理的限流阈值,并对系统服务器资源进行针对性自适应限流的方法成为研究的方向。

发明内容

[0006] 为了解决现有技术存在的不足,本发明提供了一种基于JAVA的系统自适应限流方法、装置及存储介质,该方法通过基于系统自身指标数值的计算得到合理的限流阈值,使系统充分利用服务器资源,降低运维成本,在最大可控的负载下保持健壮,提供最大的服务能力。
[0007] 为了实现上述目的,本发明的一个实施方式的一种基于JAVA的系统自适应限流方法,包括以下步骤:
[0008] S1、创建系统健康度模型;
[0009] S2、设定系统健康度的采集方式及采集点;
[0010] S3、计算得到系统健康度的基准量化值;
[0011] S4、在系统健康度采集点按相应采集方式分别进行数据采集;
[0012] S5、对分别采集到的数据根据系统健康度模型进行系统健康度评估,分别得到系统健康度级别;
[0013] S6、分别判断系统健康度级别,当某一系统健康度级别为告警时,对系统接到的对应请求进行服务降级处理。
[0014] 进一步地,所述步骤S1中系统健康度模型包括计算健康度模型及存储健康度模型;
[0015] 所述计算健康度模型为:
[0016] C= max ( Jm ,Wn)                                           (1)[0017] 其中,C为计算健康度,Jm为JVM计算健康度,Wn为物理机计算健康度;
[0018] 所述存储健康度模型为:
[0019]
[0020] 其中,Dt为存储健康度,t为应用程序读取访问数据库链路的往返时间,T0为系统启动后应用程序平稳查询读取访问数据库链路的往返时间。
[0021] 进一步地,所述JVM计算健康度模型为:
[0022]
[0023] 其中,m为JVM堆内存已使用量占比,Jm为JVM计算健康度;
[0024] 所述物理机计算健康度模型为:
[0025]
[0026] 其中,n为物理机CPU或内存已使用量占比,wn为物理机计算健康度。
[0027] 进一步地,所述步骤S2中系统健康度包括计算健康度及存储健康度;
[0028] 计算健康度的采集点为JVM堆内存及物理机CPU或内存,采集方式为按照第一标定时限间隔及第一标定次数,分别进行JVM堆内存已使用量及物理机CPU或内存已使用量的采集并记录;
[0029] 存储健康度的采集点在应用程序与数据库交互的链路上,采集方式为按照第二标定时限间隔及第二标定次数,使用AOP进行切面记录数据往返时间的采集并记录。
[0030] 进一步地,所述步骤S3中计算得到系统健康度的基准量化值,具体步骤为:
[0031] S31、采集计算JVM堆内存总量,得到JVM计算健康度基准量化值;
[0032] S32、采集计算物理机CPU或内存总量,得到物理机计算健康度基准量化值;
[0033] S33、使用AOP进行切面记录数据往返时间,计算得到存储健康度基准量化值,具体为:
[0034] S331、在需要监测的方法路径上使用AOP进行切面记录数据往返时间;
[0035] S332、每间隔第二标定时限采集一次,共采集第二标定次数,得到第二标定次数个往返时间记录;
[0036] S333、对得到的往返时间记录进行平均值计算,得到往返时间平均值;
[0037] S334、将得到的往返时间平均值保存到redis中,并判断当前redis中是否有历史记录,如果没有,则令当前值为存储健康度基准量化值,即系统启动后应用程序平稳查询读取访问数据库链路的往返时间T0。
[0038] 进一步地,所述步骤S5中对采集到的数据根据系统健康度模型进行系统健康度评估,分别得到系统健康度级别,具体步骤包括:
[0039] S51、采集评估得到计算健康度级别,具体为:
[0040] S511、将采集到的JVM堆内存已使用量的平均值与JVM堆内存总量相比,得到JVM堆内存已使用量占比m,根据JVM计算健康度模型,得到JVM计算健康度Jm;
[0041] S512、将采集到的物理机CPU或内存已使用量的平均值与物理机CPU或内存总量相比,得到物理机CPU或内存已使用量占比n,根据物理机计算健康度模型,得到物理机计算健康度wn;
[0042] S513、将JVM计算健康度Jm及物理机计算健康度wn代入计算健康度模型,求出max ( Jm ,Wn),即取Jm与wn中的最大值为计算健康度C;
[0043] S514、令C=1时,计算健康度级别为良好;令C=2时,计算健康度级别为忙碌;令C=3时,计算健康度级别为告警;
[0044] S52、采集评估得到存储健康度级别,具体为:
[0045] S521、将按照采集方式采集得到的多个往返时间记录进行平均值计算,得到应用程序读取访问数据库链路的往返时间t;
[0046] S522、将得到的往返时间t与redis中存储健康度基准量化值T0代入存储健康度模型,得到存储健康度Dt;
[0047] S523、令Dt=1时,存储健康度级别为良好;令Dt=2时,存储健康度级别为忙碌;令Dt=3时,存储健康度级别为告警;
[0048] 进一步地,所述步骤S6中分别判断系统健康度级别,当某一系统健康度级别为告警时,对系统接到的对应请求进行服务降级处理,具体步骤为:
[0049] S61、判断计算健康度级别,当计算健康度级别为告警时,对系统接到的访问层请求进行按几率拒绝部分请求的服务降级处理;
[0050] S62、判断存储健康度级别,当存储健康度级别为告警时,对系统接到的数据库请求进行只是将一部分数据放入rabbitMQ队列中的服务降级处理。
[0051] 根据本发明实施例的另一方面,还提供了一种基于JAVA语言的系统自适应限流装置,包括:
[0052] 创建单元:用于创建系统健康度模型及系统健康度的采集方式及采集点;所述系统健康度模型包括计算健康度模型及存储健康度模型;
[0053] 还包括设置系统服务降级处理的基础信息,包括影响到计算健康度的请求访问层的方法路径用于服务降级后拒绝部分请求及设置影响存储健康度的一些表操作方法路径;
[0054] 获取单元,用于获取存储健康度良好级别时的系统基准量化值,及按照设定的系统健康度的采集方式及采集点对系统健康度的当前值进行获取采集;
[0055] 检查单元,用于根据系统健康度模型及获取的系统基准量化值及系统当前值,通过计算,检查系统健康度,获取当前系统的计算健康度及存储健康度情况;
[0056] 限流单元,用于根据当前系统的健康度情况,通过回调的方式告知应用系统,应用系统根据得到的信息做相应的服务降级处理。
[0057] 根据本发明实施例的另一方面,还提供了一种计算机可读的存储介质,所述存储介质包括存储的程序,其中,所述程序运行时执行所述的方法。
[0058] 本发明的有益效果为:
[0059] 1、本发明创建了基于JAVA语言的系统的系统健康度模型,定义了健康度,并把健康度级别分为了良好、忙碌及告警三种,在流量非高峰期时健康度在良好和忙碌两种级别中跳动,流量高峰期达到告警级别时,则针对性降级限流,让系统稳定在忙碌级别,达到满足健壮性的同时又提供最大的服务能力;
[0060] 2、本发明根据JAVA语言系统的系统健康度模型,针对性设定系统健康度的采集方式及采集点,计算健康度通过定时器定时采集,存储健康度通过面向切面编程AOP切面配置采集点,并通过算法计算采集的平均值对应得到系统健康度的级别;
[0061] 3、本发明是通过计算得到当前系统健康度的基准量化值,不需要提前手动设置系统的限流阈值,即不需要事先预测评估,且每次系统更新或迁移至新的服务器上也不需要重新评估,适应系统范围广、效率高;
[0062] 4、本发明根据判断得到的系统健康度告警级别,自动对系统接到的对应请求进行服务降级处理,当计算健康度级别为告警时,对系统接到的访问层请求进行按几率拒绝部分请求的服务降级处理;当存储健康度级别为告警时,对系统接到的数据库请求进行只是将一部分数据放入rabbitMQ队列中的服务降级处理,有针对性地保证了系统处理请求效率,使系统保持健壮。

附图说明

[0063] 图1是本发明一种基于JAVA的系统自适应限流方法的流程图;
[0064] 图2是本发明一种基于JAVA的系统自适应限流方法的一个实施例应用状态的部署拓扑图;
[0065] 图3是本发明的一个实施例的应用系统与限流模块的启动调用流程示意图;
[0066] 图4是本发明的一个实施例计算健康度的的监测、采集及系统服务降级过程示意图;
[0067] 图5是本发明的一个实施例存储健康度的的监测、采集及系统服务降级过程示意图;
[0068] 图6是本发明的一个实施例计算健康度告警时系统服务降级过程示意图;
[0069] 图7是本发明的一个实施例存储健康度告警时系统服务降级过程示意图。

具体实施方式

[0070] 为使本发明的目的、技术方案和优点更为清楚,下面结合附图和实施例作进一步说明。
[0071] 需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。
[0072] 一、本发明专业术语介绍及英文缩写对应的完整英文:
[0073] 限流:流量限速(Rate Limit);健康度:当前系统的是否健康的一种状态值;应用服务器:物理机或云服务器,应用程序的载体;应用程序:为实现某些应用服务而编写的程序代码;JVM:JAVA代码运行的容器;数据库:按照数据结构来组织、存储和管理数据的仓库;AOP:全称是 Aspect Oriented Programming 即:面向切面编程。是OOP的延续,也是Spring框架中的一个重要内容,是函数式编程的一种衍生泛型。
[0074] 二、本发明提出解决方案的基本思路是基于一些指标数值计算得到一个合理的阈值,使系统充分利用服务器资源,降低运维成本,在最大可控的负载下保持健壮,提供最大的服务能力。
[0075] 本发明的一个实施方式的一种基于JAVA的系统自适应限流方法,包括以下步骤:
[0076] S1、创建系统健康度模型;
[0077] 系统健康度模型包括计算健康度模型及存储健康度模型,其中:
[0078] 计算健康度模型为:
[0079] C= max ( Jm ,Wn)                                           (1)[0080] 其中,C为计算健康度,Jm为JVM计算健康度,Wn为物理机计算健康度;
[0081] 存储健康度模型为:
[0082]
[0083] 其中,Dt为存储健康度,t为应用程序读取访问数据库链路的往返时间,T0为系统启动后应用程序平稳查询读取访问数据库链路的往返时间。
[0084] 进一步地,JVM计算健康度模型为:
[0085]
[0086] 其中,m为JVM堆内存已使用量占比,Jm为JVM计算健康度;
[0087] 物理机计算健康度模型为:
[0088]
[0089] 其中,n为物理机CPU或内存已使用量占比,wn为物理机计算健康度。
[0090] S2、设定系统健康度的采集方式及采集点;
[0091] 系统健康度包括计算健康度及存储健康度;
[0092] 计算健康度的采集点为JVM堆内存及物理机CPU或内存,采集方式为按照第一标定时限10秒间隔及采集第一标定次数7次,分别进行JVM堆内存已使用量及物理机CPU或内存已使用量的采集并记录;
[0093] 存储健康度的采集点在应用程序与数据库交互的链路上,采集方式为按照第二标定时限10秒间隔及采集第二标定次数7次,为使用AOP进行切面记录数据往返时间的采集并记录。
[0094] S3、计算得到系统健康度的基准量化值,具体步骤为:
[0095] S31、采集计算JVM堆内存总量,得到JVM计算健康度基准量化值;
[0096] S32、采集计算物理机CPU或内存总量,得到物理机计算健康度基准量化值;
[0097] S33、使用AOP进行切面记录数据往返时间,计算得到存储健康度基准量化值,具体为:
[0098] S331、在需要监测的方法路径上使用AOP进行切面记录数据往返时间;
[0099] S332、每间隔第二标定时限10秒采集一次,共采集第二标定次数7次,得到7个往返时间记录;
[0100] S333、对得到的往返时间记录进行平均值计算,得到往返时间平均值;
[0101] S334、将得到的往返时间平均值保存到redis中,并判断当前redis中是否有历史记录,如果没有,则令当前值为存储健康度基准量化值,即系统启动后应用程序平稳查询读取访问数据库链路的往返时间T0。
[0102] S4、在系统健康度采集点按相应采集方式分别进行数据采集;
[0103] S5、对分别采集到的数据根据系统健康度模型进行系统健康度评估,分别得到系统健康度级别,具体步骤包括:
[0104] S51、采集评估得到计算健康度级别,具体为:
[0105] S511、将采集到的JVM堆内存已使用量计算平均值,并将平均值与JVM堆内存总量相比,得到JVM堆内存已使用量占比m,根据JVM计算健康度模型,得到JVM计算健康度Jm;
[0106] S512、将采集到的物理机CPU或内存已使用量计算平均值,并将平均值与物理机CPU或内存总量相比,得到物理机CPU或内存已使用量占比n,根据物理机计算健康度模型,得到物理机计算健康度wn;
[0107] S513、将JVM计算健康度Jm及物理机计算健康度wn代入计算健康度模型,求出max ( Jm ,Wn),即取Jm与wn中的最大值为计算健康度C;
[0108] S514、令C=1时,计算健康度级别为良好;令C=2时,计算健康度级别为忙碌;令C=3时,计算健康度级别为告警;
[0109] S52、采集评估得到存储健康度级别,具体为:
[0110] S521、将按照采集方式采集得到的多个往返时间记录进行平均值计算,得到应用程序读取访问数据库链路的往返时间t;
[0111] S522、将得到的往返时间t与redis中存储健康度基准量化值T0代入存储健康度模型,得到存储健康度Dt;
[0112] S523、令Dt=1时,存储健康度级别为良好;令Dt=2时,存储健康度级别为忙碌;令Dt=3时,存储健康度级别为告警;
[0113] S6、分别判断系统健康度级别,当某一系统健康度级别为告警时,对系统接到的对应请求进行服务降级处理;
[0114] 进一步地,步骤S6中分别判断系统健康度级别,当某一系统健康度级别为告警时,对系统接到的对应请求进行服务降级处理,具体步骤为:
[0115] S61、判断计算健康度级别:当计算健康度级别为告警时,对系统接到的访问层请求进行按几率拒绝部分请求的服务降级处理;
[0116] 按几率拒绝部分请求的服务降级处理举例来说,当前请求数为100,假定:按1/10的比例不允许通过,可通过数为90,则大于90的请求数量就拒绝,下一次当前请求数为90,如果还是告警状态,同样的假定则允许通过数为81,则大于81的请求数量就拒绝。
[0117] S62、判断存储健康度级别:当存储健康度级别为告警时,对系统接到的数据库请求进行只是将一部分数据放入rabbitMQ队列中的服务降级处理。
[0118] 数据库请求的服务降级处理举例来说,当前请求数:100,假定:10/1不允许通过可通过数为90,则大于90的交互数据就放到rabbitMQ中,下一次当前请求数为:90,如果还是告警状态,同样的假定则允许通过数为81,则大于81的数据交互数量就放入rabbitMQ中。
[0119] 作为本发明的另一个实施例,限流可以做为一个单独的模块被应用程序所引用,应用程序采用JAVA开发运行在JVM环境中,JVM又运行在真实的服务器(物理机)之上,应用程序会和数据进行交互完成数据交换。那么健康度监测点其一在JVM和物理机的运行指标;其二在应用程序与数据库交互的链路上。具体的部署拓扑如图2所示:
[0120] 首先定义健康度类别、指标矩阵模型,见下两表:
[0121]
[0122]
[0123] 如模型所示,定义了两类健康度:计算健康度和存储健康度,并分别为其定义了级别和量化值。在配置文件中按此模型给定义出来,这样限流模块即可获得定义的基础信息,进行后续的计算与监测。
[0124] 如附图3所示,由于限流模块是单独存在的一个模块程序,应用程序是需要引用装载的,那模块与限流模块交互采用接口的方式,主要定义的接口如下表所示:
[0125]
[0126]
[0127] 接着在应用系统根据需求实现了限流模块获得健康度信息的接口后进行启动,启动完成后调用限流模块的init方法,限流模块就开始装载配置,进行监测采集。
[0128] 如附图4所示,计算健康度的的监测方法主要采用定时器,默认为10秒(可配置)采集一次,主要采集JVM和物理机的CPU情况并把信息保存到存储系统redis中,采集7次为一个生命周期,当第7次完成采集后分项求平均值得到量化值,用量化值再对应回计算健康度的级别中确定当前级别并把级别也保存到redis中,如果确定为告警级别则回调通知应用服务器。
[0129] 如附图5所示,存储健康度的监测方法主要使用了spring的面向切面编程AOP,(Spring是一个开放源代码的设计层面框架)当应用程序在配置文件中配置好需要监测的方法路径后,限流模块读取配置使用AOP进行切面记录数据往返时间,间隔10秒(可配置)记录一次,共记录7个点后分项求平均值,如果配置了多个采集点则分别计算出平均值后再累加除以采集点数量,判断当前redis中是否有历史记录,如果没有则认为当前值为良好级别的量化值作为基础值,作为后续忙碌或告警健康度判定依据,如果后续判定为告警级别了则回调通知应用程序做一些后续处理。
[0130] 如图6、图7所示,然后限流模块会根据配置的应用访问层路径对请求进行统计监控当前系统的访问流量,另外限流模块在请求访问层和数据库插入时做了两种不同降级处理方案,其中请求访问层按几率拒绝部分请求,假如两个请求则拒绝一个2/1,或者十个请求拒绝一个10/1根据系统健康度级别动态调整即可;数据库插入时算法去请求访问层一致只是将一部分数据放入rabbitMQ队列中。
[0131] 最后当系统健康度为忙碌时则保持当前的拒绝或暂存方案,当健康度为正常时则恢复应用程序的服务能力。
[0132] 在上述实施例中:
[0133] 1、配置文件:可配置项打包配置在配置文件中;
[0134] 2、定义健康度及分类:服务器server的服务程序是否可支撑当前流量的访问,影响健康度因素主要包含两大块:其一为应用程序服务器本身的负载情况如内存、CPU、JVM等指标,其指标如果占用率太高或满负荷持续较长的时间会引起服务程序的宕机,定义为“计算健康度”;其二为访问数据库时的响应时间,假设响应时间呈上涨趋势那么意味着数据库的处理能力无法满足当前流量的存储与访问服务,继续访问数据库只会使情况更加恶劣甚至引起雪崩效应,定义为“存储健康度”;
[0135] 3、健康度级别:把健康度分为良好、忙碌、告警三种。流量非高峰期时健康度在良好和忙碌两种级别中跳动,流量高峰期会达到告警级别这时就需要降级限流让其稳定在忙碌级别达到满足健壮性的同时提供最大的服务能力;
[0136] 4、健康度定量与指标:每个级别都需要具体的指标量化,当达到什么样的数值区间则为什么样的级别;
[0137] 5、指标数值采集:计算健康度通过定时器定时采集,存储健康度通过面向切面编程AOP切面配置采集点,7次采集为一个采集周期计算其平均值;
[0138] 6、通过算法计算采集的平均值对应到健康度的级别;
[0139] 7、发生告警级别时进入降级处理流程。
[0140] 本发明是基于JAVA语言的编写并作为示例,本发明方法在其它语言也适用,只需摘除JVM的指标采集,换成物理机的内存采集即可。
[0141] 根据本发明实施例的另一方面,还提供了一种基于JAVA语言的系统自适应限流装置,包括:
[0142] 创建单元:用于创建系统健康度模型及系统健康度的采集方式及采集点;系统健康度模型包括计算健康度模型及存储健康度模型;
[0143] 还包括设置系统服务降级处理的基础信息,包括影响到计算健康度的请求访问层的方法路径、用于服务降级后拒绝部分请求及设置影响存储健康度的一些表操作方法、路径,暂存于rabbitMQ;
[0144] 获取单元,用于获取存储健康度良好级别时的系统基准量化值,及按照设定的系统健康度的采集方式及采集点对系统健康度的当前值进行获取采集;
[0145] 检查单元,用于根据系统健康度模型及获取的系统基准量化值及系统当前值,通过计算,检查系统健康度,获取当前系统的计算健康度及存储健康度情况;
[0146] 限流单元,用于根据当前系统的健康度情况,通过回调的方式告知应用系统,应用系统根据得到的信息做相应的服务降级处理。
[0147] 根据本发明实施例的另一方面,还提供了一种计算机可读的存储介质,该存储介质中存储有计算机程序,其中,该计算机程序被设置为运行时执行上述任一项方法实施例中的步骤。
[0148] 上述存储介质可以被设置为存储用于执行以下步骤的计算机程序:
[0149] S1、创建系统健康度模型;
[0150] S2、设定系统健康度的采集方式及采集点;
[0151] S3、计算得到系统健康度的基准量化值;
[0152] S4、在系统健康度采集点按相应采集方式分别进行数据采集;
[0153] S5、对分别采集到的数据根据系统健康度模型进行系统健康度评估,分别得到系统健康度级别;
[0154] S6、分别判断系统健康度级别,当某一系统健康度级别为告警时,对系统接到的对应请求进行服务降级处理。
[0155] 可选地,在本实施例中,本领域普通技术人员可以理解上述实施例的各种方法中的全部或部分步骤是可以通过程序来指令完成,该程序可以存储于一计算机可读存储介质中,存储介质可以包括:闪存盘、只读存储器(Read‑Only Memory,ROM)、随机存取器(Random Access Memory,RAM)、磁盘或光盘等。
[0156] 上述实施例中的集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在上述计算机可读取的存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在存储介质中,包括若干指令用以使得一台或多台计算机设备(可为个人计算机、服务器或者网络设备等)执行本发明各个实施例方法的全部或部分步骤。
[0157] 作为本发明的一个实施例,本发明的基于JAVA的系统自适应限流方法应用于智能洗车服务系统,该智能洗车服务系统的服务分布于全国238个城市,设有10000+智能洗车站点,会员超过2000万。作为智能洗车服务系统的数据处理中心,需要实时处理10000+智能洗车站点的2000万会员的洗车消费处理请求,并实时出具各数据统计图表及报告,系统请求受理量庞大,在未使用本发明方法前,经常出现请求流量不能得到正常响应,不定时系统宕机的情况,应用本发明限流方法后,智能洗车服务系统根据创建的系统健康度模型及计算得到的系统健康度级别,只允许指定的事件进入系统,超过的部分将被降级处理,从而限流保证了系统允许的最大部分的请求流量可以得到正常的响应,使系统充分利用服务器资源,降低运维成本,在最大可控的负载下保持健壮,提供最大的服务能力,避免了系统雪崩的可能性。
[0158] 在本申请所提供的几个实施例中,应该理解到,所揭露的客户端,可通过其它的方式实现。其中,以上所描述的装置实施例仅仅是示意性的,例如单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,单元或单元的间接耦合或通信连接,可以是电性或其它的形式。
[0159] 另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
[0160] 尽管已经示出和描述了本发明的实施例,对于本领域的普通技术人员而言,可以理解在不脱离本发明的原理和精神的情况下可以对这些实施例进行多种变化、修改、替换和变型,本发明的范围由所附权利要求及其等同物限定。
[0161] 以上对本发明及其实施方式进行了描述,这种描述没有限制性,附图中所示的也只是本发明的实施方式之一,实际的结构并不局限于此。总而言之如果本领域的普通技术人员受其启示,在不脱离本发明创造宗旨的情况下,不经创造性的设计出与该技术方案相似的结构方式及实施例,均应属于本发明的保护范围。