任务调度方法和装置与流程

专利2022-06-29  124


本发明涉及计算机技术领域,尤其涉及一种任务调度方法和装置。



背景技术:

任务是指按照一定的业务逻辑对相应的业务数据进行处理的一种计算资源,它在各种各样的应用场景中被广泛使用。随着大数据时代的来临,任务数量不断增加的同时,用户对任务的执行效率也有较高的需求。因此,如何根据调度方法将任务分配至不同的应用节点上执行,也就是说,如何利用任务调度系统完成任务的执行具有重要的研究意义。

现有技术主要有如下两种方式进行任务调度:方式一、在某个应用节点中创建任务实例、任务实例触发对象以及任务实例调度对象,直接利用这个应用节点完成任务实例的运行;方式二、由调度器、执行器、协调器和控制台构成一个任务调度系统,这四者之间通过网络连接,按照某种约定协议进行通信,以便协作实现任务调度功能。

在实现本发明过程中,发明人发现现有技术中至少存在如下问题:一、上述方式一只能提供简单的任务调度功能,缺乏任务调度机制,如果应用节点宕机了,那么由该应用节点负责执行的任务实例就不能被执行了;二、上述方式二中的任务调度系统存在架构复杂、技术实现复杂、部署繁琐、依赖众多的问题,不适合在资源受限的环境下使用,也不适合在依赖要求少的条件下使用。



技术实现要素:

有鉴于此,本发明实施例提供一种简单易实现的任务调度方法,保证任务实例在应用节点上分配的均衡性,确保任务实例不会被遗漏,同时可以保证同一任务实例不会被多次执行,提高任务调度的效率。

为实现上述目的,根据本发明实施例的第一方面,提供了一种任务调度方法。

本发明实施例的一种任务调度方法,包括:在接收到任务调度启动指令后,根据预设的任务实例分配原则,从任务实例表中加载目标节点对应的目标任务实例;利用互斥锁机制,根据所述目标任务实例的版本信息对所述目标任务实例进行验证;若验证通过,则执行所述目标任务实例,若验证不通过,则退出对所述目标任务实例的执行操作。

可选地,所述根据预设的任务实例分配原则,从任务实例表中加载目标节点对应的目标任务实例,包括:获取所述目标节点所属的应用程序,并获取所述应用程序对应的应用节点排序表;根据所述应用节点排序表和所述应用节点排序表中应用节点的节点状态,计算所述目标节点对应的可执行范围;根据所述任务实例表中任务实例对应的数字值指纹,确定符合所述可执行范围的任务实例为可选任务实例;根据所述可选任务实例的实例状态和可重试次数,判断所述可选任务实例是否为目标任务实例,若是,则加载所述目标任务实例。

可选地,所述获取所述应用程序对应的应用节点排序表,包括:获取所述应用程序对应的应用节点集群;针对所述应用节点集群中的一个应用节点,计算所述一个应用节点的数字指纹值;按照数字指纹值从大到小或者从小到大的顺序,对所述应用节点集群中的应用节点进行排序,得到所述应用节点排序表。

可选地,所述根据所述应用节点排序表和所述应用节点排序表中应用节点的节点状态,计算所述目标节点对应的可执行范围,包括:根据所述应用节点排序表,查找所述目标节点的下一个应用节点;从所述下一个应用节点开始,依次循环所述应用节点排序表,直至找出第一个节点状态为活跃的应用节点;确定所述目标节点的数字指纹值为第一数值,并确定所述第一个节点状态为活跃的应用节点的数字指纹值为第二数值;利用所述第一数值和所述第二数值,得到所述可执行范围。

可选地,所述利用互斥锁机制,根据所述目标任务实例的版本信息对所述目标任务实例进行验证,包括:更新所述目标任务实例的版本信息,并利用互斥锁机制验证是否成功更新所述目标任务实例的版本信息,若是,则认为所述目标任务实例验证通过,否则,认为所述目标任务实例验证不通过。

可选地,所述方法还包括:在接收到任务实例创建指令后,创建任务实例,并将所述任务实例的实例信息存储至所述任务实例表中,所述实例信息包括:对应的数字值指纹、实例状态、实例版本信息、最大重试次数和当前重试次数,其中所述对应的数字值指纹是创建任务实例的应用节点的数字值指纹。

为实现上述目的,根据本发明实施例的第二方面,提供了一种任务调度装置。

本发明实施例的一种任务调度装置,包括:加载模块,用于在接收到任务调度启动指令后,根据预设的任务实例分配原则,从任务实例表中加载目标节点对应的目标任务实例;验证模块,用于利用互斥锁机制,根据所述目标任务实例的版本信息对所述目标任务实例进行验证;执行模块,用于若验证通过,则执行所述目标任务实例,若验证不通过,则退出对所述目标任务实例的执行操作。

可选地,所述加载模块还用于:获取所述目标节点所属的应用程序,并获取所述应用程序对应的应用节点排序表;根据所述应用节点排序表和所述应用节点排序表中应用节点的节点状态,计算所述目标节点对应的可执行范围;根据所述任务实例表中任务实例对应的数字值指纹,确定符合所述可执行范围的任务实例为可选任务实例;根据所述可选任务实例的实例状态和可重试次数,判断所述可选任务实例是否为目标任务实例,若是,则加载所述目标任务实例。

可选地,所述加载模块还用于:获取所述应用程序对应的应用节点集群;针对所述应用节点集群中的一个应用节点,计算所述一个应用节点的数字指纹值;按照数字指纹值从大到小或者从小到大的顺序,对所述应用节点集群中的应用节点进行排序,得到所述应用节点排序表。

