一种基于xxl-job框架的分布式任务调度方法及系统与流程

文档序号:32303575发布日期:2022-11-23 09:13阅读:83来源:国知局
一种基于xxl-job框架的分布式任务调度方法及系统与流程

1.本技术涉及计算机任务调度技术领域,更具体地,涉及一种基于xxl-job框架的分布式任务调度方法及系统。


背景技术:

2.目前大多数分布式任务调度框架,比如quartz,xxl-job等,为了保证在实际的生产环境中能够使用,都会进行集群部署,这样随之而来的问题是调度的一致性问题,很可能会发生一个任务在同一时间被多次调度的情况,一般调度端都是通过分布式锁来避免冲突的,但是分布式锁一般都是整体上锁,同一时间只有一个调度模块可以获取锁,其余模块必须等待,影响整体的并发以及效率。


技术实现要素:

3.针对现有技术的至少一个缺陷或改进需求,本发明提供了一种基于xxl-job框架的分布式任务调度方法及系统,能够提高执行的效率,同时增加能够运行的任务量,提高服务器的运行性能,保证该任务系统即时高效的运行。
4.为实现上述目的,按照本发明的第一个方面,提供了一种基于xxl-job框架的分布式任务调度方法,该包括:
5.搭建xxl-job服务端的调度系统,设置所述xxl-job服务端的id,通过所述xxl-job服务端配置的id获取分布式锁;
6.搭建xxl-job执行端,建立所述xxl-job服务端与xxl-job执行端之间的联系;
7.具有相同的id的xxl-job服务端竞争一把分布式锁,成功获取分布式锁后,查找与所述xxl-job服务端的id对应的调度任务,通过所述xxl-job执行端执行相应的任务调度。
8.进一步地,上述基于xxl-job框架的分布式任务调度方法,其中,所述xxl-job服务端的调度系统包括至少一个xxl-job调度端集群和至少一个mysql数据单元;所述xxl-job调度端集群至少包括四个节点,其中两个节点为主节点,另外两个节点分别为所述主节点对应的从节点。
9.进一步地,上述基于xxl-job框架的分布式任务调度方法,其中,所述主节点与其对应的从节点具有相同的id值。
10.进一步地,上述基于xxl-job框架的分布式任务调度方法,其中,所述搭建xxl-job执行端,建立所述xxl-job服务端与xxl-job执行端之间的联系,具体包括:
11.搭建xxl-job执行端,将所述xxl-job执行端的appname参数设置为与所述xxl-job服务端的名称相同。
12.进一步地,上述基于xxl-job框架的分布式任务调度方法,还包括,在所述mysql存储单元中创建xxl_job_lock表与xxl_job_info表,将所述主节点与从节点的id值插入mysql存储单元中的xxl_job_lock表与xxl_job_info表中。
13.进一步地,上述基于xxl-job框架的分布式任务调度方法,其中,所述xxl_job_
info表用于储存定时调度任务的时间以及调度任务的执行方法。
14.进一步地,上述基于xxl-job框架的分布式任务调度方法,其中,在所述xxl_job_info表中增加relation_id字段,所述relation_id字段用于存储调度任务以主键进行取模求余的结果值,以所述xxl-job调度端的数量作为取模的基数。
15.进一步地,上述基于xxl-job框架的分布式任务调度方法,其中,所述查找与所述xxl-job服务端的id对应的调度任务具体包括:
16.在所述xxl_job_info表中查找与所述xxl-job服务端的id值相等的relation_id值,获取与所述xxl-job服务端的id对应的调度任务。
17.按照本发明的第二个方面,还提供了一种基于xxl-job框架的分布式任务调度系统,该系统包括:
18.任务调度模块,至少包括一个任务调度集群,所述任务调度集群至少包括四个xxl-job调度端;
19.任务执行模块,至少包括两个xxl-job执行器,用于当所述xxl-job调度端进行调度时,进行具体调度任务的执行;
20.mysql数据单元,用于存储定时调度任务信息,至少包括调度任务执行时间、调度任务触发时间以及执行类其中之一。
21.进一步地,上述基于xxl-job框架的分布式任务调度系统,其中,将所述四个xxl-job调度端作为四个节点,其中两个节点为主节点,另外两个节点分别为所述主节点对应的从节点,所述主节点与其对应的从节点具有相同的id值。
22.总体而言,通过本发明所构思的以上技术方案与现有技术相比,能够取得下列有益效果:
23.(1)本发明提供的基于xxl-job框架的分布式任务调度方法,对xxl-job服务端的源代码进行修改,通过xxl-job服务端配置的id获取分布式锁;具有相同的id的xxl-job服务端竞争一把分布式锁,成功获取分布式锁后,查找与所述xxl-job服务端的id对应的调度任务,通过xxl-job执行端执行相应的任务调度;这种方式能够产生多个分布式锁,不同的服务端可以同时获取分布式锁,能够增加运行的任务量,提高服务器的运行性能;
24.(2)采用本发明提供的基于xxl-job框架的分布式任务调度方法,将调度的任务以主键来进行取模求余,将值保存,该值会与调度端的id相对应。调度时,相同id的调度端均会获取分布式锁,获取锁成功后,在mysql单元中查询与自身id相对应的任务。通过这种方式,将调度任务分散到多个调度单元,能够提升任务的执行效率。
附图说明
25.为了更清楚地说明本技术实施例中的技术方案,下面将对实施例中所需使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本技术的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
26.图1为本技术实施例提供的一种基于xxl-job框架的分布式任务调度方法的流程示意图;
27.图2为本技术实施例提供的基于xxl-job框架的分布式任务调度系统的结构示意图。
具体实施方式
28.为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。此外,下面所描述的本发明各个实施方式中所涉及到的技术特征只要彼此之间未构成冲突就可以相互组合。
29.本技术的说明书和权利要求书及上述附图中的术语“第一”、“第二”、“第三”等是用于区别不同对象,而不是用于描述特定顺序。此外,术语“包括”和“具有”以及它们任何变形,意图在于覆盖不排他的包含。例如包含了一系列步骤或单元的过程、方法、系统、产品或设于已列出的步骤或单元,而是可选地还包括没有列出的步骤或单元,或可选地还包括对于这些过程、方法、产品或设备固有的其他步骤或单元。
30.一方面,本技术提出了一种基于xxl-job框架的分布式任务调度方法,图1为本技术实施例提供的一种基于xxl-job框架的分布式任务调度方法的流程示意图。请参阅图1,该方法包括:
31.(1)搭建xxl-job服务端的调度系统,设置所述xxl-job服务端的id,通过所述xxl-job服务端配置的id获取分布式锁;
32.具体地,对xxl-job服务端的源代码进行修改,找到xxl-job-admin模块下的jobschedulehelper.java文件,找到文件中的start方法,传统方法是通过mysql语句select for update wherelock_name=”来获取表中唯一的锁,现在本技术将where改成自身服务端所配置的id。
33.即,将语句preparedstatement=conn.preparestatement()中的sql语句修改为:
34."select*from xxl_job_lock where lock_name=#{id}for update"
35.其中#{id}为从配置文件中读取的xxl-job服务端的id。
36.通过增加参数的方式修改schedulejobquery传入的sql语句,在查询过滤条件中增加#{id},确保xxl-job服务端只选择出与自身id相同的调度任务。
37.xxl-job服务端的调度系统包括至少一个xxl-job调度端集群和至少一个mysql数据单元;xxl-job调度端集群至少包括四个调度端:servera、serverb、serverc与serverd。以这四个调度端作为四个节点,其中两个节点为主节点,即master节点;另外两个分别为主节点对应的从节点,即slave节点。master节点与其对应的slave节点具有相同的id值。id相当于xxl-job调度端分组的依据,id相同的xxl-job调度端为一组,竞争同一把分布式锁。
38.在一个具体的实施例中,将servera和serverb的id值设置为1,serverc和serverd的id值设置为2。
39.(2)搭建xxl-job执行端,建立所述xxl-job服务端与xxl-job执行端之间的联系;
40.xxl-job执行端至少包括两个xxl-job执行器,当xxl-job调度端进行调度时,进行具体调度任务的执行。对于xxl-job执行端,一般是以spring项目来进行启动的,不需要进行修改,按照默认给的例子进行配置即可。appname参数用于返回xxl-job执行端的名称,将xxl-job执行端的appname参数设置为与xxl-job服务端的名称相同,作为xxl-job执行端注册到xxl-job服务端的依据,以用于建立xxl-job服务端与xxl-job执行端之间的联系,使得xxl-job服务端能够调动xxl-job执行端执行相应的任务调度。
41.(3)具有相同的id的xxl-job服务端竞争一把分布式锁,成功获取分布式锁后,查
找与所述xxl-job服务端的id对应的调度任务,通过所述xxl-job执行端执行相应的任务调度。
42.在mysql存储单元中创建xxl_job_lock表与xxl_job_info表,将主节点与从节点的id值插入mysql存储单元中的xxl_job_lock表与xxl_job_info表中。
43.具体地,xxl_job_lock表原本仅有一条数据,代表全局的分布式锁,现将xxl-job服务端的id值插入。在一个具体的实施例中,在表中插入servera-serverd所对应的id值,以插入相应的分布式锁。此步骤通过下述代码执行:
44.insertintoxxl_job_lock(lock_name)values('1');
45.insertintoxxl_job_lock(lock_name)values('2');
46.具体地,xxl_job_info表用于储存定时调度任务的时间以及调度任务的执行方法,调度任务通过主键值进行标定。在xxl_job_info表中增加relation_id字段,relation_id字段用于存储调度任务以主键进行取模求余的结果值,以xxl-job调度端的数量作为取模的基数,relation_id字段的值等于xxl-job调度端节点的id值。
47.在一个具体的实施例中,通过修改xxl_job_info表中的触发器来实现增加relation_id字段,触发器实现逻辑如下:
48.trigger"trg"afterinsertonxxl_job_info
49.foreachrow
50.declare
51.v_newvalnumber(12):=0;
52.begin
53.v_newval=select last_insert_id();
54.updatexxl_job_info set relation_id=mod(v_newval,2)where id=v_newval;
55.end;
56.具有相同id的xxl_job服务端首先通过select for update的方式在xxl_job_lock表中竞争同一把锁,在xxl_job_info表中查找与xxl-job服务端的id值相等的relation_id值,以此来获取与xxl-job服务端的id对应的调度任务,通过xxl-job执行端执行相应的任务调度。
57.另一方面,本技术实施例提供了基于xxl-job框架的分布式任务调度系统,图2为本技术实施例提供的基于xxl-job框架的分布式任务调度系统的结构示意图。请参阅图2,该系统包括任务调度模块、任务执行模块以及mysql数据单元。
58.任务调度模块,至少包括一个任务调度集群,所述任务调度集群至少包括四个xxl-job调度端;
59.对xxl-job服务端的源代码进行修改,找到xxl-job-admin模块下的jobschedulehelper.java文件,找到文件中的start方法,传统方法是通过mysql语句select for update wherelock_name=”来获取表中唯一的锁,现在本技术将where改成自身服务端所配置的id。
60.将四个xxl-job调度端作为四个节点,其中两个节点为主节点,另外两个节点分别为所述主节点对应的从节点,主节点与其对应的从节点具有相同的id值。
61.任务执行模块,至少包括两个xxl-job执行器,用于当所述xxl-job调度端进行调度时,进行具体调度任务的执行;
62.将xxl-job执行端的appname参数设置为与xxl-job服务端的名称相同,作为xxl-job执行端注册到xxl-job服务端的依据,以用于建立xxl-job服务端与xxl-job执行端之间的联系,使得xxl-job服务端能够调动xxl-job执行端执行相应的任务调度。
63.mysql数据单元,用于存储定时调度任务信息,至少包括调度任务执行时间、调度任务触发时间以及执行类其中之一。
64.在mysql存储单元中创建xxl_job_lock表与xxl_job_info表,将主节点与从节点的id值插入mysql存储单元中的xxl_job_lock表与xxl_job_info表中。在xxl_job_info表中增加relation_id字段,relation_id字段用于存储调度任务以主键进行取模求余的结果值,以xxl-job调度端的数量作为取模的基数,relation_id字段的值等于xxl-job调度端节点的id值。具有相同id的xxl_job服务端首先通过select for update的方式在xxl_job_lock表中竞争同一把锁,在xxl_job_info表中查找与xxl-job服务端的id值相等的relation_id值,以此来获取与xxl-job服务端的id对应的调度任务,通过xxl-job执行端执行相应的任务调度。
65.在一个具体的实施例中,现有某个地区治理项目任务需要执行,在xxl_job_info表中创建所要执行的定时调度任务,总共有将近50个定时调度任务,且大部分定时任务时间都存在重合,5分钟之内要执行的任务可到达到30个左右,若采用原有框架,那么多个调度端只有一个执行任务,要对50个调度任务进行逻辑处理,然后执行调度,若同时调度任务很耗时,那么会导致任务延迟。
66.本技术采用改进后的xxl-job框架,搭建xxl-job服务端的调度系统,建立四个调度端,以这四个调度端作为四个节点,其中两个节点为主节点,另外两个分别为主节点对应的从节点。设置调度端的id,主节点与其对应的从节点具有相同的id值。id相当于调度端分组的依据,id相同的调度端为一组,竞争同一把分布式锁。
67.搭建执行端,执行端包括两个执行器,将执行端的appname参数设置为与服务端的名称相同,作为执行端注册到服务端的依据,以用于建立服务端与执行端之间的联系,使得服务端能够调动执行端执行相应的任务调度。
68.在mysql存储单元中创建xxl_job_lock表与xxl_job_info表,将主节点与从节点的id值插入mysql存储单元中的xxl_job_lock表与xxl_job_info表中。在xxl_job_info表中增加relation_id字段,relation_id字段用于存储调度任务以主键进行取模求余的结果值,以xxl-job调度端的数量作为取模的基数,relation_id字段的值等于xxl-job调度端节点的id值。具有相同id的服务端首先通过select for update的方式在xxl_job_lock表中竞争同一把锁,在xxl_job_info表中查找与xxl-job服务端的id值相等的relation_id值,以此来获取与xxl-job服务端的id对应的调度任务,通过执行端执行相应的任务调度。
69.四个调度端被分为两类去执行某个地区治理项目任务,那么50个调度任务会被分成两种类型,每个调度类别分别执行25条调度任务,通过执行器执行相应的调度任务。以此种方式执行某个地区治理项目任务,延迟的几率会大大降低。
70.本需要说明的是,对于前述的各方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本技术并不受所描述的动作顺序的限制,因
为依据本技术,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定是本技术所必须的。
71.在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。
72.在本技术所提供的几个实施例中,应该理解到,所揭露的装置,可通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。
73.另外,在本技术各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
74.所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储器中。基于这样的理解,本技术的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储器中,包括若干指令用以使得一台计算机设备(可为个人计算机、服务器或者网络设备等)执行本技术各个实施例所述方法的全部或部分步骤。而前述的存储器包括:u盘、只读存储器(read-only memory,rom)、随机存取存储器(random access memory,ram)、移动硬盘、磁碟或者光盘等各种可以存储程序代码的介质。
75.本领域普通技术人员可以理解上述实施例的各种方法中的全部或部分步骤是可以通进程序来指令相关的硬件来完成,该程序可以存储于一计算机可读存储器中,存储器可以包括:闪存盘、只读存储器(read-only memory,rom)、随机存取器(random access memory,ram)、磁盘或光盘等。
76.以上所述者,仅为本公开的示例性实施例,不能以此限定本公开的范围。即但凡依本公开教导所作的等效变化与修饰,皆仍属本公开涵盖的范围内。本领域技术人员在考虑说明书及实践这里的公开后,将容易想到本公开的其实施方案。本技术旨在涵盖本公开的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本公开的一般性原理并包括本公开未记载的本技术领域中的公知常识或惯用技术手段。说明书和实施例仅被视为示例性的,本公开的范围和精神由权利要求限定。
77.以上实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。
78.本领域的技术人员容易理解,以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1