一种心跳包的处理方法和装置制造方法
【专利摘要】本发明涉及一种心跳包处理的方法和装置,包括:一个或多个执行线程、以及独立线程;所述独立线程依次获取多个设备上报的一个或多个心跳包并发送至对应的所述执行线程;一个或多个所述执行线程,根据各自对应的散列表和心跳包队列,并行地对对应的心跳包执行处理。本发明利用独立线程获取并分发心跳包,并使用多个执行线程并行的处理来自多个设备的心跳包,提高了心跳包的处理效率;并且在变更当前设备状态时,运用散列表和心跳队列,避免了对集群中每一个设备的遍历,大幅度减少了系统的运算量。
【专利说明】一种心跳包的处理方法和装置
【技术领域】
[0001]本申请涉及数据处理领域,尤其涉及一种心跳包的处理方法和装置。
【背景技术】
[0002]心跳包是指客户端定时上报简单的信息给服务器端,以此告诉服务器,该客户端处于在线状态。例如,客户端每隔几分钟上报一个信息(可称为心跳包)给心跳服务器,如果该心跳服务器在预定时间内(如,I分钟内)没有收到客户端信息,则表示该客户端已经离线。
[0003]现有的心跳服务器采用以下处理方式来管理心跳:在进程中使用“树”来存储每个设备最近一次上报来的心跳包所包含的信息,该“树”可以是二叉查找树,其中,树中的每个结点将会记录3个信息,分别为设备名称、最近一次上报的时间、当前状态。
[0004]并且,现有的处理方式为多个线程共同操作该树,其中一些线程负责处理设备上报来心跳包,并在接收到一个心跳包后更新树中的与该心跳包对应的结点,例如,发现该心跳包对应的设备在树中不存在、或者该心跳包对应的设备的状态为线下时,则在树中添加该设备的结点或是将该设备的当前设备状态置为线上;另有一些线程负责遍历树中的每一个节点,将各个设备的上次心跳时间与当前系统时间做比较,若发现某个设备在一定时间内没有上报心跳包,则将该设备的状态设置为下线。
[0005]但是,这种处理方式效率并不高,这种低效体现在两点:1、多线程操作同一棵树,必须使用“锁”来保护线程对该共享资源(树)的访问,所述多个线程只有获得“锁”才能对该树进行操作,这限制了多个线程之间的并发性,尤其是多个线程的执行所带来的无谓的进程间切换(如Linux操作系统中,进程切换等价于线程切换)开销将会很可观。2、线程对树的遍历操作运算量过大,尤其是集群内含有大量的设备时,换言之,所述的树中包含大量的节点时,线程要对树中的每一个节点进行遍历,运算量过大。这样,以上的心跳包处理方式导致心跳服务器性能较低,不能处理大量的心跳包。
[0006]在云计算环境下,一个大集群(例如阿里云弹性计算集群)内,可以包含2万台物理机和80万台虚拟机,而且这个数据还会随着物理机和虚拟机数量的增加而不断扩大,这样,处理各个设备的心跳包所需要的运算量也越来越大,这导致了集群的心跳服务器性能的局限性。若利用上述心跳包处理方式,可以使用多个心跳服务器组成一个心跳服务器集群才能完成处理,但是,在现有技术中,对于心跳服务器集群的构建还存在很多技术问题,如,对多个心跳服务器进行集群构建设计、数据同步设计等,而且,在系统中添加多个心跳服务器提高了系统成本。
【发明内容】
[0007]本申请的主要目的在于提供一种心跳包的处理方法和装置,以解决现有技术存在的多个线程不能并发对多个心跳包进行处理,而且遍历大量设备的状态运算量过大的问题。
[0008]为了解决上述技术问题,本申请的目的是通过以下技术方案实现的:
[0009]本申请提供了一种心跳包处理的方法,包括以下步骤:一个或多个执行线程、以及独立线程;所述独立线程依次获取多个设备上报的一个或多个心跳包并发送至对应的所述执行线程;一个或多个所述执行线程,根据各自对应的散列表和心跳包队列,并行地对对应的心跳包执行处理。
[0010]优选地,在根据本申请所述的方法中,所述心跳包至少包括所述心跳包的上报时间、所述心跳包对应的设备的IP地址;所述散列表记录对应的执行线程接收的每一个心跳包对应的设备的设备信息;其中,所述设备信息包括:所述心跳包的最近一次上报时间、所述心跳包对应的设备的当前设备状态;所述心跳包队列顺序存储对应的执行线程接收的每一个心跳包的心跳包信息;其中,所述心跳包队列的心跳包信息包括:所述心跳包的上报时间。
[0011]优选地,根据本申请所述的方法,所述独立线程依次获取多个设备上报的多个心跳包的步骤,包括:所述独立线程根据每一个所述心跳包中的IP地址,将所述各个心跳包发送至与其对应的执行线程中。
[0012]优选地,在根据本申请所述的方法中,将所述心跳包中的IP地址转化为长整型数字,并将所述长整型数字与执行线程的数量取模,并得到取模结果;以及基于所述取模结果,所述独立线程将所述心跳包发送至与该取模结果存在关联关系的执行线程中。
[0013]优选地,根据本申请所述的方法,所述一个或多个所述执行线程根据各自对应的散列表和心跳包队列并行地对对应的心跳包执行处理的步骤,包括:查询所述散列表中与所述心跳包对应的设备的当前设备状态,并根据所述心跳包更新所述散列表。
[0014]优选地,根据本申请所述的方法,所述根据所述心跳包更新所述散列表的步骤,包括:若与所述心跳包对应的设备的当前设备状态是线下,则将所述设备的当前设备状态置为线上并根据所述心跳包的上报时间更新所述设备的最近一次上报时间;若与所述心跳包对应的设备的当前设备状态是线上,则根据所述心跳包的上报时间更新所述设备的最近一次上报时间;以及若在散列表中不包含所述心跳包对应的设备的设备信息,则根据所述心跳包,在散列表中新建与所述心跳包对应的设备的设备信息,并将所述设备的当前设备状态置于线上。
[0015]优选地,根据本申请所述的方法,所述一个或多个所述执行线程根据各自对应的散列表和心跳包队列并行地对对应的心跳包执行处理的步骤,包括:对所述心跳包队列进行分析,并根据分析结果更新所述散列表中所述设备的设备当前状态。
[0016]优选地,根据本申请所述的方法,所述对所述心跳包队列进行分析的步骤,包括:在所述心跳包队列中,顺次查询所述心跳包的上报时间;根据所述心跳包的上报时间,确定与所述心跳包对应的设备的当前设备状态。
[0017]优选地,根据本申请所述的方法,所述根据所述心跳包的上报时间,确定与所述心跳包对应的设备的当前设备状态的步骤,包括:若当前时间与该心跳包的上报时间的差小于弹性时间,则所述心跳包对应的设备的当前设备状态为线上;若当前时间与该心跳包的上报时间的差大于弹性时间,则查询所述心跳包对应的设备在散列表中的设备信息;若心跳包的上报时间小于所述最近一次上报时间,则保持与所述心跳包对应的设备的当前设备状态为线上;若心跳包的上报时间等于所述最近一次上报时间,则将与所述心跳包对应的设备的当前设备状态置于线下。
[0018]本申请还提供了一种心跳包处理的装置,包括:一个或多个执行模块,以及独立模块;所述独立模块,用于依次获取多个设备上报的多个心跳包;并将每一个所述心跳包发送至对应的所述执行模块;一个或多个所述执行模块根据各自对应的散列表和心跳包队列并行地对对应的心跳包执行处理。
[0019]优选地,在根据本申请所述的装置中,所述心跳包至少包括所述心跳包的上报时间、所述心跳包对应的设备的IP地址;所述散列表记录对应的执行线程接收的每一个心跳包对应的设备的设备信息,其中,所述设备信息包括:所述心跳包的最近一次上报时间、所述心跳包对应的设备的当前设备状态;所述心跳包队列顺序存储对应的执行线程接收的每一个心跳包的心跳包信息,其中,所述心跳包队列的心跳包信息包括:所述心跳包的上报时间。
[0020]优选地,在根据本申请所述的装置中,所述独立模块还被配置成:所述独立模块根据每一个所述心跳包中的IP地址,将所述各个心跳包发送至与其对应的执行模块中。
[0021]优选地,在根据本申请所述的装置中,所述执行模块还被配置成:查询所述散列表中与所述心跳包对应的设备的当前设备状态,并根据所述心跳包更新所述散列表。
[0022]优选地,在根据本申请所述的装置中,所述执行模块还被配置成:对所述心跳包队列进行分析,并根据分析结果更新所述散列表中所述设备的设备当前状态。
[0023]与现有技术相比,根据本申请的技术方案存在以下有益效果:
[0024]本申请利用独立线程获取并分发心跳包,并使用多个执行线程并行的处理来自多个设备的心跳包,提高了心跳包的处理效率;
[0025]本申请在变更当前设备状态时,运用散列表和心跳队列,避免了对集群中每一个设备的遍历,大幅度减少了系统的运算量。
【专利附图】
【附图说明】
[0026]此处所说明的附图用来提供对本申请的进一步理解,构成本申请的一部分,本申请的示意性实施例及其说明用于解释本申请,并不构成对本申请的不当限定。在附图中:
[0027]图1是本申请实施例的心跳包处理的方法的流程图;
[0028]图2是本申请实施例的心跳包处理的散列表的示意图;
[0029]图3是本申请实施例的心跳包处理的心跳包队列的示意图;
[0030]图4是本申请实施例的更新散列表的步骤的流程图;
[0031]图5是本申请实施例的分析心跳包队列的步骤的流程图;以及
[0032]图6是本申请实施例的心跳包处理的装置的示意图。
【具体实施方式】
[0033]本申请的主要思想在于,提供多个线程,设置其中一个线程为独立线程,其余多个线程为执行线程,其中,独立线程获取心跳包,并发送给对应的执行线程,每一个执行线程包含对应的散列表和心跳包队列,根据所述散列表和心跳包队列,多个执行线程并行的处理心跳包,从而达到及时监控集群中大量设备的线上和线下状态的变化。
[0034]在本申请一个典型的配置中,计算设备包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。
[0035]内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。内存是计算机可读介质的示例。
[0036]计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPR0M)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括非暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
[0037]为使本申请的目的、技术方案和优点更加清楚,以下结合附图及具体实施例,对本申请作进一步地详细说明。
[0038]根据本申请的实施例,提供了一种心跳包处理的方法。
[0039]参考图1,图1是本申请实施例的心跳包处理的方法的流程图。
[0040]在大集群环境中,包括大量设备,如:物理机和虚拟机,为了及时监控设备的当前设备状态,可以利用心跳服务器接收集群中设备定时发送的心跳包,当心跳服务器可以收到设备定时发送的心跳包时,可以确定该设备的当前设备状态为线上,若在一段时间内,未收到来自设备发送的心跳包时,则确定该设备的当前设备状态为线下。例如,聊天工具(QQ、阿里旺旺、MSN等),若客户端定时向心跳服务器发送心跳包,则表示用户在线,若在一定时间内,客户端未向心跳服务器发送心跳包,则表示用户已经下线;又例如,阿里云弹性计算环境中拥有许多台虚拟机,若虚拟机定时向心跳服务器发送心跳包,则表示虚拟机在线,用户可以正常使用他拥有的虚拟机,若在一定时间内,一台虚拟机未向心跳服务器发送心跳包,则表示虚拟机已经下线,弹性计算系统将会对虚拟机自动执行各种故障恢复方案。
[0041]由于在集群中设备数量巨大,系统可以并发多个线程,由该多个线程并行对接收的大量心跳包执行操作。本申请可以设置其中某一个线程为独立线程,负责获取并分发心跳包,其余的一个或多个线程为执行线程,负责处理心跳包。进一步地,所述独立线程可以在分发心跳包时,对一个或多个执行线程进行负载(心跳包)均衡;而每个执行线程可以单独处理接收到的所述心跳包,并及时更新设备的当前设备状态。
[0042]下面对该心跳包处理的方式进行详细描述。
[0043]步骤S102,通过独立线程依次获取多个设备上报的多个心跳包。
[0044]心跳服务器接收多个设备上报的多个心跳包,并将每一个心跳包置于数据缓冲区中。当心跳包服务器处理系统(以下简称系统)处理心跳包时,可以并发开启多个线程,为该多个线程中每一个线程设置任务,并且并行处理对应的心跳包。比如,可以将所述并发开启的多个线程设置为一个或多个执行线程、以及独立线程,利用该独立线程来依次获取多个设备上报的多个心跳包。每一个设备上报的心跳包还至少可以包括:该心跳包的上报时间、该心跳包对应的设备(如:上报该心跳包的设备)的设备名称、该心跳包对应的设备的IP地址等各种参数(数据/信息)。进一步地,可以在多个线程中,预设一个线程作为独立线程,而剩余的一个或多个线程作为执行线程。独立线程可以从已经存储了心跳包的数据缓冲区中获得各个心跳包,并将各个心跳包发送给相应的执行线程,以便执行线程能够处理各个心跳包。而这些执行线程对所述心跳包进行心跳包处理,则比如:接收独立线程发送来的心跳包,新建或者变更上报该心跳包的设备的状态、对接收到的多个心跳包组成的心跳包队列进行分析等等。
[0045]与现有技术不同的是,本申请所述的多个线程(独立线程、执行线程)可以并行的进行数据操作,避免了多个线程由于未抢到“锁”进入休眠期(即,同一时刻只有一个线程进行数据操作),造成的心跳包处理效率低的问题;并且采用单独一个独立线程负责从数据缓冲区获取心跳包,避免了数据缓冲区中的心跳包由于获取不及时造成的丢包现象。
[0046]独立线程获取所述数据缓冲区中的心跳包,进一步地,独立线程可以复制所述数据缓冲区中的心跳包,并且系统释放该心跳包处于所述数据缓冲区中的存储空间,以此保证数据缓冲区有足够的空间可以存放来自设备上报的心跳包。
[0047]需要说明的是,一个或多个执行线程的数量可以根据系统具有的CPU核数决定,执行线程的数量优选地小于或等于系统CPU核数。这样,当一个执行线程在满负荷运行而全程占用CPU时,不影响其他执行线程的运行,以此提高系统性能。
[0048]步骤S104,独立线程将每一个心跳包发送至对应的执行线程。
[0049]这里,独立线程可以根据每一个心跳包中的参数信息,例如IP地址等,将各个心跳包,发送至与其对应的执行线程中,接收到心跳包的执行线程执行该心跳包的处理。
[0050]发送心跳包给对应的执行线程,比如,可以将心跳包中的IP地址转化为长整型数字,并将所述长整型数字与执行线程的数量取模,并得到取模结果。这里,可以预先对各种取模结果进行分析,并预先将每一种取模结果与所述多个执行线程之一进行关联,从而独立线程可以基于如所述心跳包对应的设备的IP地址等参数信息转化取模得到的取模结果,将该心跳包发送至与该取模结果存在关联关系的执行线程中去。优选地,还可以预先为各个执行线程中的每一个,添加标签。由该标签能确定/确认/识别标签所对应的执行线程。这样,预先把各种取模结果与各个标签进行关联,就可以找到对应的执行线程。
[0051]例如,将心跳包中的IP地址“192.168.0.1”转化为长整型数字“3232235521”,若系统中存在6个执行线程,并且执行线程I一执行线程6的标签顺次为1-6,预先将这6个标签与可能出现的取模结果一一对应,如,若取模结果为1,则关联执行线程1,若取模结果为2,则关联执行线程2,将“3232235521”对执行线程的数量6取模,取模结果为1,则独立线程将该心跳包发送给执行线程1,以执行心跳包处理。
[0052]这样,通过取模的方式把每一个心跳包发送到其对应的执行线程中,可以达到自动负载均衡的效果,而当大量设备向心跳服务器发送大量的心跳包时,还可以使每一个执行线程接收的心跳包数据大致均衡,避免了单独一个执行线程处理的心跳包数量远大于其他执行线程的心跳包处理数量,造成的系统压力。
[0053]在另一个实施例中,可以根据每一个心跳包中的设备名称,将心跳包发送至对应的执行线程中。这里,可以预先对多个设备进行预分配,将每一个设备对应一个执行线程。例如,集群中存在100个设备,并且系统具有2个执行线程,则可以将设备I一设备50对应执行线程I,将设备51—设备100对应执行线程2,对于设备上报的心跳包,由独立线程发送到与上报该心跳包的设备对应的执行线程中处理,如,设备2上报一个心跳包,则独立线程将该心跳包发送给执行线程I处理。
[0054]从而,利用独立线程将心跳包发送至相应的执行线程中,这样,可以保证该多个执行线程可以并发执行心跳包的处理,进而可以达到负载(心跳包)均衡效果。
[0055]步骤S106,一个或多个执行线程根据各自对应的散列表和心跳包队列并行的对对应心跳包执行心跳包处理。
[0056]一个实施方式,一个或多个执行线程中的每一个执行线程拥有对应的散列表和心跳包队列,例如,执行线程I对应散列表I和心跳包队列1,执行线程2对应散列表2和心跳包队列2 ;执行线程可以通过查询散列表和心跳包队列更新上报该心跳包的设备的当前设备状态。
[0057]所述散列表记录对应的执行线程接收的每一个心跳包的相关信息,该相关信息是该心跳包对应的设备的设备信息,例如,以设备名称作为关键词,所述设备信息可以包括心跳包的最近一次上报时间,上报该心跳包的设备的设备名称和当前设备状态,如图2所示的心跳包处理的散列表的示意图,在所述散列表中保存有多个设备的设备名称,每一个设备最近一次上报心跳包的上报时间,每一个设备的当前设备状态(线上或线下)。
[0058]所述心跳包队列顺序存储对应的执行线程接收的每一个心跳包的心跳包信息,如图3所述的心跳包处理的心跳包队列的示意图,按照从心跳包队列的首部到心跳包队列的尾部的存储位置顺序,存储收到的心跳包,例如,收到的第一个心跳包存储到该心跳包队列的首部,收到的第二个心跳包存储到第一个心跳包之后,其中,所述心跳包信息可以包括:上报该心跳包的设备名称(心跳包对应的设备的设备名称)和该心跳包的上报时间。
[0059]在本申请实施例中,每个执行线程有自己的散列表和心跳包队列。具体而言,一种情况,每一个执行线程可以单独具有对应的散列表和心跳包队列,其中,所述执行线程可以单独存储对应的散列表和心跳包队列,以及将该每一个唯一的标签对应多个执行线程中的一个执行线程,以此来界定每一个执行线程各自对应的散列表和心跳包队列。
[0060]由于在现有技术中,多个线程不能同时对同一棵树操作,所以多个线程之间不能并行的处理心跳包,而且,每一个执行线程不能独立的完成一个心跳包的处理全过程,造成心跳包处理效率较低。然而,本申请所述的方法,系统采用多核CPU,并且每一个执行线程各自存储与心跳包有关的彳目息(散列表和心跳包队列),从而,基于各自存储的与心跳包有关的信息,并且每一个执行线程可以独立的完成一个心跳包的处理全过程,所以,多个执行线程可以并行的处理各自接收到的心跳包。
[0061]该心跳包的处理可以包括:根据心跳包对应的设备的心跳包上报情况,将上报该心跳包的设备的状态变更为上线或将上报该心跳包的设备的状态变更为线下等。
[0062]每一个执行线程可以各自存储的与心跳包有关的信息,如,散列表和心跳包队列,并且多个执行线程之间的散列表和心跳包队列互不影响,多个执行线程并行的对对应的散列表和心跳包队列执行操作,从而减小了每一个执行线程的运算量。
[0063]然而,在现有技术中,系统将接收到的所有心跳包是全部存放在一个树结构中,如:二叉查找树,在进行心跳包处理时,可以对所述二叉查找树进行遍历,但是随着集群的不断扩大,该二叉查找树中的节点也不断增加,若实现对该二叉查找树的各个节点的遍历,所付出的运算量巨大。而本申请中所述散列表不需要进行遍历,只需查询散列表中的设备信息即可,而且,在系统性能允许的前提下,可以无限扩展存储空间。从而提高了心跳包的处理效率。
[0064]具体而言,所述执行线程对对应心跳包执行心跳包处理,目的在于监控到与该心跳包对应的设备的当前设备状态,即,及时的对散列表中的设备信息进行更新,如图4所示,图4是本申请实施例的更新散列表的步骤的流程图。
[0065]在步骤S402处,当所述执行线程接收到心跳包时,查询所述散列表中与该心跳包对应的设备名称的当前设备状态,并根据所述心跳包更新所述散列表。
[0066]具体而言,当执行线程接收到心跳包时,若与所述心跳包对应的设备的当前设备状态是线下,则将该设备的当前设备状态置为线上并根据所述心跳包的上报时间更新该设备的最近一次上报时间;若与所述心跳包对应的该设备的当前设备状态是线上,则根据该心跳包的上报时间更新该设备的最近一次上报时间;若在散列表中不包含与该心跳包对应的设备的设备信息,则根据该心跳包中包含的设备名称、上报时间等,在散列表中新建与该心跳包对应的设备的设备信息,并将所述设备的当前设备状态置于线上。
[0067]在一个实施例中,在查询所述散列表之前,可以将所述心跳包中包含的上报时间与系统启动时间和弹性时间的和做比较,所述弹性时间=心跳包上报的频率X允许丢包的个数+心跳包最大延迟时间(IntervalTime XDrop+DelayTime),表示允许丢包的时间间隔和允许心跳包发生通信延迟的最大延迟时间的和,该弹性时间可以用来衡量系统启动后的预热时间,也可以衡量接收心跳包能够容许的最大延后时间,即在该弹性时间内接收到的心跳包是处在一个弹性时间内,允许将该心跳包对应的设备状态置为线上或保持线上状态。若在弹性时间内未收到设备上报心跳包,则可以认为该设备已经下线(线下设备)。
[0068]在根据所述心跳包更新散列表时,执行线程还可以将该心跳包对应的设备的当前设备状态的变化情况通知对该设备感兴趣的设备和/或服务器,例如,灾难备份服务器、业务控制服务器等,例如,当用户在线网游时,入口服务器需要了解所管理控制的所有内容服务器设备的当前运行情况,如,线上或线下,所以,当一个内容服务器设备的状态发生变化时,心跳包服务器可以通知该入口服务器所述内容服务器设备所发生的变化。
[0069]当执行线程接收到心跳包时,查询该执行线程对应的散列表,若所述心跳包的上报时间小于所述系统启动时间和弹性时间的和(上报时间〈系统启动时间+弹性时间),则改变散列表中对应的设备信息的最近一次上报时间,但不向对该设备感兴趣的设备和/或服务器发送通知,具体而言,在进行心跳包处理时,可以发生第一心跳服务器由于某种原因而停止工作进而将心跳服务切换到第二心跳服务器上执行,由于集群中的大量设备还处于线上状态,所以为了不误导对所述设备感兴趣的设备和/或服务器,在第二心跳服务器系统启动初期的预热时间(弹性时间)内,可以不向所述对设备感兴趣的设备和/或服务器发送通知,即,原来设备当前状态为线上,由于发生了心跳服务器的切换,在第二心跳服务器第一次接收到来自设备的心跳包时,可能再次向对该设备感兴趣的设备和/或服务器发送通知(表示该设备已经上线),为了避免再次发送设备状态变化的通知,第二心跳服务器启动初期可以只处理心跳包而不发送通知。
[0070]当所述心跳包的上报时间大于所述系统启动时间和弹性时间的和(上报时间 > 系统启动时间+弹性时间),并且所述心跳包对应的设备状态为线下时,则将该心跳包对应的设备状态置为线上,以及将该设备的状态变化的通知发送给对该设备感兴趣的设备和/或服务器。
[0071]由于在集群中存在大量的设备,若其中一设备在一段时间内未向心跳服务器发送心跳包,则表示该设备已经下线(线下设备),但是在散列表中的设备状态依旧保持在线上状态,在这种情况下,需要对心跳包队列中保存的心跳包(设备的心跳包时间)进行分析,以确定哪些设备已经下线,并及时改变该设备在散列表中的当前设备状态,将当前设备状态由线上置为线下,以及将该设备的状态变化的通知发送给对该设备感兴趣的设备和/或服务器,以增加系统对设备状态的灵敏度。
[0072]进一步地,所述执行线程既负责将上报心跳包的设备的设备状态置为线上,也负责将一定时间未上报心跳包的设备的设备状态置为线下,即,本申请所述的执行线程可以执行心跳包的完整的处理过程。
[0073]在步骤S404处,对所述心跳包队列进行分析,并根据分析结果更新所述散列表中所述设备的设备当前状态。
[0074]为了达到系统运行的最大效率,所述执行线程可以对对应的心跳包队列进行分析,以确定设备的当前设备状态(上线或下线)。可以预设一个执行线程接收心跳包的接收阈值,当执行线程接收的心跳包数量达到该接收阈值时,则对心跳包队列中的心跳包进行分析,确定与上报该心跳包的设备的当前设备状态是否发生了变化,并根据分析结果更新散列表中的设备当前设备状态。
[0075]在另一个实施例中,可以预设一个执行线程接收心跳包的时间阈值,当执行线程接收心跳包的时间达到该时间阈值时,则所述执行线程暂停对接收的心跳包的处理,例如,更新散列表,在心跳包队列中添加心跳包相关信息,进而执行心跳包队列的分析。
[0076]在另一个实施例中,所述执行线程处于空闲状态时,S卩,在数据缓冲区中的需要处理的心跳包数量小于一定值时,所述执行线程执行心跳包队列的分析;或者在系统的心跳包处理服务终止后,执行队列无需在接收心跳包,则可以执行心跳包队列的分析。
[0077]进一步地,为了减轻系统负担,预设一个间歇时间,在执行线程分析一定数量或一定时间的心跳包队列中的心跳包后,所述执行线程暂停对心跳包队列的分析,并且在间歇时间内不可以再对心跳包队列中的心跳包进行分析。
[0078]所述执行线程对所述心跳包队列进行分析,以确定在一定时间内未发送心跳包的设备,并根据分析结果更新所述散列表中所述设备的设备当前状态,换言之,确定所述心跳包队列中的心跳包对应的设备是否下线,若设备已经下线,则将散列表中的该设备的当前设备状态变更为线下,若设备依旧为线上,则不变更散列表中的该设备的当前设备状态。
[0079]具体而言,所述执行线程在分析所述心跳包队列,即判断心跳包对应的设备是否需要下线,如图5所示为本申请实施例的对心跳包队列的分析的步骤的流程图。
[0080]在步骤S502处,可以在所述心跳包队列中,顺次查询所述心跳包的上报时间。
[0081]具体而言,首先从所述心跳包队列中查询一个上报时间最早的心跳包(所述心跳包队列中最早存储的心跳包,如,队首),执行对该心跳包的分析,分析结束再从该心跳包队列中顺次查询下一个心跳包的上报时间。
[0082]根据所述心跳包的上报时间,确定与所述心跳包对应的设备的当前设备状态。
[0083]具体而言,可以在步骤S504处,根据所述心跳包的上报时间,确定当前时间与该心跳包的上报时间的差和弹性时间的关系。
[0084]若当前时间与该心跳包的上报时间的差小于弹性时间(Cur r en t T i me -He ar t T i me〈IntervalTimeXDrop+DelayTime),则表示所述执行线程接收该心跳包的时间处于弹性时间内,可以允许该心跳包对应的设备的当前设备状态保持在线上状态,则所述心跳包对应的设备为线上,那么暂时忽略对该心跳包进行处理,不变更散列表中的该设备的当前设备状态,接下来,所述执行线程顺次查询下一个心跳包队列中的心跳包的上报时间,继续比较当前时间与上报时间的差值与弹性时间的关系。
[0085]若当前时间与该心跳包的上报时间的差大于弹性时间(CurrentTime - HeartTime>IntervalTime XDrop+DelayTime),则表示所述执行线程接收到该心跳包的时间超出弹性时间,该心跳包对应的设备可能已经下线,需要对该心跳包进一步分析,确定该心跳包对应的设备是否已经下线。
[0086]在步骤S506处,查询该心跳包对应的设备在散列表中的设备信息,以根据所述心跳包的上报时间,确定所述心跳包的上报时间与散列表中该设备的最近一次上报时间的关系O
[0087]若心跳包的上报时间小于所述最近一次上报时间,则说明该设备还在向心跳服务器发送心跳包,继续判断该设备是否还在向服务器发送心跳包,忽略对该心跳包的处理,不更新该散列表,保持与所述心跳包对应的设备的当前设备状态为线上。
[0088]若心跳包的上报时间等于所述最近一次上报时间,则说明在一段时间内所述设备没有向心跳服务器发送过心跳包,该设备已经下线,将散列表中的该设备的当前设备状态置于线下。
[0089]利用步骤S502-S506所述的方法,无需对散列表中记录的每一个设备相关的信息进行查询、更新的操作,只对可能已经下线的设备进行判断,可以有效的减少对大量心跳包的处理,提闻了系统运行的速度,提闻了心跳包处理的效率。
[0090]本申请通过多个执行线程并行的处理系统接收的大量的心跳包,避免了多个线程之间切换带来的系统消耗,提高了系统对心跳包处理的效率;并且利用散列表和心跳包队列避免了线程对树的遍历过程,利用对心跳包的上报时间和系统的当前时间进行比较的过程,减少了对每一个设备的当前设备状态的判断过程,降低了系统的运算量,提高了系统对心跳包处理的效率。
[0091 ] 本申请还提供了一种心跳包处理的装置。
[0092]如图6所示为本申请实施例的心跳包处理的装置的示意图。
[0093]在本申请所述的装置中,包括一个或多个执行模块603-60N,以及独立模块601。
[0094]所述独立线程601,用于依次获取多个设备上报的多个心跳包;并将每一个所述心跳包发送至对应的所述执行模块。
[0095]其中,所述心跳包至少包括以下信息:所述心跳包的上报时间、所述心跳包对应的设备的IP地址。
[0096]所述独立模块601可以根据每一个所述心跳包中的IP地址,将所述各个心跳包发送至所述一个或多个执行模块中与其对应的执行模块中。
[0097]进一步地,所述独立模块601可以将所述心跳包中的IP地址转化为长整型数字,并将所述长整型数字与执行线程的数量取模,并得到取模结果;预先对各种取模结果进行分析,并预先将每一种取模结果与所述多个执行线程之一进行关联;以及基于所述取模结果,所述独立线程将所述心跳包发送至与该取模结果存在关联关系的执行线程中。
[0098]所述一个或多个所述执行模块603—执行模块60N根据各自对应的散列表和心跳包队列并行地对对应的心跳包执行处理。其中,每一个执行模块都包含散列表和心跳包队列。
[0099]所述散列表记录对应的执行线程接收的每一个心跳包对应的设备的设备信息,其中,所述设备信息包括:所述心跳包的最近一次上报时间、所述心跳包对应的设备的当前设备状态;所述心跳包队列顺序存储对应的执行线程接收的每一个心跳包的心跳包信息,其中,所述心跳包队列的心跳包信息包括:所述心跳包的上报时间。
[0100]在进行心跳包处理的时,所述执行模块603—执行模块60N可以查询所述散列表中与所述心跳包对应的设备的当前设备状态,并根据所述心跳包更新所述散列表。
[0101]具体而言,若与所述心跳包对应的设备的当前设备状态是线下,则将所述设备的当前设备状态置为线上并根据所述心跳包的上报时间更新所述设备的最近一次上报时间;若与所述心跳包对应的设备的当前设备状态是线上,则根据所述心跳包的上报时间更新所述设备的最近一次上报时间;以及若在散列表中不包含所述心跳包对应的设备的设备信息,则根据所述心跳包,在散列表中新建与所述心跳包对应的设备的设备信息,并将所述设备的当前设备状态置于线上。
[0102]所述执行模块603—执行模块60N还被配置成对所述心跳包队列进行分析,并根据分析结果更新所述散列表中所述设备的设备当前状态。
[0103]进一步地,所述执行模块603—执行模块60N可以在所述心跳包队列中,顺次查询所述心跳包的上报时间;根据所述心跳包的上报时间,确定与所述心跳包对应的设备的当前设备状态。
[0104]具体而言,若当前时间与该心跳包的上报时间的差小于弹性时间,则所述心跳包对应的设备的当前设备状态为线上;若当前时间与该心跳包的上报时间的差大于弹性时间,则查询所述心跳包对应的设备在散列表中的设备信息。若心跳包的上报时间小于所述最近一次上报时间,则保持与所述心跳包对应的设备的当前设备状态为线上;若心跳包的上报时间等于所述最近一次上报时间,则将与所述心跳包对应的设备的当前设备状态置于线下。
[0105]本申请利用独立模块获取并分发心跳包,并使用多个执行模块并行的处理来自多个设备的心跳包,提高了心跳包的处理效率;
[0106]本申请在变更当前设备状态时,运用散列表和心跳队列,避免了对集群中每一个设备的遍历,减少了系统的运算量。
[0107]由于图6所描述的本申请的装置所包括的各个模块的【具体实施方式】与图1-图5所示的【具体实施方式】是对应的,由于已经对图1-图5进行了详细描述,所以为了不模糊本申请,在此不再对各个模块的具体细节进行描述。
[0108]本说明书中的各个实施例一般采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。
[0109]本申请可以在由计算机执行的计算机可执行指令的一般上下文中描述,例如程序模块或单元。一般地,程序模块或单元可以包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等等。一般来说,程序模块或单元可以由软件、硬件或两者的结合来实现。也可以在分布式计算环境中实践本申请,在这些分布式计算环境中,由通过通信网络而被连接的远程处理设备来执行任务。在分布式计算环境中,程序模块或单元可以位于包括存储设备在内的本地和远程计算机存储介质中。
[0110]最后,还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个......”限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。
[0111]本领域内的技术人员应明白,本申请的实施例可提供为方法、系统、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
[0112]本文中应用了具体个例对本申请的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本申请的方法及其主要思想;同时,对于本领域的一般技术人员,依据本申请的思想,在【具体实施方式】及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本申请的限制。
【权利要求】
1.一种心跳包处理的方法,其特征在于,包括: 一个或多个执行线程、以及独立线程; 所述独立线程依次获取多个设备上报的一个或多个心跳包并发送至对应的所述执行线程; 一个或多个所述执行线程,根据各自对应的散列表和心跳包队列,并行地对对应的心跳包执行处理。
2.根据权利要求1所述的方法,其特征在于: 所述心跳包至少包括所述心跳包的上报时间、所述心跳包对应的设备的IP地址; 所述散列表记录对应的执行线程接收的每一个心跳包对应的设备的设备信息;其中,所述设备信息包括:所述心跳包的最近一次上报时间、所述心跳包对应的设备的当前设备状态; 所述心跳包队列顺序存储对应的执行线程接收的每一个心跳包的心跳包信息;其中, 所述心跳包队列的心跳包信息包括:所述心跳包的上报时间。
3.根据权利要求2所述的方法,其特征在于,所述独立线程依次获取多个设备上报的多个心跳包的步骤,包括: 所述独立线程根据每一个所述心跳包中的IP地址,将所述各个心跳包发送至与其对应的执行线程中。
4.根据权利要求3所述的方法,其特征在于: 将所述心跳包中的IP地址转化为长整型数字,并将所述长整型数字与执行线程的数量取模,并得到取模结果;以及 基于所述取模结果,所述独立线程将所述心跳包发送至与该取模结果存在关联关系的执行线程中。
5.根据权利要求1或2所述的方法,其特征在于,所述一个或多个所述执行线程根据各自对应的散列表和心跳包队列并行地对对应的心跳包执行处理的步骤,包括: 查询所述散列表中与所述心跳包对应的设备的当前设备状态,并根据所述心跳包更新所述散列表。
6.根据权利要求5所述的方法,其特征在于,所述根据所述心跳包更新所述散列表的步骤,包括: 若与所述心跳包对应的设备的当前设备状态是线下,则将所述设备的当前设备状态置为线上并根据所述心跳包的上报时间更新所述设备的最近一次上报时间; 若与所述心跳包对应的设备的当前设备状态是线上,则根据所述心跳包的上报时间更新所述设备的最近一次上报时间;以及 若在散列表中不包含所述心跳包对应的设备的设备信息,则根据所述心跳包,在散列表中新建与所述心跳包对应的设备的设备信息,并将所述设备的当前设备状态置于线上。
7.根据权利要求1所述的方法,其特征在于,所述一个或多个所述执行线程根据各自对应的散列表和心跳包队列并行地对对应的心跳包执行处理的步骤,包括: 对所述心跳包队列进行分析,并根据分析结果更新所述散列表中所述设备的设备当前状态。
8.根据权利要求7所述的方法,其特征在于,所述对所述心跳包队列进行分析的步骤,包括: 在所述心跳包队列中,顺次查询所述心跳包的上报时间; 根据所述心跳包的上报时间,确定与所述心跳包对应的设备的当前设备状态。
9.根据权利要求8所述的方法,其特征在于,所述根据所述心跳包的上报时间,确定与所述心跳包对应的设备的当前设备状态的步骤,包括: 若当前时间与该心跳包的上报时间的差小于弹性时间,则所述心跳包对应的设备的当前设备状态为线上; 若当前时间与该心跳包的上报时间的差大于弹性时间,则查询所述心跳包对应的设备在散列表中的设备信息; 若心跳包的上报时间小于所述最近一次上报时间,则保持与所述心跳包对应的设备的当前设备状态为线上; 若心跳包的上报时间等于所述最近一次上报时间,则将与所述心跳包对应的设备的当前设备状态置于线下。
10.一种心跳包处理的装置,其特征在于,包括: 一个或多个执行模块,以及独立模块; 所述独立模块,用于依次获取多个设备上报的多个心跳包;并将每一个所述心跳包发送至对应的所述执行模块; 一个或多个所述执行模块根据各自对应的散列表和心跳包队列并行地对对应的心跳包执行处理。
11.根据权利要求10所述的装置,其特征在于: 所述心跳包至少包括所述心跳包的上报时间、所述心跳包对应的设备的IP地址;所述散列表记录对应的执行线程接收的每一个心跳包对应的设备的设备信息,其中,所述设备信息包括:所述心跳包的最近一次上报时间、所述心跳包对应的设备的当前设备状态; 所述心跳包队列顺序存储对应的执行线程接收的每一个心跳包的心跳包信息,其中,所述心跳包队列的心跳包信息包括:所述心跳包的上报时间。
12.根据权利要求11所述的装置,其特征在于,所述独立模块还被配置成: 所述独立模块根据每一个所述心跳包中的IP地址,将所述各个心跳包发送至与其对应的执行模块中。
13.根据权利要求10或11所述的装置,其特征在于,所述执行模块还被配置成: 查询所述散列表中与所述心跳包对应的设备的当前设备状态,并根据所述心跳包更新所述散列表。
14.根据权利要求10所述的装置,其特征在于,所述执行模块还被配置成: 对所述心跳包队列进行分析,并根据分析结果更新所述散列表中所述设备的设备当前状态。
【文档编号】G06F9/48GK104166589SQ201310185186
【公开日】2014年11月26日 申请日期:2013年5月17日 优先权日:2013年5月17日
【发明者】陶辉 申请人:阿里巴巴集团控股有限公司