可选地,所述加载模块还用于:根据所述应用节点排序表,查找所述目标节点的下一个应用节点;从所述下一个应用节点开始,依次循环所述应用节点排序表,直至找出第一个节点状态为活跃的应用节点;确定所述目标节点的数字指纹值为第一数值,并确定所述第一个节点状态为活跃的应用节点的数字指纹值为第二数值;利用所述第一数值和所述第二数值,得到所述可执行范围。

可选地,所述验证模块还用于:更新所述目标任务实例的版本信息,并利用互斥锁机制验证是否成功更新所述目标任务实例的版本信息,若是,则认为所述目标任务实例验证通过,否则,认为所述目标任务实例验证不通过。

可选地,所述装置还包括创建模块,用于:在接收到任务实例创建指令后,创建任务实例,并将所述任务实例的实例信息存储至所述任务实例表中,所述实例信息包括:对应的数字值指纹、实例状态、实例版本信息、最大重试次数和当前重试次数,其中所述对应的数字值指纹是创建任务实例的应用节点的数字值指纹。

为实现上述目的,根据本发明实施例的第三方面,提供了一种电子设备。

本发明实施例的一种电子设备包括:一个或多个处理器;存储装置,用于存储一个或多个程序,当一个或多个程序被一个或多个处理器执行,使得一个或多个处理器实现本发明实施例的任务调度方法。

为实现上述目的,根据本发明实施例的第四方面,提供了一种计算机可读介质。

本发明实施例的一种计算机可读介质,其上存储有计算机程序,程序被处理器执行时实现本发明实施例的任务调度方法。

上述发明中的一个实施例具有如下优点或有益效果:因为采用预设的任务实例分配原则获取目标任务实例的技术手段,所以克服了任务实例分配不均衡以及任务实例被遗漏的问题。此外,本发明中还采用了互斥锁机制的技术手段,解决了同一任务实例会被多次执行的问题。本发明实施例目标节点在接收到任务调度启动指令之后,基于预设的任务实例分配原则,目标节点可以加载需要由其执行的目标任务实例,保证了任务实例分配的均衡性,同时目标节点在执行目标任务实例之前,利用互斥锁机制保证了同一个任务实例不会被多个应用节点执行,从而可以提高了任务调度的效率。上述的非惯用的可选方式所具有的进一步效果将在下文中结合具体实施方式加以说明。

附图说明

附图用于更好地理解本发明,不构成对本发明的不当限定。其中:

图1是根据本发明实施例的任务调度方法的主要步骤的示意图;

图2是实现本发明实施例的任务调度方法的总体结构示意图;

图3是根据本发明一个可参考实施例的任务调度方法的主要流程示意图;

图4是根据本发明又一个可参考实施例的从可选任务实例中选择目标任务实例的方法的主要流程示意图;

图5是根据本发明实施例的任务调度装置的主要模块的示意图;

图6是本发明实施例可以应用于其中的示例性系统架构图;

图7是适于用来实现本发明实施例的终端设备或服务器的计算机系统的结构示意图。

具体实施方式

以下结合附图对本发明的示范性实施例做出说明,其中包括本发明实施例的各种细节以助于理解,应当将它们认为仅仅是示范性的。因此,本领域普通技术人员应当认识到,可以对这里描述的实施例做出各种改变和修改,而不会背离本发明的范围和精神。同样,为了清楚和简明,以下的描述中省略了对公知功能和结构的描述。

考虑到用户量的不断增多,为了避免机器宕机或者出现其他故障的情况下,用户的问题不能及时解决,实际中每个应用程序都对应多个应用节点。举例来说,对于结算这个应用程序,在促销节日(如,双十一、六一八等等),短时间内会有大量的用户提交订单进行结算,为了解决在高峰时刻的结算功能崩溃问题,后台会部署多台机器用于结算,而这每个机器就相当于是一个应用节点。下面将站在应用节点的角度,具体介绍本发明的任务调度方法。

图1是根据本发明实施例的任务调度方法的主要步骤的示意图。作为本发明的一个可参考实施例,如图1所示,本发明实施例的任务调度方法的主要步骤可以包括:

步骤s101:在接收到任务调度启动指令后,根据预设的任务实例分配原则,从任务实例表中加载目标节点对应的目标任务实例;

步骤s102:利用互斥锁机制,根据目标任务实例的版本信息对目标任务实例进行验证;

步骤s103:若验证通过,则执行目标任务实例,若验证不通过,则退出对目标任务实例的执行操作。

本发明中任务调度的方法主要包括上述步骤s101、s102和s103。在步骤s101中,目标节点是指应用节点的节点状态处于活跃的应用节点。在步骤s101中不需要对目标节点的节点状态进行验证,这是由于只要应用节点可以接收到任务调度启动指令,则认为这个应用节点的节点状态为活跃状态,也就是说,这个应用节点可以当作是目标节点。此外,任务实例表中存储着应用节点创建的任务实例。因此,从步骤s101中可以得到,目标节点根据预设的任务实例分配原则,从任务实例表中选择由目标节点负责执行的任务实例,本方案中将这种任务实例定义为目标任务实例。

作为本发明的再一个可参考实施例,任务调度方法还可以包括:在接收到任务实例创建指令后,创建任务实例,并将任务实例的实例信息存储至任务实例表中。需要注意的是,本发明中创建任务实例的应用节点和执行这个任务实例的应用节点并不一定是同一个应用节点。任务实例表中还存储任务实例对应的数字值指纹(hashcode)、实例状态(status,包括:未执行、需重试和已完成种)、实例版本信息(version)、最大重试次数(maxretriedcnt)和当前重试次数(retriedcnt)等实例信息。其中,对应的数字值指纹是创建任务实例的应用节点的数字值指纹。本发明中的数字值指纹相当于是应用实例的唯一标识。此外,任务实例表中还存其他实例信息,例如,任务实例的唯一标识(taskid)、任务类型的编码(tasktype)、应用程序的唯一标识(appid)、任务实例的执行逻辑(contents)、任务实例的创建时间(createdtime)和任务实例的最近更新时间(lastupdatedtime)等等。

