本申请公开一种应用系统多服务集群下定时任务调度方法,涉及集群服务器领域,接收指令创建任务,将任务对应数据存入数据库并同步到redis缓存中;查询redis缓存的任务列表,根据任务列表中各任务的状态信息更新可执行任务列表;基于redis分布式机制获取可执行任务列表对应的任务锁争抢列表,通过争抢锁机制和任务的前序条件完成情况确定目标任务;对目标任务创建子任务线程,并放到本地线程池中异步执行和同步redis缓存。本方案采用redis争抢锁机制来抢占任务,对关联性任务采用前序条件和后续条件核验机制来校验,确保高并发状态下任务不会重复触发,且采用线程池分配的方案避免了数据库io高占用和锁死的问题。了数据库io高占用和锁死的问题。了数据库io高占用和锁死的问题。
【技术实现步骤摘要】
应用系统多服务集群下定时任务调度方法
[0001]本申请实施例涉及服务器领域,特别涉及一种应用系统多服务集群下定时任务调度方法。
技术介绍
[0002]服务器集群就是指将很多服务器集中起来一起进行同一种服务,在客户端看来就像是只有一个服务器。集群可以利用多个计算机进行并行计算从而获得很高的计算速度,也可以用多个计算机做备份,从而使得任何一个机器坏了整个系统还是能正常运行。一旦在服务器上安装并运行了集群服务,该服务器即可加入群集。集群化操作可以减少单点故障数量,并且实现了群集化资源的高可用性。
[0003]当应用系统处于多服务集群部署状态下时,由于存在服务同一个定时任务会被重复触发,如果存在关联任务时相关联的任务也会被同时触发,这就可能会造成一个任务执行多遍。
[0004]针对重复触发和执行的情况,现有分布式任务调度主要有以下两种解决方案:
[0005]1.OpenSymphony开源组织的Quartz定时任务组件。该组件使用数据库锁的方式解决多服务情况下相同任务被同时唤醒的问题,但是无法实现连锁任务的级联触发。需要额外配置定时任务对前一任务查询或者自己在任务中手动触发下一任务。由于使用数据库锁在服务集群较大或任务较多的情况下会造成数据库io阻塞严重影响数据库性能。并且Quartz组件是java开发只能在java生态中使用。
[0006]2.xxljob任务调度系统。该系统是由个人开发者在Quartz开源组件的基础上进行二次开发,实现了关联任务自动触发功能。同样由于其基于Quartz核心逻辑还是数据库锁,同样会造成数据库io阻塞。并且由于其为java开发并且是个独立运行的平台,如果需要集成进现在系统会有一定的门槛。
技术实现思路
[0007]本申请提供一种应用系统多服务集群下定时任务调度方法,解决多服务集群部署状态下定时任务和关联任务重复触发的问题,所述方法包括:
[0008]接收指令创建任务,将任务对应数据存入数据库并同步到redis缓存中;
[0009]任务核心线程启动并完成数据同步后,查询所述redis缓存的任务列表,根据所述任务列表中各任务的状态信息更新所述可执行任务列表;其中,所述任务列表中包含有所有创建且未执行完毕的任务和对应状态信息,所述可执行任务列表中包含有所述任务核心线程确定的具备执行条件的任务;
[0010]基于redis分布式机制获取所述可执行任务列表对应的任务锁争抢列表,通过争抢锁机制和任务的前序条件完成情况确定目标任务;
[0011]对所述目标任务创建子任务线程,并放到本地线程池中异步执行和同步所述redis缓存。
[0012]具体的,所述redis缓存还包含有所述任务列表对应的争抢锁列表;所述争抢锁列表包括所有服务对任务的争抢状态;
[0013]所述状态信息至少包括每个任务的争抢锁id、任务id、任务参数、定时信息、执行类名、任务重试次数及最大重试次数、任务当前状态、前序任务列表和后续任务列表;所述前序任务列表和所述后续任务列表中包含有执行该任务需要的前序任务和后续任务;所述定时信息为触发该任务争抢机制的时间。
[0014]具体的,所述查询所述redis缓存的查询任务列表,根据所述任务列表中各任务的状态信息更新所述可执行任务列表,包括:
[0015]轮询所述任务列表,根据所述定时信息确定新触发任务,根据任务当前状态、争抢锁id及争抢状态、任务重试次数及最大重试次数确定可执行任务;
[0016]基于所述可执行任务和所述新触发任务更新所述可执行任务列表;
[0017]其中,可执行任务为历史执行失败的任务,且执行次数小于最大重试次数。
[0018]具体的,集群服务器包含若干服务,所述可执行任务列表中的任务对应争抢锁为未占用状态,任务当前状态为未执行状态;
[0019]更新所述可执行任务列表后,所述方法还包括:
[0020]基于任务类型和任务参数对所述可执行任务列表中的所有任务进行归类,将存在关联条件的任务建立各自的所述前序任务列表及所述后续任务列表。
[0021]具体的,所述基于redis分布式机制获取所述可执行任务列表对应的任务锁争抢列表,通过争抢锁机制和任务的前序条件完成情况确定目标任务,包括:
[0022]核对所述可执行任务列表中各个候选任务对应前序任务的完成状态,并将前序任务未完成的所述候选任务滤除,获得中间任务列表;
[0023]基于redis分布式机制对所有中间任务执行多任务争抢,将争抢到的所述中间任务作为所述目标任务,同步更新所述目标任务的任务重试次数、执行信息时间、以及最晚完成时间。
[0024]具体的,当所述目标任务在最晚完成时间内未完成执行任务时,争抢锁自动失效;所述执行信息时间为目标服务争抢到锁的时间,且抢到锁后的争抢锁更新为已占用状态。
[0025]具体的,所述对所述目标任务创建子任务线程,并放到本地线程池中异步执行和同步所述redis缓存,包括:
[0026]对所述目标任务创建所述子任务线程,并在本地线程池中执行;
[0027]根据任务参数执行内容,并记录日志信息;
[0028]执行完成后根据结果更新所述redis缓存中的所述任务列表,用于任务核销。
[0029]具体的,当所述目标任务包含有所述后续任务列表时,读取并更新所述redis缓存中的所述任务列表和所述可执行任务列表,继续通过争抢锁执行后续任务。
[0030]具体的,任务核心线程移交任务到本地线程池中执行后进入休眠状态;然后获取当前所述中间任务列表;当所述中间任务列表不存在满足执行条件的任务时结束线程,否则继续根据所述中间任务列表执行争抢任务。
[0031]本申请提供的技术方案带来的有益效果至少包括:通过在集群服务器中引入redis缓存机制,实时根据数据库内容更新redis缓存内容,并按照所建任务的争抢锁状态和条件完成情况来选择目标任务,特别是在多任务触发条件下,可以确保每个任务都具有
时间上的连贯性,且不会被重复占用和执行。而关联性任务之间则按照前序条件来进行筛选,避免关联任务被重复占用执行,确保任务顺利执行。采用任务核心线程和任务子线程分离执行的机制,可以大幅提高批量任务下的并发率,大幅减少数据库io占用。同时还是负载每一个任务到不同服务内,通过配置线程池能够调整每个服务最大任务数灵活配置使任务分配更优充分使用服务器资源。使用该方案后完美消除了数据库io瓶颈。
附图说明
[0032]图1是本申请实施例提供的应用系统多服务集群下定时任务调度方法的流程图;
[0033]图2是本申请另一实施例提供的应用系统多服务集群下定时任务调度方法的流程图;
[0034]图3是本申请实施例提供的应用系统多服务集群下定时任务调度方法的算法流程图。
具体实施方式
[0035]为使本申请的目的、技术方案和优点更加清楚,下面将结合附图对本申请实施方式作进一步地详细描述。
本文档来自技高网...
【技术保护点】
【技术特征摘要】
1.一种应用系统多服务集群下定时任务调度方法,其特征在于,所述方法包括:接收指令创建任务,将任务对应数据存入数据库并同步到redis缓存中;任务核心线程启动并完成数据同步后,查询所述redis缓存的任务列表,根据所述任务列表中各任务的状态信息更新所述可执行任务列表;其中,所述任务列表中包含有所有创建且未执行完毕的任务和对应状态信息,所述可执行任务列表中包含有所述任务核心线程确定的具备执行条件的任务;基于redis分布式机制获取所述可执行任务列表对应的任务锁争抢列表,通过争抢锁机制和任务的前序条件完成情况确定目标任务;对所述目标任务创建子任务线程,并放到本地线程池中异步执行和同步所述redis缓存。2.根据权利要求1所述的方法,其特征在于,所述redis缓存还包含有所述任务列表对应的争抢锁列表;所述争抢锁列表包括所有服务对任务的争抢状态;所述状态信息至少包括每个任务的争抢锁id、任务id、任务参数、定时信息、执行类名、任务重试次数及最大重试次数、任务当前状态、前序任务列表和后续任务列表;所述前序任务列表和所述后续任务列表中包含有执行该任务需要的前序任务和后续任务;所述定时信息为触发该任务争抢机制的时间。3.根据权利要求2所述的,其特征在于,所述查询所述redis缓存的查询任务列表,根据所述任务列表中各任务的状态信息更新所述可执行任务列表,包括:轮询所述任务列表,根据所述定时信息确定新触发任务,根据任务当前状态、争抢锁id及争抢状态、任务重试次数及最大重试次数确定可执行任务;基于所述可执行任务和所述新触发任务更新所述可执行任务列表;其中,可执行任务为历史执行失败的任务,且执行次数小于最大重试次数。4.根据权利要求3所述的方法,其特征在于,集群服务器包含若干服务,所述可执行任务列表中的任务对应争抢锁为未占用状态,任务当前状态...
【专利技术属性】
技术研发人员:裴俊枫,王宗,
申请(专利权)人:无锡锡银金科信息技术有限责任公司,
类型:发明
国别省市:
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。