1.本发明涉及金融科技(fintech)技术领域,尤其涉及一种分布式定时任务执行方法、系统、设备及计算机可读存储介质。
背景技术:
2.随着计算机技术的发展,越来越多的技术(大数据、分布式、区块链blockchain、人工智能等)应用在金融领域,传统金融业正在逐步向金融科技(fintech)转变,但由于金融行业的安全性、实时性要求,也对分布式计算技术提出了更高的要求。quartz是opensymphony(一个开源组织)提供的强大的开源任务调度框架,技术人员可以通过这一框架来方便地执行定时任务。若是在quart框架下使用单节点执行定时任务,会将定时任务请求转发到同一台机器,导致这台机器的cpu使用率飙升,而其他请求此时无法进入,因此会影响到请求处理时效;现有方式中通常会采用分布式方案来解决上述问题,quartz虽然支持分布式方案,但由于缺乏集群容错策略,因此在使用分布式定时任务的过程中,服务节点的宕机会影响到定时任务的执行,从而反映出现有的分布式任务调度框架难以在服务节点宕机的情况下保持正常运行的问题。
技术实现要素:
3.本发明的主要目的在于提出一种分布式定时任务执行方法、系统、设备、计算机可读存储介质,旨在解决现有的分布式任务调度框架难以在服务节点宕机的情况下保持正常运行的技术问题。
4.为实现上述目的,本发明提供一种分布式定时任务执行方法,所述方法应用于分布式服务器集群,所述集群中包含哨兵节点和若干普通节点,所述分布式定时任务执行方法包括:
5.检测到来自配置中心的定时任务触发指令,利用所述哨兵节点通知各所述普通节点所执行的普通实例开始执行所述定时任务触发指令对应的定时任务,其中,所述哨兵节点和各所述普通节点已在所述配置中心完成注册;
6.在通过所述普通实例执行所述定时任务的过程中,若检测到所述集群中发生节点下线,则确定出下线节点的哨兵节点类型或普通节点类型;
7.在所述集群中执行预设的与所述哨兵节点类型或普通节点类型相匹配的容错策略,以基于执行所述容错策略后的集群将所述定时任务执行完成,其中,所述容错策略包括基于所述哨兵节点的数据补偿执行和/或基于各所述普通节点的节点重新选举。
8.可选地,若所述下线节点为所述哨兵节点类型,
9.所述在所述集群中执行预设的与所述哨兵节点类型或普通节点类型相匹配的容错策略,以基于执行所述容错策略后的集群将所述定时任务执行完成的步骤包括:
10.使用预设的选举算法从各所述普通节点中选举出新的哨兵节点;
11.基于新的哨兵节点重新激活各所述普通节点,以利用重新激活后的各所述普通节
点将所述定时任务执行完成。
12.可选地,若所述下线节点为所述普通节点类型,
13.所述在所述集群中执行预设的与所述哨兵节点类型或普通节点类型相匹配的容错策略,以基于执行所述容错策略后的集群将所述定时任务执行完成的步骤包括:
14.删除所述集群中下线的普通节点在所述配置中心的注册信息;
15.通过所述哨兵节点触发针对所述下线的普通节点的数据补偿执行操作,以补偿执行所述下线的普通节点所执行的下线普通实例负责处理的分片数据,其中,所述分片数据为执行所述定时任务所需的部分数据。
16.可选地,所述检测到来自配置中心的定时任务触发指令,利用所述哨兵节点通知各所述普通节点所执行的普通实例开始执行所述定时任务触发指令对应的定时任务的步骤之前,还包括:
17.将所述集群中的各所述普通节点以及所述哨兵节点注册到所述配置中心,其中,所述哨兵节点记录有各所述普通节点的节点名称;
18.生成并发送各所述普通节点的激活请求命令到所述哨兵节点,以供所述哨兵节点按照各所述节点名称返回相应的分片数据索引至各所述普通节点,其中,所述分片数据索引用于指示各所述普通节点从数据库中获取到自身执行所述定时任务所需的分片数据。
19.可选地,所述检测到来自配置中心的定时任务触发指令,利用所述哨兵节点通知各所述普通节点所执行的普通实例开始执行所述定时任务触发指令对应的定时任务的步骤包括:
20.利用所述哨兵节点监听所述配置中心上用于指示定时任务状态的状态参数,并在所述哨兵节点监听所述状态参数的取值变化为当前时间时,将所述状态参数的取值变化作为所述定时任务触发指令;
21.通过所述哨兵节点将所述状态参数的取值由所述当前时间修改为执行参数,以供各所述普通节点在监听到所述状态参数的取值变化为所述执行参数后,通过各自所执行的普通实例开始执行所述定时任务。
22.可选地,所述通过所述哨兵节点将所述状态参数的取值由所述当前时间修改为执行参数的步骤之后,还包括:
23.在各所述普通节点所执行的普通实例内使用线程池,以供各所述普通实例基于所述线程池开始执行所述定时任务,其中,所述线程池中包含生产线程和消费线程。
24.可选地,所述利用所述哨兵节点通知各所述普通节点所执行的普通实例开始执行所述定时任务触发指令对应的定时任务的步骤之后,还包括:
25.在通过所述普通实例执行所述定时任务的过程中,若检测到存在节点新增,则在所述配置中心为新增节点添加普通节点的新增注册信息;
26.生成并发送所述新增节点的激活请求命令到所述哨兵节点,以在所述集群范围内激活所述新增节点。
27.此外,为实现上述目的,本发明还提供一种分布式定时任务执行系统,所述分布式定时任务执行系统设于分布式服务器集群,所述分布式定时任务执行系统包括:
28.定时任务触发模块,用于检测到来自配置中心的定时任务触发指令,利用所述哨兵节点通知各所述普通节点所执行的普通实例开始执行所述定时任务触发指令对应的定
时任务,其中,所述哨兵节点和各所述普通节点已在所述配置中心完成注册;
29.下线节点检测模块,用于在通过所述普通实例执行所述定时任务的过程中,若检测到所述集群中发生节点下线,则确定出下线节点的哨兵节点类型或普通节点类型;
30.容错策略执行模块,用于在所述集群中执行预设的与所述哨兵节点类型或普通节点类型相匹配的容错策略,以基于执行所述容错策略后的集群将所述定时任务执行完成,其中,所述容错策略包括基于所述哨兵节点的数据补偿执行和/或基于各所述普通节点的节点重新选举。
31.此外,为实现上述目的,本发明还提供一种分布式定时任务执行设备,所述分布式定时任务执行设备包括:存储器、处理器及存储在所述存储器上并可在所述处理器上运行的分布式定时任务执行程序,所述分布式定时任务执行程序被所述处理器执行时实现如上所述的分布式定时任务执行方法的步骤。
32.此外,为实现上述目的,本发明还提供一种计算机可读存储介质,所述计算机可读存储介质上存储有分布式定时任务执行程序,所述分布式定时任务执行程序被处理器执行时实现如上所述的分布式定时任务执行方法的步骤。
33.此外,为实现上述目的,本发明还提供一种计算机程序产品,包括计算机程序,所述计算机程序被处理器执行时实现如上述的分布式定时任务执行方法的步骤。
34.本发明通过先将集群中的普通节点注册到配置中心,并将用于监控各普通节点的哨兵节点同样注册到配置中心,然后在监测到当前需要执行定时任务时,通过哨兵节点通知各普通节点,使得各普通节点能够及时且统一地开始执行当前的定时任务;通过在定时任务执行过程中检测到发送节点下线(即宕机)时,按照下线节点的节点类型,基于哨兵节点或各普通节点及时进行数据补偿执行操作或是节点重新选举操作,使得当前所执行的定时任务能够不受节点下线影响继续执行,保证了分布式服务器集群的高可用性,避免了节点下线导致实例执行中断,部分数据未能正常执行的情况,从而解决了现有的分布式任务调度框架难以在服务节点宕机的情况下保持正常运行的技术问题。
附图说明
35.图1是本发明实施例方案涉及的硬件运行环境的设备结构示意图;
36.图2为本发明分布式定时任务执行方法第一实施例的流程示意图;
37.图3为本发明分布式定时任务执行方法第一实施例中一具体实施例系统架构及流程示意的图;
38.图4为本发明分布式定时任务执行方法第二实施例中一具体实施例的选举机制示意图;
39.图5为发明分布式定时任务执行方法第二实施例中一具体实施例的注册流程图;
40.图6为发明分布式定时任务执行方法第三实施例中一具体实施例的任务触发流程图;
41.图7为发明分布式定时任务执行方法第三实施例中一具体实施例的定时任务状态变换示意图;
42.图8为发明分布式定时任务执行方法第三实施例中一具体实施例的线程池机制示意图;
43.图9为发明分布式定时任务执行方法第三实施例中一具体实施例的异常处理流程图;
44.图10为发明分布式定时任务执行方法另一具体实施例的任务执行流程图;
45.图11为本发明分布式定时任务执行系统的功能模块示意图。
46.本发明目的的实现、功能特点及优点将结合实施例,参照附图做进一步说明。
具体实施方式
47.应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
48.随着计算机技术的发展,越来越多的技术(大数据、分布式、区块链blockchain、人工智能等)应用在金融领域,传统金融业正在逐步向金融科技(fintech)转变,但由于金融行业的安全性、实时性要求,也对分布式计算技术提出了更高的要求。quartz是opensymphony(一个开源组织)提供的强大的开源任务调度框架,技术人员可以通过这一框架来方便地执行定时任务。若是在quart框架下使用单节点执行定时任务,会将定时任务请求转发到同一台机器,导致这台机器的cpu使用率飙升,而其他请求此时无法进入,因此会影响到请求处理时效;现有方式中通常会采用分布式方案来解决上述问题,quartz虽然支持分布式方案,但由于缺乏集群容错策略,因此在使用分布式定时任务的过程中,服务节点的宕机会影响到定时任务的执行,从而反映出现有的分布式任务调度框架难以在服务节点宕机的情况下保持正常运行的问题。
49.为解决上述问题,本发明提供一种分布式定时任务执行方法,即通过先将集群中的普通节点注册到配置中心,并将用于监控各普通节点的哨兵节点同样注册到配置中心,然后在监测到当前需要执行定时任务时,通过哨兵节点通知各普通节点,使得各普通节点能够及时且统一地开始执行当前的定时任务;通过在定时任务执行过程中检测到发送节点下线(即宕机)时,按照下线节点的节点类型,基于哨兵节点或各普通节点及时进行数据补偿执行操作或是节点重新选举操作,使得当前所执行的定时任务能够不受节点下线影响继续执行,保证了分布式服务器集群的高可用性,避免了节点下线导致实例执行中断,部分数据未能正常执行的情况,从而解决了现有的分布式任务调度框架难以在服务节点宕机的情况下保持正常运行的技术问题。
50.如图1所示,图1是本发明实施例方案涉及的硬件运行环境的设备结构示意图。
51.如图1所示,该分布式定时任务执行系统可以包括:处理器1001,例如cpu,用户接口1003,网络接口1004,存储器1005,通信总线1002。其中,通信总线1002用于实现这些组件之间的连接通信。用户接口1003可以包括显示屏(display)、输入单元比如键盘(keyboard),可选用户接口1003还可以包括标准的有线接口、无线接口。网络接口1004可选的可以包括标准的有线接口、无线接口(如wi-fi接口)。存储器1005可以是高速ram存储器,也可以是稳定的存储器(non-volatile memory),例如磁盘存储器。存储器1005可选的还可以是独立于前述处理器1001的存储装置。
52.本领域技术人员可以理解,图1中示出的设备结构并不构成对设备的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件布置。
53.如图1所示,作为一种计算机存储介质的存储器1005中可以包括操作系统、网络通信模块、用户接口模块以及分布式定时任务执行程序。
54.在图1所示的设备中,网络接口1004主要用于连接后台服务器,与后台服务器进行数据通信;用户接口1003主要用于连接客户端(程序员端),与客户端进行数据通信;而处理器1001可以用于调用存储器1005中存储的分布式定时任务执行程序,并执行下述分布式定时任务执行方法中的操作。
55.基于上述硬件结构,提出本发明分布式定时任务执行方法实施例。
56.参照图2,图2为本发明分布式定时任务执行方法第一实施例的流程示意图。所述方法应用于分布式服务器集群,所述集群中包含哨兵节点和若干普通节点,所述分布式定时任务执行方法包括:
57.步骤s10,检测到来自配置中心的定时任务触发指令,利用所述哨兵节点通知各所述普通节点所执行的普通实例开始执行所述定时任务触发指令对应的定时任务,其中,所述哨兵节点和各所述普通节点已在所述配置中心完成注册;
58.在本实施例中,配置中心具体可采用zookeeper(一个分布式的,开放源码的分布式应用程序协调服务,它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等)来实现。分布式服务器集群中通常包含多个服务器节点,在本发明中将服务器节点分为两类,一类是普通的服务器节点(即上述普通节点),一类是用于充当哨兵角色对普通节点进行监听的服务器节点(即上述哨兵节点)。需要说明的是,通常哨兵节点与普通节点之间的对应关系为一对多,即一个哨兵节点负责监听多个普通节点。为便于管理,每一定时任务下(通常用名称来区分不同的定时任务)对应一哨兵节点与多个普通节点。普通实例指的是普通节点所执行的服务的实例,而哨兵节点所执行的服务的实例可称为哨兵实例,与之相应的,同一定时任务下的哨兵实例可对多个普通实例进行监听。定时任务触发指令由配置中心发起,配置中心对接定时任务中心,当定时任务中心当前存在需要下发的定时任务,就会触发配置中心上预设的状态参数(此参数用于指示定时任务的最新状态,定时任务的状态具体可包括:初始状态,等待状态,触发状态,开始执行状态,锁定状态等)。
59.具体地,系统在执行定时任务之前,需要将集群中的服务器节点先注册到配置中心,同一个定时任务名称下注册有多个普通节点和一个哨兵节点,并且注册后的各节点监听该定时任务名称对应定时任务的状态参数,以便及时关注到定时任务的状态变化。当状态参数从初始值发生变化时,哨兵节点会监听到此变化,并将其作为上述定时任务触发指令,然后通知到该定时任务下的各个普通节点所执行的普通实例可以开始分片执行该定时任务。
60.步骤s20,在通过所述普通实例执行所述定时任务的过程中,若检测到所述集群中发生节点下线,则确定出下线节点的哨兵节点类型或普通节点类型;
61.在本实施例中,在执行定时任务的过程中,服务器节点可能会出现宕机的情况,若是采取补救措施,可能会出现正在执行的定时任务的部分数据未执行的情况,从而影响到定时任务的正常执行。出现宕机的服务器节点可能是普通节点,也可能是哨兵节点。
62.具体地,对于哨兵节点类型,由于哨兵节点所监听的各普通节点会通过心跳机制每隔一段时间(例如2s)获取一次该哨兵节点的运行情况,因此若哨兵节点下线,各普通节点能够捕捉到该哨兵节点的异常运行情况,并在捕捉到这一下线情况时,即可确定出此时下线节点的节点类型为哨兵节点类型,并将当前所执行的定时任务的状态参数从开始执行
修改为初始状态;
63.对于普通节点类型,由于哨兵节点负责监听各普通节点的运行情况,因此若是有普通节点下线,哨兵节点能够及时捕捉到这一异常情况,确定出此时下线节点的节点类型为普通节点类型。
64.步骤s30,在所述集群中执行预设的与所述哨兵节点类型或普通节点类型相匹配的容错策略,以基于执行所述容错策略后的集群将所述定时任务执行完成,其中,所述容错策略包括基于所述哨兵节点的数据补偿执行和/或基于各所述普通节点的节点重新选举。
65.在本实施例中,容错策略的内容根据节点类型的不同而有所不同。对于普通节点而言,若是普通节点下线,对应的容错策略可设置为:通过哨兵节点来对该下线的普通节点所执行的普通实例无法继续完成的任务数据补偿执行,以确保定时任务中的全部数据都能够执行完成。
66.对于哨兵节点而言,若是哨兵节点下线,对应的容错策略可设置为:在集群中的所有普通节点,或是仅在该哨兵节点监听的各普通节点中进行选举,以选举出一个节点作为新的哨兵节点,然后基于这一新的哨兵节点既可以重新开始执行此定时任务,也可以将新的哨兵节点原先作为普通节点时需要执行的分片数据分配给其他普通节点代替执行,以确保定时任务中的全部数据都能够执行完成。
67.作为一具体实施例,如图3所示。整个系统包括:zookeeper配置中心,多节点所服务的实例,定时任务触发器以及db数据库,整体流程主要分为四部分。第一部分为启动注册流程:各服务器节点的实例(包含哨兵实例和普通实例)注册到zookeeper,并监听指定的状态参数值;第二部分为定时任务触发机制:存在需要执行的定时任务时会修改zookeeper中的状态参数值,使其触发各服务器实例接收变更信号,各实例分片执行各自的数据以执行定时任务;第三部分为高可用集群方案:当定时任务执行时,若存在服务器节点下线导致某个实例执行中断,部分数据未正常执行时的解决方案;第四部分:各实例定时腾无线程池机制:使用线程池生产,消费线程,提高单个服务器实例执行的效率。
68.本实施例提供一种分布式定时任务执行方法。所述分布式定时任务执行方法通过先将集群中的普通节点注册到配置中心,并将用于监控各普通节点的哨兵节点同样注册到配置中心,然后在监测到当前需要执行定时任务时,通过哨兵节点通知各普通节点,使得各普通节点能够及时且统一地开始执行当前的定时任务;通过在定时任务执行过程中检测到发送节点下线(即宕机)时,按照下线节点的节点类型,基于哨兵节点或各普通节点及时进行数据补偿执行操作或是节点重新选举操作,使得当前所执行的定时任务能够不受节点下线影响继续执行,保证了分布式服务器集群的高可用性,避免了节点下线导致实例执行中断,部分数据未能正常执行的情况,从而解决了现有的分布式任务调度框架难以在服务节点宕机的情况下保持正常运行的技术问题。
69.进一步地,基于上述图2所示的第一实施例,提出本发明分布式定时任务执行方法的第二实施例。在本实施例中,若所述下线节点为所述哨兵节点类型,步骤s30包括:
70.步骤a1,使用预设的选举算法从各所述普通节点中选举出新的哨兵节点;
71.步骤a2,基于新的哨兵节点重新激活各所述普通节点,以利用重新激活后的各所述普通节点将所述定时任务执行完成。
72.在本实施例中,从与哨兵节点注册在同一定时任务目录下的各普通节点中使用预
设的选举算法选举出一个普通节点充当新的哨兵节点。预设的选举算法指的是zookeeper中的fastleaderelection机制。
73.作为一具体实施例,如图4所示。图中的client节点即为上述普通节点,guard节点即为上述哨兵节点。
74.当各client节点发现guard节点下线时,先将上述状态参数修改为初始状态start。各client节点进入选举模式:
75.第一步:每个client节点(图中以三个client节点为例)发出一个投票。需要说明的是,无论初始情况还是运行期间,client1和client2都会将自己作为guard节点来进行投票,每次投票会包含所推举的服务实例的节点名称和触发的定时任务名称(在选举期间触发的定时任务),此时client1节点的投票为(1,[task1,task2,task3]),client2节点的投票为(2,[task1,task2]),client3节点的投票为(3,[task1,task2,task3])然后各自将这个投票发给集群中其他client节点)。
[0076]
第二步:接收来自各个client节点的投票(集群的每个服务器收到投票后,首先判断该投票的有效性,如检查是否是本轮投票、是否来自状态参数为初始状态)。
[0077]
第三步:处理投票。针对每一个投票,各client节点都需要将别人的投票和自己的投票进行pk,pk规则如下:优先检查任务名称集合是否为最大子集,如果相同则检查节点名称。节点名称的数值比较大的服务器优先作为guard。对于client1节点而言,它的投票是(1,[task1,task2,task3]),接收client3节点的投票为(3,[task1,task2,task3]),首先会比较两者的任务名称子集(两者均为[task1,task2,task3]),两者相同,比较节点名称(1和3),此时client3节点的节点名称(3)的数值最大,于是更新自己的投票为(3,[task1,task2,task3]),然后重新投票,对于client3而言,其无须更新自己的投票,只是再次向集群中所有机器发出上一次投票信息即可。
[0078]
第四步:统计投票。每次投票后,各client节点都会统计投票信息,判断是否已经有过半节点接受到相同的投票信息,对于client1节点、client2节点而言,都统计出集群中已经有两个节点接受了(3,[task1,task2,task3])的投票信息,此时便认为已经选出了guard节点为client3节点。
[0079]
第五步:改变client3节点的服务器状态,使其成为新的guard节点。
[0080]
第六步:再次进入start初始状态,开始激活其他的client节点,全部激活后,进入将状态参数改为等待waiting状态。
[0081]
第七步:补偿触发task1,task2,task3任务,发送这三个任务到client节点继续执行(即将新的哨兵节点原先作为普通节点时需要执行的分片数据分配给其他普通节点代替执行)。
[0082]
本实施例通过从最先发现原哨兵节点下线的普通节点作为新的哨兵节点,能够降低guard导致的服务中断,并且最先检测到guard异常的数据说明其活跃性最高,更加符合哨兵节点的性能要求。
[0083]
进一步地,若所述下线节点为所述普通节点类型,步骤s30包括:
[0084]
步骤b1,删除所述集群中下线的普通节点在所述配置中心的注册信息;
[0085]
步骤b2,通过所述哨兵节点触发针对所述下线的普通节点的数据补偿执行操作,以补偿执行所述下线的普通节点所执行的下线普通实例负责处理的分片数据,其中,所述
分片数据为执行所述定时任务所需的部分数据。
[0086]
在本实施例中,由于普通节点和哨兵节点在注册时都是以临时节点进行注册,因此当哨兵节点监听到由普通节点下线时,会通知配置中心将该下线的普通节点在配置中心上注册的临时节点进行删除,并且若此时的哨兵节点处于触发状态、开始执行状态或锁定状态,则在该普通节点下线后,哨兵节点会触发一次针对此下线节点的数据补偿执行,具体时补偿执行此下线节点所执行普通实例需要执行的分片数据(各普通节点分片完成定时任务)。以保证定时任务的数据执行不会因为节点下线而遗漏。
[0087]
进一步地,步骤s10之前,还包括:
[0088]
步骤s01,将所述集群中的各所述普通节点以及所述哨兵节点注册到所述配置中心,其中,所述哨兵节点记录有各所述普通节点的节点名称;
[0089]
步骤s02,生成并发送各所述普通节点的激活请求命令到所述哨兵节点,以供所述哨兵节点按照各所述节点名称返回相应的分片数据索引至各所述普通节点,其中,所述分片数据索引用于指示各所述普通节点从数据库中获取到自身执行所述定时任务所需的分片数据。
[0090]
在本实施例中,作为一具体实施例,关于前序的注册流程,如图5所示。
[0091]
第一步:容器启动。遍历创建zookeeper节点/data/task/sendmsg,其中sendmsg等于定时任务名称,初始化sendmsg状态为初始状态start;
[0092]
第二步:创建若干临时节点client(普通节点)到zookeeper,节点名称的设置规则可为:ip+当前时间,创建临时节点guard(哨兵节点)到zookeeper,并获取/data/task/sendmsg的全部子节点(即上述各普通节点),截取节点名称最后的内容作为nodename记录下来(即图中的1~n),每个client节点通过zookeeper检测guard节点注册后,主动发送request命令给guard节点,guard节点返回每个节点的分片索引index,client节点记录各自的分片index;
[0093]
第三步:当所有client节点发送request命令激活之后,就可以正式开始运行,修改sendmsg=waiting(等待状态),以等待定时任务执行请求。
[0094]
前三步即为前序的初始化步骤,在完成前三步之后,第四步就可以通过各个实例来执行定时任务,第五步则为各普通节点从db数据库中根据各自的分片索引获取到相应的分片数据。
[0095]
本实施例通过启动各个普通实例先注册到zookeeper,是为了让哨兵接口在启动之处就监控到普通实例,为实现后续的高可用性能打下基础。
[0096]
进一步地,基于上述图2所示的第一实施例,提出本发明分布式定时任务执行方法的第三实施例。在本实施例中,步骤s10包括:
[0097]
步骤s11,利用所述哨兵节点监听所述配置中心上用于指示定时任务状态的状态参数,并在所述哨兵节点监听所述状态参数的取值变化为当前时间时,将所述状态参数的取值变化作为所述定时任务触发指令;
[0098]
步骤s12,通过所述哨兵节点将所述状态参数的取值由所述当前时间修改为执行参数,以供各所述普通节点在监听到所述状态参数的取值变化为所述执行参数后,通过各自所执行的普通实例开始执行所述定时任务。
[0099]
在本实施例中,状态参数即为上述sendmsg。作为一具体实施例,定时任务触发机
制如图6和7所示。
[0100]
第一步:当存在需要执行的定时任务时,定时任务中心会触发配置中心上的sendmsg值变化为当前时间datetime;
[0101]
第二步:guard节点检测配置中心的sendmsg值变化,记录datetime为定时任务执行开始时间;
[0102]
第三步:修改sendmsg=exec(开始执行状态)
[0103]
第四步:配置中心触发sendmsg值的变更消息,各client节点检测到sendmsg值变化为exec。
[0104]
在完成上述四个步骤之后,就已完成定时任务触发,在定时任务的执行过程中,若是存在节点下线的情况,则可执行第五步:修改sendmsg=reexec;第六步:触发变更消息,各实例接受reexec的命令;第七步:通过各个实例继续执行定时任务;第八步:各普通节点从db数据库中根据各自的分片索引获取到相应的分片数据。
[0105]
另外,当client节点检测sendmsg值为exec,发送recv命令给guard节点,返回(weight,index)参数;当接收所有client节点的recv命令,guard修改sendmsg值为lock(锁定状态);当client节点完成定时任务时发送response命令给guard节点,guard节点记录各个节点完成时间,修改sendmsg=waiting等待下次执行。
[0106]
本实施例通过将定时任务状态变化区分开(图7),方便监测定时任务的健康状态,及时反馈节点异常情况,以快速进行容错处理。
[0107]
进一步地,步骤s12中通过所述哨兵节点将所述状态参数的取值由所述当前时间修改为执行参数的步骤之后,还包括:
[0108]
步骤c1,在各所述普通节点所执行的普通实例内使用线程池,以供各所述普通实例基于所述线程池开始执行所述定时任务,其中,所述线程池中包含生产线程和消费线程。
[0109]
在本实施例中,实例内使用线程池继续提高单个实例的运行效率。
[0110]
作为一具体实施例,如图8所示。
[0111]
第一步:启动加载完毕,定时任务触发,只需修改/data/task/sendmsg的值等于当前时间;
[0112]
第二步:所有监听这个节点的实例容器,接受监听消息开始,将当前节点和总节点数传入程序方法。判断线程等待个数,大于1,丢弃本次请求;如果只有一个线程正在执行,则等待iscomplete锁10秒,修改waitcount结果1-》0,如果获取锁iscomplete锁失败,则丢弃本次请求;若没有线程等待,则创建一个countdownlatch栅栏个数等于生产线程和消费线程总数;线程池执行一个监听线程;线程池执行n个生产线程,记录异步返回结果future;线程池执行m个消费线程,记录异步返回结果future;
[0113]
第三步:监听线程。阻塞等待所有生产,消费线程执行是否完毕;
[0114]
第四步:生产线程。负责实现loaddata方法,分片每次获取从lastrecord开始的queuesize个数数据丢入list,同时结果加入阻塞队列queue;获取loaddata返回数据最新的lastrecord记录;限制每次获取个数queuesize(避免重复获取);当list数据为空,中断生产线程执行;最后iscomplete加1;
[0115]
第五步:消费线程。从queue阻塞1秒获取数据执行业务逻辑dobusiness,当没有数据时iscomplete加1;当有节点加入或者下线将触发节点个数监听,重新执行定时任务,实
现补偿未处理数据执行。
[0116]
传统的线程池捞取数据执行数据方案效率过低,并且线程池异常无法监控,无法感知执行时间,本实施例通过使用生产,消费线程池方案减少线程重新创建,线程执行完的空闲开销,并且可以根据生产,消费执行效率修改线程数量,提高执行效率。
[0117]
进一步地,步骤s10之后,还包括:
[0118]
步骤s40,在通过所述普通实例执行所述定时任务的过程中,若检测到存在节点新增,则在所述配置中心为新增节点添加普通节点的新增注册信息;
[0119]
步骤s50,生成并发送所述新增节点的激活请求命令到所述哨兵节点,以在所述集群范围内激活所述新增节点。
[0120]
在本实施例中,新增节点默认注册为client节点。在存在节点新增时,此新增client节点按照与其他普通节点相同的方式向sendmsg注册子节点,guard节点接受新增节点信息;新增client节点发送request命令到guard节点,以进行激活。
[0121]
作为一具体实施例,如图7和图9所示。
[0122]
图中的前三步骤在前文已有说明,在此不作赘述。第四步为:各实例分片执行定时任务;
[0123]
第五步:在执行过程中,若出现异常场景例如:client节点新增(新增client4)、client节点下线(client3下线)、guard节点下线,则可执行第六步(图中未示出):client4节点新增则向向sendmsg注册子节点,guard节点接受client4节点信息;client4点发送request命令到guard节点,以进行激活;client3节点下线则sendmsg注册子节点会删除对应临时节点,guard节点处于datetime,lock,exec状态时,client3节点下线后,会触发一次reexec补偿执行client3的分片数据,保证定时任务的数据全部被执行(如图中实例3下线后由client4补偿执行实例3的分片数据);guard节点下线时各client节点通过心跳机制每2s获取guard节点的运行情况,当发现guard节点下线,修改sendmsg=start,各client节点使用fastleaderelection算法选举出新的guard节点,具体选举方式已在前文中说明,图中的第七步与第八步也与前述相同,在此不作赘述。
[0124]
本实施例通过具体说明了任务执行时存在新增节点的容错策略,进一步提高了方案整体的高可用性。
[0125]
作为另一执行定时任务的具体实施方式,如图10所示。
[0126]
首先需要启动配置(配置方式同上),容器实例启动:遍历创建zookeeper节点/data/task/sendmsg;注册当前容器实例到zookeeper:(1)节点名称=ip+当前时间;(2)创建临时节点到zookeeper;(3)获取返回的节点路径nodepath,截取最后一个或者最后的内容作为nodename记录下来;获取/data/task/sendmsg的全部子节点;刷新内存记录的节点数据,加上redis自旋锁等待10s;监听订阅数据变化:(1)添加监听器,监听/data/task/sendmsg数据变化;(2)获取自旋锁成功,触发定时任务;监听订阅子节点变化:(1)当有新的节点加入,或原有节点下线,获取自旋锁刷新缓存的nodesize和nodeindex。完成配置后,若有定时任务触发,实例单线程分片执行该定时任务:(1)loaddata方法返回数据;(2)处理loaddata返回结果。
[0127]
如图11所示,本发明还提供一种分布式定时任务执行系统,所述分布式定时任务执行系统设于分布式服务器集群,所述分布式定时任务执行系统包括:
[0128]
定时任务触发模块10,用于检测到来自配置中心的定时任务触发指令,利用所述哨兵节点通知各所述普通节点所执行的普通实例开始执行所述定时任务触发指令对应的定时任务,其中,所述哨兵节点和各所述普通节点已在所述配置中心完成注册;
[0129]
下线节点检测模块20,用于在通过所述普通实例执行所述定时任务的过程中,若检测到所述集群中发生节点下线,则确定出下线节点的哨兵节点类型或普通节点类型;
[0130]
容错策略执行模块30,用于在所述集群中执行预设的与所述哨兵节点类型或普通节点类型相匹配的容错策略,以基于执行所述容错策略后的集群将所述定时任务执行完成,其中,所述容错策略包括基于所述哨兵节点的数据补偿执行和/或基于各所述普通节点的节点重新选举。
[0131]
可选地,若所述下线节点为所述哨兵节点类型,所述容错策略执行模块30包括:
[0132]
哨兵节点选举单元,用于使用预设的选举算法从各所述普通节点中选举出新的哨兵节点;
[0133]
节点重新激活单元,用于基于新的哨兵节点重新激活各所述普通节点,以利用重新激活后的各所述普通节点将所述定时任务执行完成。
[0134]
可选地,若所述下线节点为所述普通节点类型,所述容错策略执行模块30包括:
[0135]
注册信息删除单元,用于删除所述集群中下线的普通节点在所述配置中心的注册信息;
[0136]
分片补偿执行单元,用于通过所述哨兵节点触发针对所述下线的普通节点的数据补偿执行操作,以补偿执行所述下线的普通节点所执行的下线普通实例负责处理的分片数据,其中,所述分片数据为执行所述定时任务所需的部分数据。
[0137]
可选地,所述分布式定时任务执行还包括:
[0138]
集群节点注册模块,用于将所述集群中的各所述普通节点以及所述哨兵节点注册到所述配置中心,其中,所述哨兵节点记录有各所述普通节点的节点名称;
[0139]
分片索引返回模块,用于生成并发送各所述普通节点的激活请求命令到所述哨兵节点,以供所述哨兵节点按照各所述节点名称返回相应的分片数据索引至各所述普通节点,其中,所述分片数据索引用于指示各所述普通节点从数据库中获取到自身执行所述定时任务所需的分片数据。
[0140]
可选地,所述定时任务触发模块10包括:
[0141]
状态参数监测单元,用于利用所述哨兵节点监听所述配置中心上用于指示定时任务状态的状态参数,并在所述哨兵节点监听所述状态参数的取值变化为当前时间时,将所述状态参数的取值变化作为所述定时任务触发指令;
[0142]
状态参数修改单元,用于通过所述哨兵节点将所述状态参数的取值由所述当前时间修改为执行参数,以供各所述普通节点在监听到所述状态参数的取值变化为所述执行参数后,通过各自所执行的普通实例开始执行所述定时任务。
[0143]
可选地,所述分布式定时任务执行系统还包括:
[0144]
线程池使用模块,用于在各所述普通节点所执行的普通实例内使用线程池,以供各所述普通实例基于所述线程池开始执行所述定时任务,其中,所述线程池中包含生产线程和消费线程。
[0145]
可选地,所述分布式定时任务执行系统还包括:
[0146]
新增节点添加模块,用于在通过所述普通实例执行所述定时任务的过程中,若检测到存在节点新增,则在所述配置中心为新增节点添加普通节点的新增注册信息;
[0147]
新增节点激活模块,用于生成并发送所述新增节点的激活请求命令到所述哨兵节点,以在所述集群范围内激活所述新增节点。
[0148]
本发明还提供一种分布式定时任务执行设备。
[0149]
所述分布式定时任务执行设备包括处理器、存储器及存储在所述存储器上并可在所述处理器上运行的分布式定时任务执行程序,其中所述分布式定时任务执行程序被所述处理器执行时,实现如上所述的分布式定时任务执行方法的步骤。
[0150]
其中,所述分布式定时任务执行程序被执行时所实现的方法可参照本发明分布式定时任务执行方法的各个实施例,此处不再赘述。
[0151]
本发明还提供一种计算机可读存储介质。
[0152]
本发明计算机可读存储介质上存储有分布式定时任务执行程序,所述分布式定时任务执行程序被处理器执行时实现如上所述的分布式定时任务执行方法的步骤。
[0153]
其中,所述分布式定时任务执行程序被执行时所实现的方法可参照本发明分布式定时任务执行方法各个实施例,此处不再赘述。
[0154]
本发明还提供一种计算机程序产品,包括计算机程序,所述计算机程序被处理器执行时实现如上述的分布式定时任务执行方法的步骤。
[0155]
其中,所述计算机程序被执行时所实现的方法可参照本发明分布式定时任务执行方法各个实施例,此处不再赘述。
[0156]
需要说明的是,在本文中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者系统不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者系统所固有的要素。在没有更多限制的情况下,由语句“包括一个
……”
限定的要素,并不排除在包括该要素的过程、方法、物品或者系统中还存在另外的相同要素。
[0157]
上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。
[0158]
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到上述实施例方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在如上所述的一个存储介质(如rom/ram、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算机,服务器,或者网络设备等)执行本发明各个实施例所述的方法。
[0159]
以上仅为本发明的优选实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技术领域,均同理包括在本发明的专利保护范围内。
技术特征:
1.一种分布式定时任务执行方法,其特征在于,所述方法应用于分布式服务器集群,所述集群中包含哨兵节点和若干普通节点,所述分布式定时任务执行方法包括:检测到来自配置中心的定时任务触发指令,利用所述哨兵节点通知各所述普通节点所执行的普通实例开始执行所述定时任务触发指令对应的定时任务,其中,所述哨兵节点和各所述普通节点已在所述配置中心完成注册;在通过所述普通实例执行所述定时任务的过程中,若检测到所述集群中发生节点下线,则确定出下线节点的哨兵节点类型或普通节点类型;在所述集群中执行预设的与所述哨兵节点类型或普通节点类型相匹配的容错策略,以基于执行所述容错策略后的集群将所述定时任务执行完成,其中,所述容错策略包括基于所述哨兵节点的数据补偿执行和/或基于各所述普通节点的节点重新选举。2.如权利要求1所述的分布式定时任务执行方法,其特征在于,若所述下线节点为所述哨兵节点类型,所述在所述集群中执行预设的与所述哨兵节点类型或普通节点类型相匹配的容错策略,以基于执行所述容错策略后的集群将所述定时任务执行完成的步骤包括:使用预设的选举算法从各所述普通节点中选举出新的哨兵节点;基于新的哨兵节点重新激活各所述普通节点,以利用重新激活后的各所述普通节点将所述定时任务执行完成。3.如权利要求1所述的分布式定时任务执行方法,其特征在于,若所述下线节点为所述普通节点类型,所述在所述集群中执行预设的与所述哨兵节点类型或普通节点类型相匹配的容错策略,以基于执行所述容错策略后的集群将所述定时任务执行完成的步骤包括:删除所述集群中下线的普通节点在所述配置中心的注册信息;通过所述哨兵节点触发针对所述下线的普通节点的数据补偿执行操作,以补偿执行所述下线的普通节点所执行的下线普通实例负责处理的分片数据,其中,所述分片数据为执行所述定时任务所需的部分数据。4.如权利要求1所述的分布式定时任务执行方法,其特征在于,所述检测到来自配置中心的定时任务触发指令,利用所述哨兵节点通知各所述普通节点所执行的普通实例开始执行所述定时任务触发指令对应的定时任务的步骤之前,还包括:将所述集群中的各所述普通节点以及所述哨兵节点注册到所述配置中心,其中,所述哨兵节点记录有各所述普通节点的节点名称;生成并发送各所述普通节点的激活请求命令到所述哨兵节点,以供所述哨兵节点按照各所述节点名称返回相应的分片数据索引至各所述普通节点,其中,所述分片数据索引用于指示各所述普通节点从数据库中获取到自身执行所述定时任务所需的分片数据。5.如权利要求1所述的分布式定时任务执行方法,其特征在于,所述检测到来自配置中心的定时任务触发指令,利用所述哨兵节点通知各所述普通节点所执行的普通实例开始执行所述定时任务触发指令对应的定时任务的步骤包括:利用所述哨兵节点监听所述配置中心上用于指示定时任务状态的状态参数,并在所述哨兵节点监听所述状态参数的取值变化为当前时间时,将所述状态参数的取值变化作为所述定时任务触发指令;
通过所述哨兵节点将所述状态参数的取值由所述当前时间修改为执行参数,以供各所述普通节点在监听到所述状态参数的取值变化为所述执行参数后,通过各自所执行的普通实例开始执行所述定时任务。6.如权利要求5所述的分布式定时任务执行方法,其特征在于,所述通过所述哨兵节点将所述状态参数的取值由所述当前时间修改为执行参数的步骤之后,还包括:在各所述普通节点所执行的普通实例内使用线程池,以供各所述普通实例基于所述线程池开始执行所述定时任务,其中,所述线程池中包含生产线程和消费线程。7.如权利要求1-6任一项所述的分布式定时任务执行方法,其特征在于,所述利用所述哨兵节点通知各所述普通节点所执行的普通实例开始执行所述定时任务触发指令对应的定时任务的步骤之后,还包括:在通过所述普通实例执行所述定时任务的过程中,若检测到存在节点新增,则在所述配置中心为新增节点添加普通节点的新增注册信息;生成并发送所述新增节点的激活请求命令到所述哨兵节点,以在所述集群范围内激活所述新增节点。8.一种分布式定时任务执行系统,其特征在于,所述分布式定时任务执行系统设于分布式服务器集群,所述分布式定时任务执行系统包括:定时任务触发模块,用于检测到来自配置中心的定时任务触发指令,利用所述哨兵节点通知各所述普通节点所执行的普通实例开始执行所述定时任务触发指令对应的定时任务,其中,所述哨兵节点和各所述普通节点已在所述配置中心完成注册;下线节点检测模块,用于在通过所述普通实例执行所述定时任务的过程中,若检测到所述集群中发生节点下线,则确定出下线节点的哨兵节点类型或普通节点类型;容错策略执行模块,用于在所述集群中执行预设的与所述哨兵节点类型或普通节点类型相匹配的容错策略,以基于执行所述容错策略后的集群将所述定时任务执行完成,其中,所述容错策略包括基于所述哨兵节点的数据补偿执行和/或基于各所述普通节点的节点重新选举。9.一种分布式定时任务执行设备,其特征在于,所述分布式定时任务执行设备包括:存储器、处理器及存储在所述存储器上并可在所述处理器上运行的分布式定时任务执行程序,所述分布式定时任务执行程序被所述处理器执行时实现如权利要求1至7中任一项所述的分布式定时任务执行方法的步骤。10.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质上存储有分布式定时任务执行程序,所述分布式定时任务执行程序被处理器执行时实现如权利要求1至7中任一项所述的分布式定时任务执行方法的步骤。
技术总结
本发明涉及金融科技(Fintech)技术领域。本发明公开了一种分布式定时任务执行方法、系统、设备及计算机存储介质,通过先将集群中的普通节点注册到配置中心,并将监控普通节点的哨兵节点注册到配置中心,然后在监测到当前需要执行定时任务时,通过哨兵节点通知各普通节点,使得各普通节点能够及时且统一地开始执行当前的定时任务;通过在定时任务执行过程中检测到发送节点下线(即宕机)时,按照下线节点的节点类型,基于哨兵节点或各普通节点及时进行数据补偿执行操作或是节点重新选举操作,使得当前所执行的定时任务能够不受节点下线影响继续执行,保证了分布式服务器集群的高可用性,避免了节点下线导致实例执行中断,部分数据未能正常执行的情况。据未能正常执行的情况。据未能正常执行的情况。
技术研发人员:刘浩
受保护的技术使用者:深圳前海微众银行股份有限公司
技术研发日:2021.12.08
技术公布日:2022/3/8