在任务调度方法中,如何能够实现任务实例分配均衡,也就是说目标节点如何加载其对应的目标任务实例是首先要考虑的问题。作为本发明的可参考实施例,目标节点加载由其负责执行的目标任务实例的方法主要可以包括:

步骤s1011:获取目标节点所属的应用程序,并获取应用程序对应的应用节点排序表。本发明中所有的应用节点均存储在应用节点表中,应用节点表中还存储应用节点所属的应用程序的唯一标识(appid)、应用节点的节点状态、应用节点的互联网地址(即ip)、应用节点的创建时间(createdtime)以及应用节点的最近心跳时间(hbtime)等节点信息。

sdk周期性(比如每30秒一次)地向数据库的应用节点表中记录某个应用节点的心跳信息,一个应用节点对应一条记录,每次都更新hbtime字段。当某个应用节点的hbtime在一定时间段(可以但不限于是90秒)内进行更新时,应用节点的节点状态为活跃(active),当某个应用节点的hbtime在一定时间段(可以但不限于是90秒)内没有更新时,就把该应用节点的节点状态变更为非活跃(inactive);如果发现在更长时间段(可以但不限于是8小时)内hbtime没有更新,则把该应用节点的节点状态变更为死亡(dead)”,并将该应用节点在应用节点表中对应的记录删除。

在步骤s1011中,首先确定目标节点所属的应用程序,然后从应用节点表中,查询属于这个应用程序的所有的应用节点。接着,对这些应用节点进行排序,从而可以得到应用程序对应的应用节点排序表。应用节点排序表作为计算目标节点的重要依据,作为本发明的再一个可参考实施例,获取该应用节点排序表的具体方法可以包括:获取应用程序对应的应用节点集群;针对应用节点集群中的一个应用节点,计算一个应用节点的数字指纹值;按照数字指纹值从大到小或者从小到大的顺序,对应用节点集群中的应用节点进行排序,得到应用节点排序表。

本发明中数字指纹值可以是应用节点的哈希值,即基于哈希算法,利用应用节点的appid(即,应用节点所属应用程序的唯一标识)和ip(即,应用节点的互联网地址值)得到应用节点的哈希值(hash值)。哈希算法(hashalgorithm),又称散列算法,杂凑算法,是一种从任意文件中创造小的数字指纹的方法。与指纹一样,哈希算法就是一种以较短的信息来保证文件唯一性的标志,这种标志与文件的每一个字节都相关,而且难以找到逆向规律。本方案中,选择哈希算法可以保证输入相同的appid和ip一定会输出相同的值,输入不同的appid和ip一定会输出不同的值。当然,本发明中也可以考虑其他类似的算法,比如md5算法(即,信息摘要算法5message-digestalgorithm5,用于确保信息传输完整一致,是计算机广泛使用的杂凑算法之一)。

为了方便理解,以下用一个具体的例子说明应用节点排序表的获取过程。目标节点为node3,其所属的应用程序为a,根据应用节点表,查到应用程序a对应的应用节点有node1、node2、node3和node4这四个应用节点。分别计算这四个应用节点的数字指纹值,然后按照从小到大的顺序对这四个应用节点进行排序,得到应用节点排序表node1、node3、node4和node2。当然,本发明中也可以按照从大到小的顺序对这四个应用节点进行排序,得到应用节点排序表node2、node4、node3和node1。

通过步骤s1011计算得到应用节点排序表,接着执行步骤s1012:根据应用节点排序表和应用节点排序表中应用节点的节点状态,计算目标节点对应的可执行范围。此处的可执行范围用于判断哪些任务实例由该目标节点负责执行。

在上文中提到为了保证任务实例分配的均衡性,保证每个任务实例都不会被遗漏,任务实例的分配很重要。因此,如何获取可执行范围,从而利用可执行范围判断哪些任务实例由该目标节点负责执行很重要。作为本发明的又一个可参考实施例,计算目标节点对应的可执行范围可以包括:根据应用节点排序表,查找目标节点的下一个应用节点;从下一个应用节点开始,依次循环应用节点排序表,直至找出第一个节点状态为活跃的应用节点;确定目标节点的数字指纹值为第一数值,并确定第一个节点状态为活跃的应用节点的数字指纹值为第二数值;利用第一数值和第二数值,得到可执行范围。

举例说明,目标节点为node3,该目标节点对应的应用节点排序表为node1、node3、node4和node2。需要注意的是,此应用节点排序表是按照数字指纹值从小到大的顺序进行排序得到的。从该应用节点排序表中查询到,目标节点node3的下一个应用节点为node4。从node4开始循环该应用节点排序表,循环顺序为node4-node2-node1-node3,直至找到第一个节点状态为活跃的应用节点。可能出现的情况为:

(1)应用节点node4的节点状态为活跃,则目标节点node3的数字指纹值d3为第一数值,应用节点node4的数字指纹值d4为第二数值,则得到的可执行范围为[d3,d4);

(2)应用节点node4的节点状态不是活跃,应用节点node2的节点状态为活跃,则目标节点node3的数字指纹值d3为第一数值,应用节点node2的数字指纹值d2为第二数值,则得到的可执行范围为[d3,d2);

(3)应用节点node4和node2的节点状态不是活跃,应用节点node1的节点状态为活跃,则目标节点node3的数字指纹值d3为第一数值,应用节点node1的数字指纹值d1为第二数值,则得到的可执行范围为[d3,d2]和[0,d1),其中d2为应用节点node2的数字指纹值;

(4)应用节点node4、node2和node1的节点状态均不是活跃,说明所有的任务实例都需要由目标节点node3执行。

