一种心跳检测方法及装置
文献发布时间:2023-06-19 11:49:09
技术领域
本发明涉及计算机技术领域,具体涉及一种心跳检测方法及装置。
背景技术
目前,在分布式系统中,微服务之间通过心跳机制对长连接进行保活。
以常见的开源分布式服务框架Dubbo框架为例,消费者(Consumer)会与每个生产者(Provider)建立一个TCP长连接,如果在一个心跳周期内,例如20秒,该TCP长连接上无业务交易发生,Provider就会主动发送一个心跳包给Consumer,以探测TCP长连接是否仍然健康。在Consumer集群规模比较大而整体交易量又比较小的场景中,每个Provider可能要同时跟数千甚至上万个Consumer保持TCP长连接,而这些Consumer大部分是比较空闲的,Provider会周期性地向这些空闲的Consumer发送心跳包来对TCP长连接保活。在生产实践中发现,Provider的CPU使用率会随着心跳周期的到来而规律性地飚高,导致Provider上正在处理的业务交易经常会因CPU繁忙而超时失败。
发明内容
针对现有技术中的问题,本发明实施例提供一种心跳检测方法及装置,能够至少部分地解决现有技术中存在的问题。
一方面,本发明提出一种心跳检测方法,包括:
获取生产者对应的空闲的消费者,并统计所述空闲的消费者的数量;
若所述空闲的消费者的数量大于预设值,则根据心跳检测打散规则,将所述空闲的消费者分为N个检测批次;其中,N为大于等于2的正整数;
依次对每个检测批次的消费者进行心跳检测。
另一方面,本发明提供一种心跳检测装置,包括:
统计模块,用于获取生产者对应的空闲的消费者,并统计所述空闲的消费者的数量;
第一判断模块,用于在所述空闲的消费者的数量大于预设值之后,根据心跳检测打散规则,将所述空闲的消费者分为N个检测批次;其中,N为大于等于2的正整数;
心跳检测模块,用于依次对每个检测批次的消费者进行心跳检测。
再一方面,本发明提供一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现上述任一实施例所述心跳检测方法的步骤。
又一方面,本发明提供一种计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现上述任一实施例所述心跳检测方法的步骤。
本发明实施例提供的心跳检测方法及装置,能够获取生产者对应的空闲的消费者,并统计所述空闲的消费者的数量,在空闲的消费者的数量大于预设值之后,根据心跳检测打散规则,将所述空闲的消费者分为N个检测批次,依次对每个检测批次的消费者进行心跳检测,能够避免由于同时对大量消费者进行心跳检测导致的CPU使用率瞬间飙升,减少由于心跳检测导致其他业务的超时失败,提高了系统的可靠性。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。在附图中:
图1是本发明一实施例提供的心跳检测方法的流程示意图。
图2是本发明另一实施例提供的心跳检测方法的流程示意图。
图3是本发明再一实施例提供的心跳检测方法的流程示意图。
图4是本发明一实施例提供的心跳检测装置的结构示意图。
图5是本发明另一实施例提供的心跳检测装置的结构示意图。
图6是本发明一实施例提供的电子设备的实体结构示意图。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚明白,下面结合附图对本发明实施例做进一步详细说明。在此,本发明的示意性实施例及其说明用于解释本发明,但并不作为对本发明的限定。需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互任意组合。
为了便于理解本申请提供的技术方案,下面先对本申请技术方案的相关内容进行说明。在本发明实施例中,Consumer是一个进程,Provider也是一个进程,每个Consumer有对应的IP地址和端口号,通过Consumer对应的IP地址和端口号可以与Consumer进行通信。Provider也有对应的IP地址和端口号,通过Provider对应的IP地址和端口号可以与Provider进行通信。一台物理机上可以设置至少一个Provider,每个Provider可以对应M个Consumer。其中,M为可以是大于2的正整数。物理机包括但不限于服务器。
下面以生产者服务器作为执行主体为例,来说明本发明实施例提供的心跳检测方法的具体实现过程。生产者服务器即部署Provider的服务器。
图1是本发明一实施例提供的心跳检测方法的流程示意图,如图1所示,本发明实施例提供的心跳检测方法,包括:
S101、获取生产者对应的空闲的消费者,并统计所述空闲的消费者的数量;
具体地,生产者服务器可以获得在设定时间内与Provider没有发生交易的Consumer,作为Provider对应的空闲的Consumer,然后统计Provider对应的空闲的Consumer的数量。对于空闲的Consumer需要进行心跳检测,以探测Provider与对应的Consumer之间的TCP长连接是否健康。其中,所述设定时间根据实际需要进行设置,本发明实施例不做限定。
S102、若所述空闲的消费者的数量大于预设值,则根据心跳检测打散规则,将所述空闲的消费者分为N个检测批次;其中,N为大于等于2的正整数;
具体地,所述生产者服务器在获得Provider对应的空闲的Consumer的数量之后,将Provider对应的空闲的Consumer的数量与预设值进行比较,如果Provider对应的空闲的Consumer的数量大于所述预设值,说明需要进行心跳检测的Consumer的数量较多,如果同时进行心跳检测会消耗较多的所述生产者服务器的CPU资源,存在影响所述生产者服务器的正常业务处理的风险,所述生产者服务器会根据心跳检测打散规则,将所述空闲的消费者分为N个检测批次,分批次对空闲的Consumer进行心跳检测,以降低所述生产者服务器的CPU资源的瞬间消耗,减少对其他业务的影响。其中,N为大于等于2的正整数。
S103、依次对每个检测批次的消费者进行心跳检测;其中,每个检测批次相隔预设时间。
具体地,所述生产者服务器可以依次向每个检测批次的Consumer发送心跳包,以对每个检测批次的Consumer进行心跳检测,每个检测批次之间相隔预设时间。其中,所述预设时间根据实际需要进行设置,例如设置为1秒,本发明实施例不做限定。
本发明实施例提供的心跳检测方法,能够获取生产者对应的空闲的消费者,并统计所述空闲的消费者的数量,在空闲的消费者的数量大于预设值之后,根据心跳检测打散规则,将所述空闲的消费者分为N个检测批次,依次对每个检测批次的消费者进行心跳检测,能够避免由于同时对大量消费者进行心跳检测,导致的CPU使用率瞬间飙升,减少由于心跳检测导致其他业务的超时失败,提高了系统的可靠性。
在上述各实施例的基础上,进一步地,所述心跳检测打散规则包括:
将所述空闲的消费者按照心跳周期平均划分为N个检测批次。
具体地,所述生产者服务器可以将空闲的Consumer按照心跳周期平均划分为N个检测批次,划分之后每个检测批次对应相同数量的空闲的Consumer。其中,所述心跳周期是预设的。
例如,所述心跳周期为20秒,空闲的Consumer的数量为10000个,那么将10000个空闲的Consumer划分为10000/20=500个检测批次,每个检测批次检测20个空闲的Consumer。
图2是本发明另一实施例提供的心跳检测方法的流程示意图,如图2所示,本发明实施例提供的心跳检测方法具体实现流程如下:
第一步、统计空闲的消费者的数量。生产者服务器获取生产者对应的空闲的消费者,然后统计空闲的消费者的数量,获得空闲的消费者的数量Q。
第二步、判断是否大于1000。生产者服务器判断Q是否大于1000,如果大于100,那么进入第三步;如果Q小于等于1000,那么进入第九步。
第三步、计算总检测批次N。生产者服务器获取心跳周期,然后用Q除以心跳周期,获得总检测批次N,将空闲的Q个消费者平均分配到每个检测批次中,使每个检测批次对应的消费者的数量相等。
第四步、初始化计数器i。生产者服务器将计数器i初始为0,即计数器从0开始计数。
第五步、判断i是否小于N。生产者服务器将i与N进行比较,如果i小于N,说明存在还没有进行心跳检测的消费者,进入到第六步;如果i大于N,说明N个批次的心跳检测完成。
第六步、进行心跳检测。获取一个检测批次对应的消费者,并向该检测批次的每个消费者发送心跳包,以对该检测批次的每个消费者进行心跳检测。
第七步、暂停1秒。生产者服务器暂停心跳检测1秒。
第八步、计数器i加1。生产者服务器将计数器i加1,然后回到第五步。
第九步、直接进行心跳检测。
在上述各实施例的基础上,进一步地,所述心跳检测打散规则包括:
根据所述空闲的消费者对应的权重值,将所述空闲的消费者划分为N个检测批次;其中,每个检测批次的消费者对应的权重值相等。
具体地,可以为每个Consumer设置对应的权重值,不同Consumer对应的权重值可以不同,所述生产者服务器可以获取空闲的Consumer中每个Consumer对应的权重值,将具有相同权重值的Consumer划分到一个检测批次,获得N个检测批次,每个检测批次的Consumer对应的权重值相等,即相同检测批次的Consumer对应的权重值相等,不同检测批次对应的权重值不相等。
其中,可以为每个Consumer设置一个权重属性,权重属性对应的值即为Consumer对应的权重。为Consumer设置权重属性,在代码层面,可以通过扩展ApplicationConfig类,为其增加一个weight成员和对应的读写方法。之后,将Consumer注册到ZooKeeper的URL如下所示:
consumer://127.0.0.1/org.apache.dubbo.demo.DemoService?application=demo-consumer&category=consumers&check=false&dubbo=2.5.9&interface=org.apache.dubbo.demo.DemoService&methods=sayHello&pid=1209&qos.port=20880&side=consumer&weight=5×tamp=1545721827784
例如,权重值包括0~9共10个,Provider对应的Consumer的总数为10000个。预先为各个Consumer配置对应的权重值,其中,权重值0~9分别对应1000个Consumer。假设所述生产者服务器统计出的空闲的消费者的数量有3300个,其中700个空闲的Consumer对应的权重值为9;800个空闲的Consumer对应的权重值为7;500个空闲的Consumer对应的权重值为5;300个空闲的Consumer对应的权重值为3;600个空闲的Consumer对应的权重值为2;400个空闲的Consumer对应的权重值为1。由于3300个空闲的消费者对应的权重值有6个,所述生产者服务器将3300个空闲的消费者划分为6个检测批次,依次对6个检测批次的消费者进行心跳检测,相邻两个检测批次之间可以相隔1秒。其中,可以设置各个权重值的检测优先级,比如检测优先级从0到9依次降低,即权重0对应的检测批次最先进行心跳检测。
图3是本发明再一实施例提供的心跳检测方法的流程示意图,如图3所示,本发明实施例提供的心跳检测方法具体实现流程如下:
第一步、统计空闲的消费者的数量。生产者服务器获取生产者对应的空闲的消费者,然后统计空闲的消费者的数量,获得空闲的消费者的数量Q。
第二步、判断是否大于1000。生产者服务器判断Q是否大于1000,如果大于100,那么进入第三步;如果Q小于等于1000,那么进入第九步。
第三步、划分为N个检测批次。生产者服务器获取空闲的消费者中每个消费者对应的权重值,然后将相同的权重值对应的消费者划分到一个检测批次,获得N个检测批次,每个检测批次对应具有相同权重值的消费者。再根据权重值对应的检测优先级对各个检测批次进行排序,获得各个检测批次的检测顺序。其中,每个消费者对应的权重值是预设的;各个权重值的检测优先级是预设的。
第四步、初始化计数器i。生产者服务器将计数器i初始为0,即计数器从0开始计数。
第五步、判断i是否小于N。生产者服务器将i与N进行比较,如果i小于N,说明存在还没有进行心跳检测的消费者,进入到第六步;如果i大于N,说明N个批次的心跳检测完成。
第六步、进行心跳检测。按照各个检测批次的检测顺序,获取一个检测批次对应的消费者,并向该检测批次的每个消费者发送心跳包,以对该检测批次的每个消费者进行心跳检测。
第七步、暂停1秒。生产者服务器暂停心跳检测1秒。
第八步、计算器加1。生产者服务器将计数器i加1,然后回到第五步。
第九步、直接进行心跳检测。
在上述各实施例的基础上,进一步地,所述依次对每个检测批次的消费者进行心跳检测包括:
若接收到所述消费者发送的交易请求且所述消费者属于未检测批次,则将所述消费者从未检测批次中去除。
具体地,由于分批次对空闲的Consumer进行心跳检测,有可能在心跳检测的过程中,空闲的Consumer中的某个Consumer与对应的Provider之间产生了交易,如果该Consumer还没有进行心跳检测可以无需进行心跳检测。所述生产者服务器如果在开始进行心跳检测之后,接收到Consumer发送的交易请求,并且Consumer属于未检测批次,未检测批次即还没有进行心跳检测的批次,那么将该Consumer从未检测批次中取出,从而减少进行心跳检测的Consumer的数量,能够进一步地降低CPU的消耗。
在上述各实施例的基础上,进一步地,本发明实施例提供的心跳检测方法还包括:
若判断获知所述空闲的消费者的数量小于等于所述预设值,则直接对所述空闲的消费者进行心跳检测。
具体地,所述生产者服务器将Provider对应的空闲的Consumer的数量与预设值进行比较,如果Provider对应的空闲的Consumer的数量小于等于所述预设值,说明需要进行心跳检测的Consumer的数量不多,可以不需要分批次进行心跳检测,可以向空闲的Consumer发送心跳包,直接对空闲的Consumer进行心跳检测。
图4是本发明一实施例提供的心跳检测装置的结构示意图,如图4所示,本发明实施例提供的心跳检测装置包括统计模块401、第一判断模块402和心跳检测模块403,其中:
统计模块401用于获取生产者对应的空闲的消费者,并统计所述空闲的消费者的数量;第一判断模块402用于在所述空闲的消费者的数量大于预设值之后,根据心跳检测打散规则,将所述空闲的消费者分为N个检测批次;其中,N为大于等于2的正整数;心跳检测模块403用于依次对每个检测批次的消费者进行心跳检测。
具体地,统计模块401可以获得在设定时间内与Provider没有发生交易的Consumer,作为Provider对应的空闲的Consumer,然后统计Provider对应的空闲的Consumer的数量。对于空闲的Consumer需要进行心跳检测,以探测Provider与对应的Consumer之间的TCP长连接是否健康。其中,所述设定时间根据实际需要进行设置,本发明实施例不做限定。
在获得Provider对应的空闲的Consumer的数量之后,第一判断模块402将Provider对应的空闲的Consumer的数量与预设值进行比较,如果Provider对应的空闲的Consumer的数量大于所述预设值,说明需要进行心跳检测的Consumer的数量较多,如果同时进行心跳检测会消耗较多的所述生产者服务器的CPU资源,存在影响所述生产者服务器的正常业务处理的风险,第一判断模块402会根据心跳检测打散规则,将所述空闲的消费者分为N个检测批次,分批次对空闲的Consumer进行心跳检测,以降低CPU资源的瞬间消耗,减少对其他业务的影响。其中,N为大于等于2的正整数。
具体地,所述生产者服务器可以依次向每个检测批次的Consumer发送心跳包,以对每个检测批次的Consumer进行心跳检测,每个检测批次之间相隔预设时间。其中,所述预设时间根据实际需要进行设置,例如设置为1秒,本发明实施例不做限定。
本发明实施例提供的心跳检测装置,能够获取生产者对应的空闲的消费者,并统计所述空闲的消费者的数量,在空闲的消费者的数量大于预设值之后,根据心跳检测打散规则,将所述空闲的消费者分为N个检测批次,依次对每个检测批次的消费者进行心跳检测,能够避免由于同时对大量消费者进行心跳检测,导致的CPU使用率瞬间飙升,减少由于心跳检测导致其他业务的超时失败,提高了系统的可靠性。
在上述各实施例的基础上,进一步地,所述心跳检测打散规则包括:
将所述空闲的消费者按照心跳周期平均划分为N个检测批次。
在上述各实施例的基础上,进一步地,所述心跳检测打散规则包括:
根据所述空闲的消费者对应的权重值,将所述空闲的消费者划分为N个检测批次;其中,每个检测批次的消费者对应的权重值相等。
在上述各实施例的基础上,进一步地,心跳检测模块403具体用于:
在接收到所述消费者发送的交易请求且所述消费者属于未检测批次之后,将所述消费者从未检测批次中去除。
具体地,由于分批次对空闲的Consumer进行心跳检测,有可能在心跳检测的过程中,空闲的Consumer中的某个Consumer与对应的Provider之间产生了交易,如果该Consumer还没有进行心跳检测可以无需进行心跳检测。心跳检测模块403如果在开始进行心跳检测之后,接收到Consumer发送的交易请求,并且Consumer属于未检测批次,未检测批次即还没有进行心跳检测的批次,那么将该Consumer从未检测批次中取出,从而减少进行心跳检测的Consumer的数量,能够进一步地降低CPU的消耗。
本发明实施例提供的心跳检测方法,使得Provider可以平滑处理大量Consumer的心跳探活,有效降低Provider所在服务器的CPU随心跳周期飚高的问题,提高大规模集群系统稳定性。
图5是本发明另一实施例提供的心跳检测装置的结构示意图,如图5所示,在上述各实施例的基础上,进一步地,本发明实施例提供的心跳检测装置还包括第二判断模块404,其中:
第二判断模块404用于在判断获知所述空闲的消费者的数量小于等于所述预设值之后,直接对所述空闲的消费者进行心跳检测。
具体地,第二判断模块404将Provider对应的空闲的Consumer的数量与预设值进行比较,如果Provider对应的空闲的Consumer的数量小于等于所述预设值,说明需要进行心跳检测的Consumer的数量不多,可以不需要分批次进行心跳检测,可以向空闲的Consumer发送心跳包,直接对空闲的Consumer进行心跳检测。
本发明实施例提供的装置的实施例具体可以用于执行上述各方法实施例的处理流程,其功能在此不再赘述,可以参照上述方法实施例的详细描述。
需要说明的是,本发明实施例提供的心跳检测方法及装置可用于金融领域,也可用于除金融领域之外的任意技术领域,本发明实施例对心跳检测方法及装置的应用领域不做限定。
图6是本发明一实施例提供的电子设备的实体结构示意图,如图6所示,该电子设备可以包括:处理器(processor)601、通信接口(Communications Interface)602、存储器(memory)603和通信总线604,其中,处理器601,通信接口602,存储器603通过通信总线604完成相互间的通信。处理器601可以调用存储器603中的逻辑指令,以执行如下方法:获取生产者对应的空闲的消费者,并统计所述空闲的消费者的数量;若所述空闲的消费者的数量大于预设值,则根据心跳检测打散规则,将所述空闲的消费者分为N个检测批次;其中,N为大于等于2的正整数;依次对每个检测批次的消费者进行心跳检测。
此外,上述的存储器603中的逻辑指令可以通过软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
本实施例公开一种计算机程序产品,所述计算机程序产品包括存储在非暂态计算机可读存储介质上的计算机程序,所述计算机程序包括程序指令,当所述程序指令被计算机执行时,计算机能够执行上述各方法实施例所提供的方法,例如包括:获取生产者对应的空闲的消费者,并统计所述空闲的消费者的数量;若所述空闲的消费者的数量大于预设值,则根据心跳检测打散规则,将所述空闲的消费者分为N个检测批次;其中,N为大于等于2的正整数;依次对每个检测批次的消费者进行心跳检测。
本实施例提供一种计算机可读存储介质,所述计算机可读存储介质存储计算机程序,所述计算机程序使所述计算机执行上述各方法实施例所提供的方法,例如包括:获取生产者对应的空闲的消费者,并统计所述空闲的消费者的数量;若所述空闲的消费者的数量大于预设值,则根据心跳检测打散规则,将所述空闲的消费者分为N个检测批次;其中,N为大于等于2的正整数;依次对每个检测批次的消费者进行心跳检测。
本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
在本说明书的描述中,参考术语“一个实施例”、“一个具体实施例”、“一些实施例”、“例如”、“示例”、“具体示例”、或“一些示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点包含于本发明的至少一个实施例或示例中。在本说明书中,对上述术语的示意性表述不一定指的是相同的实施例或示例。而且,描述的具体特征、结构、材料或者特点可以在任何的一个或多个实施例或示例中以合适的方式结合。
以上所述的具体实施例,对本发明的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本发明的具体实施例而已,并不用于限定本发明的保护范围,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
- 一种侦听心跳声音的心跳检测装置及检测方法
- 心跳检测装置、心跳检测方法以及程序