本发明在得到目标实例的可执行范围之后,执行步骤s1013:根据任务实例表中任务实例对应的数字值指纹,确定符合可执行范围的任务实例为可选任务实例。本发明中利用数字值指纹将任务实例与创建该任务实例的应用节点进行关联。同时,计算得到的目标节点的可执行范围利用数字值指纹得到的。因此,可以通过查询任务实例表中哪些任务实例对应的数字值指纹是否在可执行范围,若一个任务实例对应的数字值指纹在可执行范围内,则认为该任务实例为可选任务实例。

接着,执行步骤s1014:根据可选任务实例的实例状态和可重试次数,判断可选任务实例是否为目标任务实例,若是,则加载目标任务实例。若通过任务实例表,查询到可选任务实例的实例状态为未执行,且该可选任务实例的可重试次数大于0,则可以确认这个可选任务实例是目标任务实例。在本发明中,可重试次数等于最大重试次数与当前重试次数的差值。

通过步骤s101,可以得到目标节点会根据相邻应用节点的节点状态来决定是否替它来执行任务实例。在心跳机制运转正常的情况下,也就是说在应用节点的节点状态判断正确的情况下,仅利用步骤s101执行任务调度的方法是稳定可靠的,但是当由于某种原因(比如网络故障等)导致应用节点状态判断有误时,就会发生同一个任务实例被多个应用节点同时获取并执行的情况,即发生同一个任务被多次执行的问题。为了避免这个问题,本发明的任务调度方法,在执行步骤s101获取到目标任务实例之后,会执行步骤s102:利用互斥锁机制,根据目标任务实例的版本信息对目标任务实例进行验证。

本发明实施例中,对目标实例进行验证的方法具体可以包括:更新目标任务实例的版本信息,并利用互斥锁机制验证是否成功更新目标任务实例的版本信息,若是,则认为目标任务实例验证通过,否则,认为目标任务实例验证不通过。在任务实例表中增加了实例版本信息,在执行该目标任务实例之前,将通过更新实例版本信息(比如将实例版本信息累加1)利用数据库的互斥锁机制实现“乐观锁”的功能,从而使得同一个目标任务实例只有一个目标节点可以真正去执行,其他在“乐观锁”竞争中失败的目标节点将退出对这个目标任务实例的执行,彻底避免这一问题的发生。

假设目标任务实例当前的实例版本信息version为curversion,当目标节点执行目标任务实例之前,它可以先执行如下的数据库语句来更新目标任务实例的实例版本信息:updatetasksetversion=version 1whereversion=curversion。目标节点更新操作成功的条件是目标任务实例的当前实例版本信息必须是curversion,而不能是其他值。当多个目标节点对同一个目标任务实例进行如上操作时,由于数据库的互斥锁机制(因为它们要对同一条记录进行写操作),只能有一个目标节点操作成功,而其他目标节点会被挂起。当被挂起的目标节点恢复操作时,由于目标任务实例的实例版本信息已经被加1了,所以上述的where条件就不满足了,数据库操作就会失败,这些目标节点就会马上退出执行流程,从而最终保证了多个目标节点中只有一个目标节点可以成功更新同一个目标任务实例的状态,因此只有成功的那个目标节点可以执行该目标任务实例。

本发明在步骤s102对目标任务实例进行验证之后,执行步骤s103:若验证通过,则目标节点从任务实例表中获取到该目标任务实例的执行逻辑,进而可以完成执行该目标任务实例。若验证不通过,则说明该目标节点在互斥锁竞争机制中竞争失败,或者是说该目标任务实例的可重试次数小于1,不可以被执行,此时,该目标节点放弃执行该目标任务实例。

图2是实现本发明实施例的任务调度方法的总体结构示意图。如图2所示,实现本发明实施例的任务调度方法的总体结构主要可以包括任务调度sdk和数据库两部分。

任务调度sdk(即,软件开发工具包softwaredevelopmentkit,一般都是一些软件工程师为特定的软件包、软件框架、硬件平台、操作系统等建立应用软件时的开发工具的集合)是本发明提供的一种任务调度工具包。考虑到现有技术中任务调度方法的架构复杂、部署繁琐等问题,本发明中可以采用文件库(lib库)的方式对任务调度sdk提供的任务调度方法进行编译处理,并获取该任务调度方法的下载链接,这样做可以不需要部署复杂的外部任务调度系统,直接调用该下载链接就可以实现任务调度,极大地减少对资源的需求。

从图2中可以看出,任务调度sdk可以提供的功能有任务调度启动、任务实例选择、应用节点状态管理以及任务执行冲突。本发明中数据库中存储记录节点信息的应用节点表(即,node表)和记录任务实例信息的任务实例表(即,task表)。在应用程序中直接利用sdk,并且应用程序自己创建数据库,sdk直接访问本地数据库来完成任务调度的功能。或者是,实现一个服务端,数据库由服务端来访问,服务端可以通过互联网协议或者远程调用方式供sdk调用,此种实现能够使得多个应用程序来共享数据库,避免应用程序自己建库,从而可以节省资源。

应用节点引用本技术方案提供的任务调度sdk,在业务逻辑的合适位置(此处的合适位置并没有特别要满足的条件,一般是指接收到任务实例创建指令时)调用sdk提供的调用接口来完成任务实例的创建和存储,其它交由sdk透明完成,这包括目标节点选择要执行的任务实例、任务实例的执行、应用节点状态管理、任务实例执行冲突解决等等。也就是说,本方案中业务人员调用接口创建任务实例之后,后续的任务实例执行等功能都由sdk自动完成的,下面分成几部分来详细阐述本技术方案。

(1)数据库中的表结构

如前所述,数据库中存放task表和node表。node表中存放了应用节点的心跳,其数据是由sdk内部的一个定时任务生成的。node表包含如下字段:id(node表中应用节点的序号)、appid、ip、createdtime(应用节点的创建时间)、hbtime。task表中存放了具体运行一个任务实例所需的要素,其数据是由应用节点在业务逻辑的合适位置调用sdk的接口生成的。task表包含如下字段:taskid、tasktype、appid、contents、status(任务实例的实例状态)、hashcode(生成该任务实例的应用节点的数字指纹值)、maxretriedcnt、retriedcnt、version、createdtime(任务实例的创建时间)、lastupdatedtime。对于一个应用程序,可能存在多种任务,appid和tasktype这个二元组可以唯一确定一种任务,每一种任务可以有多个任务实例,每个任务实例的具体内容对应在contents字段中,即contents中封装了任务实例要执行的逻辑,其具体内容可以通过对完成任务实例逻辑的对应方法使用java(即,一种计算机编程语言)等编程语言的反射机制得到,其可用如下伪代码来表示:

通过把invocation数据结构进行序列化操作(比如使用kryo等序列化技术)可以得到一个字节序列,该字节序列可用关系型数据库(比如mysql)存储。对任意任务实例的执行逻辑按照上述方法进行处理、序列化后保存、后续反序列化并执行之,保证了本技术方案的通用性,可以用来表示出任意功能的任务。

(2)任务调度启动器

本发明可以使用现成库(比如java提供的quartz库)来完成任务调度启动器工作,这部分工作包括了在什么时间触发条件下调用哪个类来完成任务实例的启动。一旦该启动器执行成功,它将周期性地调用指定类来执行具体的任务实例。一般地,在所有的应用节点上都会运行任务实例启动器,每当启动器被触发而开始运行时,选择哪些具体的任务实例以及从哪里获取这些任务实例就需要借助对应应用节点上的sdk来完成。

(3)应用节点状态管理

sdk周期性(比如每30秒一次)地向数据库的node表中记录某个应用节点的心跳信息,一个应用节点对应一条记录,每次都更新hbtime字段。当发现某个应用节点的hbtime在一定时间段(比如是90秒)内没有更新时,就把该应用节点状态变更为非活跃(inactive)。如果发现在更长时间段(比如是8小时)内hbtime没有更新,则把该应用节点状态变更为死亡(dead),并将该应用节点在node表中对应的记录删除。

(4)任务实例分配

每个应用节点都会产生任务实例,应用节点和任务实例是有对应关系的,即通过应用节点的数字指纹值进行关联(上文中提到该数字指纹值可以由应用节点所属的appid和ip按照一定的哈希算法计算得出)。当在某个应用节点上产生一个任务实例并保存到task表中时,该记录中将含有对应应用节点的数字指纹值(即对应task表中的hashcode字段)。缺省情况下,某个应用节点将从task表中选择跟自己的数字指纹值相等的任务实例去执行,以保证任务实例分配的均衡性。但是当某个应用节点出现宕机时,那么它所对应的任务实例就没有被执行的可能了,因此需要其他的应用节点来替这个宕机的应用节点来执行它对应的任务实例,但是又不能是多个应用节点都来替宕机的应用节点,即恰好只有一个应用节点来替。因此,本发明中的任务实例分配选择就是为应用节点分配任务实例的算法,算法的具体介绍在上文中的步骤s101中解释了,此处不再累述。

(5)任务实例执行冲突解决

在上述的任务实例选择算法中,每个应用节点都会根据相邻应用节点的状态(inactive、active或者dead)来决定是否替它来执行任务实例。在应用节点的心跳机制运转正常的情况下,这种方法是稳定可靠的,但是当由于某种原因(比如网络故障等)导致应用节点状态判断有误时,就会发生同一个任务实例被多个应用节点同时获取并执行的情况,即发生同一个任务被多次执行的问题。为了避免这个问题,在task表中增加了version字段,在执行该任务之前,将通过更新version字段(比如将version累加1)利用数据库的互斥锁机制实现“乐观锁”的功能,从而使得同一个任务实例只有一个应用节点可以真正去执行,其他在“乐观锁”竞争中失败的应用节点将退出对这个任务实例的执行,彻底避免这一问题的发生。

图3是根据本发明一个可参考实施例的任务调度方法的主要流程示意图。如图3所示,任务调度方法主要可以包括:

步骤s301:获取目标节点所属的应用程序,并获取该应用程序对应的应用节点集群;

步骤s302:针对应用节点集群中的每个应用节点,分别计算它们的hash值,然后按照hash值从大到小或者从小到大的顺序,对应用节点集群中的应用节点进行排序,得到应用节点排序表;

步骤s303:根据应用节点排序表,查找目标节点的下一个应用节点,接着从下一个应用节点开始,依次循环应用节点排序表,直至找出第一个节点状态为active的应用节点;

步骤s304:确定目标节点的数字指纹值为第一数值,并确定第一个节点状态为active的应用节点的数字指纹值为第二数值,利用第一数值和第二数值,得到目标节点对应的可执行范围;

步骤s305:根据task表中任务实例的hashcode值,确定符合可执行范围的任务实例为可选任务实例;

步骤s306:根据task表中可选任务实例的status、maxretriedcnt和retriedcnt,从可选任务实例中选择目标任务实例;

步骤s307:更新task表中目标任务实例的version;

步骤s308:基于互斥锁机制验证是否成功更新目标任务实例的version,若是,则执行步骤s309,否则,执行步骤s310;

步骤s309:从task表中获取目标任务实例的contents,并根据contents执行目标任务实例;

步骤s310:退出对目标任务实例的执行操作。

本发明中任务实例的创建和存储是指应用节点在接收到任务实例创建指令之后,创建任务实例,并将该任务实例的实例信息存储至数据库中的task表中。实例信息可以包括:taskid、tasktype、appid、contents、status、hashcode、maxretriedcnt、retriedcnt、version、createdtime、lastupdatedtime等。

在步骤s306中,根据task表中可选任务实例的status、maxretriedcnt和retriedcnt,从可选任务实例中选择目标任务实例,具体的实现方法如图4所示。图4是根据本发明又一个可参考实施例的从可选任务实例中选择目标任务实例的方法的主要流程示意图。从图4中可以看出,选择目标任务实例的方法可以包括:

步骤s401:判断可选任务实例的status的实例状态是否为未执行,若是,则执行步骤s402,否则,执行步骤s405;

步骤s402:利用可选任务实例的maxretriedcnt和retriedcnt,计算可选任务实例的可重试次数;

步骤s403:判断可选任务实例的可重试次数是否大于等于1,若是,则执行步骤s404,否则,执行步骤s405;

步骤s404:确认可选任务实例为目标任务实例;

步骤s405:将该可选任务实例从task表中移出。

上述步骤s401、s402和s403的执行顺序也可以根据实际情况调整。应该注意的是,步骤s402需要在步骤s403之前执行,同时步骤s401对于实例的状态判断和步骤s403对于实例的可重试次数的判断可以同时,也可以先判断可重试次数,再判断实例状态。

根据本发明实施例的任务调度方法的技术方案可以看出,采用预设的任务实例分配原则获取目标任务实例的技术手段,所以克服了任务实例分配不均衡以及任务实例被遗漏的问题。此外,本发明中还采用了互斥锁机制的技术手段,解决了同一任务实例会被多次执行的问题。本发明实施例目标节点在接收到任务调度启动指令之后,基于预设的任务实例分配原则,目标节点可以加载需要由其执行的目标任务实例,保证了任务实例分配的均衡性,同时目标节点在执行目标任务实例之前,利用互斥锁机制保证了同一个任务实例不会被多个应用节点执行,从而可以提高了任务调度的效率。

图5是根据本发明实施例的任务调度装置的主要模块的示意图。如图5所示,本发明实施例的任务调度装置500主要包括以下模块:加载模块501、验证模块502和执行模块503。其中,加载模块501可用于在接收到任务调度启动指令后,根据预设的任务实例分配原则,从任务实例表中加载目标节点对应的目标任务实例;验证模块502可用于利用互斥锁机制,根据目标任务实例的版本信息对目标任务实例进行验证;执行模块503可用于若验证通过,则执行目标任务实例,若验证不通过,则退出对目标任务实例的执行操作。

本发明实施例中,加载模块501还可用于:获取目标节点所属的应用程序,并获取应用程序对应的应用节点排序表;根据应用节点排序表和应用节点排序表中应用节点的节点状态,计算目标节点对应的可执行范围;根据任务实例表中任务实例对应的数字值指纹,确定符合可执行范围的任务实例为可选任务实例;根据可选任务实例的实例状态和可重试次数,判断可选任务实例是否为目标任务实例,若是,则加载目标任务实例。

本发明实施例中,加载模块501还可用于:获取应用程序对应的应用节点集群;针对应用节点集群中的一个应用节点,计算一个应用节点的数字指纹值;按照数字指纹值从大到小或者从小到大的顺序,对应用节点集群中的应用节点进行排序,得到应用节点排序表。

本发明实施例中,加载模块501还可用于:根据应用节点排序表,查找目标节点的下一个应用节点;从下一个应用节点开始,依次循环应用节点排序表,直至找出第一个节点状态为活跃的应用节点;确定目标节点的数字指纹值为第一数值,并确定第一个节点状态为活跃的应用节点的数字指纹值为第二数值;利用第一数值和第二数值,得到可执行范围。

本发明实施例中,验证模块502还可用于:更新目标任务实例的版本信息,并利用互斥锁机制验证是否成功更新目标任务实例的版本信息,若是,则认为目标任务实例验证通过,否则,认为目标任务实例验证不通过。

本发明实施例中,任务调度装置还可以包括:创建模块(图中未示出)。该创建模块可用于:在接收到任务实例创建指令后,创建任务实例,并将任务实例的实例信息存储至任务实例表中,实例信息包括:对应的数字值指纹、实例状态、实例版本信息、最大重试次数和当前重试次数,其中对应的数字值指纹是创建任务实例的应用节点的数字值指纹。

从以上描述可以看出,采用预设的任务实例分配原则获取目标任务实例的技术手段,所以克服了任务实例分配不均衡以及任务实例被遗漏的问题。此外,本发明中还采用了互斥锁机制的技术手段,解决了同一任务实例会被多次执行的问题。本发明实施例目标节点在接收到任务调度启动指令之后,基于预设的任务实例分配原则,目标节点可以加载需要由其执行的目标任务实例,保证了任务实例分配的均衡性,同时目标节点在执行目标任务实例之前,利用互斥锁机制保证了同一个任务实例不会被多个应用节点执行,从而可以提高了任务调度的效率。

图6示出了可以应用本发明实施例的任务调度方法或任务调度装置的示例性系统架构600。

如图6所示,系统架构600可以包括终端设备601、602、603,网络604和服务器605。网络604用以在终端设备601、602、603和服务器605之间提供通信链路的介质。网络604可以包括各种连接类型,例如有线、无线通信链路或者光纤电缆等等。

用户可以使用终端设备601、602、603通过网络604与服务器605交互,以接收或发送消息等。终端设备601、602、603上可以安装有各种通讯客户端应用,例如购物类应用、网页浏览器应用、搜索类应用、即时通信工具、邮箱客户端、社交平台软件等(仅为示例)。

终端设备601、602、603可以是具有显示屏并且支持网页浏览的各种电子设备,包括但不限于智能手机、平板电脑、膝上型便携计算机和台式计算机等等。

服务器605可以是提供各种服务的服务器,例如对用户利用终端设备601、602、603所浏览的购物类网站提供支持的后台管理服务器(仅为示例)。后台管理服务器可以对接收到的产品信息查询请求等数据进行分析等处理,并将处理结果(例如目标推送信息、产品信息--仅为示例)反馈给终端设备。

需要说明的是,本发明实施例所提供的任务调度方法一般由服务器605执行,相应地,任务调度装置一般设置于服务器605中。

应该理解,图6中的终端设备、网络和服务器的数目仅仅是示意性的。根据实现需要,可以具有任意数目的终端设备、网络和服务器。

下面参考图7,其示出了适于用来实现本发明实施例的终端设备的计算机系统700的结构示意图。图7示出的终端设备仅仅是一个示例,不应对本发明实施例的功能和使用范围带来任何限制。

如图7所示,计算机系统700包括中央处理单元(cpu)701,其可以根据存储在只读存储器(rom)702中的程序或者从存储部分708加载到随机访问存储器(ram)703中的程序而执行各种适当的动作和处理。在ram703中,还存储有系统700操作所需的各种程序和数据。cpu701、rom702以及ram703通过总线704彼此相连。输入/输出(i/o)接口705也连接至总线704。

以下部件连接至i/o接口705:包括键盘、鼠标等的输入部分706;包括诸如阴极射线管(crt)、液晶显示器(lcd)等以及扬声器等的输出部分707;包括硬盘等的存储部分708;以及包括诸如lan卡、调制解调器等的网络接口卡的通信部分709。通信部分709经由诸如因特网的网络执行通信处理。驱动器710也根据需要连接至i/o接口705。可拆卸介质711,诸如磁盘、光盘、磁光盘、半导体存储器等等,根据需要安装在驱动器710上,以便于从其上读出的计算机程序根据需要被安装入存储部分708。

特别地,根据本发明公开的实施例,上文参考流程图描述的过程可以被实现为计算机软件程序。例如,本发明公开的实施例包括一种计算机程序产品,其包括承载在计算机可读介质上的计算机程序,该计算机程序对应用于执行流程图所示的方法的程序代码。在这样的实施例中,该计算机程序可以通过通信部分709从网络上被下载和安装,和/或从可拆卸介质711被安装。在该计算机程序被中央处理单元(cpu)701执行时,执行本发明的系统中限定的上述功能。

需要说明的是,本发明所示的计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质或者是上述两者的任意组合。计算机可读存储介质例如可以是——但不限于——电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子可以包括但不限于:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机访问存储器(ram)、只读存储器(rom)、可擦式可编程只读存储器(eprom或闪存)、光纤、便携式紧凑磁盘只读存储器(cd-rom)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本发明中,计算机可读存储介质可以是任何对应或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。而在本发明中,计算机可读的信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。计算机可读的信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。计算机可读介质上对应的程序代码可以用任何适当的介质传输,包括但不限于:无线、电线、光缆、rf等等,或者上述的任意合适的组合。

附图中的流程图和框图,图示了按照本发明各种实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段、或代码的一部分,上述模块、程序段、或代码的一部分对应一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个接连地表示的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图或流程图中的每个方框、以及框图或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。

描述于本发明实施例中所涉及到的模块可以通过软件的方式实现,也可以通过硬件的方式来实现。所描述的模块也可以设置在处理器中,例如,可以描述为:一种处理器包括加载模块、验证模块和执行模块。其中,这些模块的名称在某种情况下并不构成对该模块本身的限定,例如,加载模块还可以被描述为“在接收到任务调度启动指令后,根据预设的任务实例分配原则,从任务实例表中加载目标节点对应的目标任务实例的模块”。

作为另一方面,本发明还提供了一种计算机可读介质,该计算机可读介质可以是上述实施例中描述的设备中所对应的;也可以是单独存在,而未装配入该设备中。上述计算机可读介质承载有一个或者多个程序,当上述一个或者多个程序被一个该设备执行时,使得该设备包括:在接收到任务调度启动指令后,根据预设的任务实例分配原则,从任务实例表中加载目标节点对应的目标任务实例;利用互斥锁机制,根据目标任务实例的版本信息对目标任务实例进行验证;若验证通过,则执行目标任务实例,若验证不通过,则退出对目标任务实例的执行操作。

根据本发明实施例的技术方案,因为采用预设的任务实例分配原则获取目标任务实例的技术手段,所以克服了任务实例分配不均衡以及任务实例被遗漏的问题。此外,本发明中还采用了互斥锁机制的技术手段,解决了同一任务实例会被多次执行的问题。本发明实施例目标节点在接收到任务调度启动指令之后,基于预设的任务实例分配原则,目标节点可以加载需要由其执行的目标任务实例,保证了任务实例分配的均衡性,同时目标节点在执行目标任务实例之前,利用互斥锁机制保证了同一个任务实例不会被多个应用节点执行,从而可以提高了任务调度的效率。

上述具体实施方式,并不构成对本发明保护范围的限制。本领域技术人员应该明白的是,取决于设计要求和其他因素,可以发生各种各样的修改、组合、子组合和替代。任何在本发明的精神和原则之内所作的修改、等同替换和改进等,均应对应在本发明保护范围之内。


技术特征:

1.一种任务调度方法,其特征在于,包括:

在接收到任务调度启动指令后,根据预设的任务实例分配原则,从任务实例表中加载目标节点对应的目标任务实例;

利用互斥锁机制,根据所述目标任务实例的版本信息对所述目标任务实例进行验证;

若验证通过,则执行所述目标任务实例,若验证不通过,则退出对所述目标任务实例的执行操作。

2.根据权利要求1所述的方法,其特征在于,所述根据预设的任务实例分配原则,从任务实例表中加载目标节点对应的目标任务实例,包括:

获取所述目标节点所属的应用程序,并获取所述应用程序对应的应用节点排序表;

根据所述应用节点排序表和所述应用节点排序表中应用节点的节点状态,计算所述目标节点对应的可执行范围;

根据所述任务实例表中任务实例对应的数字值指纹,确定符合所述可执行范围的任务实例为可选任务实例;

根据所述可选任务实例的实例状态和可重试次数,判断所述可选任务实例是否为目标任务实例,若是,则加载所述目标任务实例。

3.根据权利要求2所述的方法,其特征在于,所述获取所述应用程序对应的应用节点排序表,包括:

获取所述应用程序对应的应用节点集群;

针对所述应用节点集群中的一个应用节点,计算所述一个应用节点的数字指纹值;

按照数字指纹值从大到小或者从小到大的顺序,对所述应用节点集群中的应用节点进行排序,得到所述应用节点排序表。

4.根据权利要求3所述的方法,其特征在于,所述根据所述应用节点排序表和所述应用节点排序表中应用节点的节点状态,计算所述目标节点对应的可执行范围,包括:

根据所述应用节点排序表,查找所述目标节点的下一个应用节点;

从所述下一个应用节点开始,依次循环所述应用节点排序表,直至找出第一个节点状态为活跃的应用节点;

确定所述目标节点的数字指纹值为第一数值,并确定所述第一个节点状态为活跃的应用节点的数字指纹值为第二数值;

利用所述第一数值和所述第二数值,得到所述可执行范围。

5.根据权利要求1所述的方法,其特征在于,所述利用互斥锁机制,根据所述目标任务实例的版本信息对所述目标任务实例进行验证,包括:

更新所述目标任务实例的版本信息,并利用互斥锁机制验证是否成功更新所述目标任务实例的版本信息,若是,则认为所述目标任务实例验证通过,否则,认为所述目标任务实例验证不通过。

6.根据权利要求1所述的方法,其特征在于,所述方法还包括:

在接收到任务实例创建指令后,创建任务实例,并将所述任务实例的实例信息存储至所述任务实例表中,所述实例信息包括:对应的数字值指纹、实例状态、实例版本信息、最大重试次数和当前重试次数,其中所述对应的数字值指纹是创建任务实例的应用节点的数字值指纹。

7.一种任务调度装置,其特征在于,包括:

加载模块,用于在接收到任务调度启动指令后,根据预设的任务实例分配原则,从任务实例表中加载目标节点对应的目标任务实例;

验证模块,用于利用互斥锁机制,根据所述目标任务实例的版本信息对所述目标任务实例进行验证;

执行模块,用于若验证通过,则执行所述目标任务实例,若验证不通过,则退出对所述目标任务实例的执行操作。

8.根据权利要求7所述的装置,其特征在于,所述加载模块还用于:

获取所述目标节点所属的应用程序,并获取所述应用程序对应的应用节点排序表;

根据所述应用节点排序表和所述应用节点排序表中应用节点的节点状态,计算所述目标节点对应的可执行范围;

根据所述任务实例表中任务实例对应的数字值指纹,确定符合所述可执行范围的任务实例为可选任务实例;

根据所述可选任务实例的实例状态和可重试次数,判断所述可选任务实例是否为目标任务实例,若是,则加载所述目标任务实例。

9.根据权利要求8所述的装置,其特征在于,所述加载模块还用于:

获取所述应用程序对应的应用节点集群;

针对所述应用节点集群中的一个应用节点,计算所述一个应用节点的数字指纹值;

按照数字指纹值从大到小或者从小到大的顺序,对所述应用节点集群中的应用节点进行排序,得到所述应用节点排序表。

10.根据权利要求9所述的装置,其特征在于,所述加载模块还用于:

根据所述应用节点排序表,查找所述目标节点的下一个应用节点;

从所述下一个应用节点开始,依次循环所述应用节点排序表,直至找出第一个节点状态为活跃的应用节点;

确定所述目标节点的数字指纹值为第一数值,并确定所述第一个节点状态为活跃的应用节点的数字指纹值为第二数值;

利用所述第一数值和所述第二数值,得到所述可执行范围。

11.根据权利要求7所述的装置,其特征在于,所述验证模块还用于:

更新所述目标任务实例的版本信息,并利用互斥锁机制验证是否成功更新所述目标任务实例的版本信息,若是,则认为所述目标任务实例验证通过,否则,认为所述目标任务实例验证不通过。

12.根据权利要求7所述的装置,其特征在于,所述装置还包括创建模块,用于:

在接收到任务实例创建指令后,创建任务实例,并将所述任务实例的实例信息存储至所述任务实例表中,所述实例信息包括:对应的数字值指纹、实例状态、实例版本信息、最大重试次数和当前重试次数,其中所述对应的数字值指纹是创建任务实例的应用节点的数字值指纹。

13.一种电子设备,其特征在于,包括:

一个或多个处理器;

存储装置,用于存储一个或多个程序,

当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现如权利要求1-6中任一所述的方法。

14.一种计算机可读介质,其上存储有计算机程序,其特征在于,所述程序被处理器执行时实现如权利要求1-6中任一所述的方法。

技术总结
本发明公开了任务调度方法和装置,涉及计算机技术领域。该方法的一具体实施方式包括:在接收到任务调度启动指令后,根据预设的任务实例分配原则,从任务实例表中加载目标节点对应的目标任务实例;利用互斥锁机制,根据目标任务实例的版本信息对目标任务实例进行验证;若验证通过,则执行目标任务实例,若验证不通过,则退出对目标任务实例的执行操作。该实施方式能够提供一种简单易实现的任务调度方法,保证任务实例在应用节点上分配的均衡性,确保任务实例不会被遗漏,同时可以保证同一任务实例不会被多次执行,提高任务调度的效率。

技术研发人员:张晋军;刘海锋;何小锋
受保护的技术使用者:北京京东尚科信息技术有限公司;北京京东世纪贸易有限公司
技术研发日:2018.11.30
技术公布日:2020.06.09

转载请注明原文地址: https://bbs.8miu.com/read-28179.html

最新回复(0)