CN111400015A - 一种任务调度方法及装置 - Google Patents
一种任务调度方法及装置 Download PDFInfo
- Publication number
- CN111400015A CN111400015A CN202010214730.7A CN202010214730A CN111400015A CN 111400015 A CN111400015 A CN 111400015A CN 202010214730 A CN202010214730 A CN 202010214730A CN 111400015 A CN111400015 A CN 111400015A
- Authority
- CN
- China
- Prior art keywords
- task
- application instance
- tasks
- list
- thread
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/48—Program initiating; Program switching, e.g. by interrupt
- G06F9/4806—Task transfer initiation or dispatching
- G06F9/4843—Task transfer initiation or dispatching by program, e.g. task dispatcher, supervisor, operating system
- G06F9/4881—Scheduling strategies for dispatcher, e.g. round robin, multi-level priority queues
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5005—Allocation of resources, e.g. of the central processing unit [CPU] to service a request
- G06F9/5027—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resource being a machine, e.g. CPUs, Servers, Terminals
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明公开了一种任务调度方法及装置,其中方法为:主机设备通过第一应用实例竞争任务列表中的第一任务;所述任务列表中的各任务是由各应用实例注册并用于各应用实例共同竞争的;所述第一应用实例为所述各应用实例中任一应用实例;所述第一任务为所述任务列表中的至少一个任务;所述主机设备若通过所述第一应用实例竞争到所述第一任务,则通过所述第一应用实例调度所述第一任务。上述方法应用于金融科技(Fintech)时,能够充分调动各应用实例所在的主机设备的资源,使得各个应用实例都具有较高的执行效率。
Description
技术领域
本发明涉及金融科技(Fintech)领域中的任务调度领域,尤其涉及一种任务调度方法及装置。
背景技术
随着计算机技术的发展,越来越多的技术应用在金融领域,传统金融业正在逐步向金融科技(Fintech)转变,但由于金融行业的安全性、实时性要求,也对技术提出的更高的要求。目前金融机构每天都要处理大量的数据、大量的任务。
一般来说,对于金融机构的任务调度系统部署在多台硬件设备上,有多个运行的应用实例。但是,目前各个应用实例是独立处理任务的,任务只在被触发的应用实例上执行。这不利于资源的高效利用,举例来说,某个主机设备上的应用实例已经处于繁忙状态,仍然在触发任务,但其他主机设备上的应用实例却处于空闲状态,显然,这样不能让各主机设备上的应用实例具有较高的执行效率,这是一个亟待解决的问题。
发明内容
本发明提供一种任务调度方法及装置,解决了现有技术中不能让各主机设备上的应用实例具有较高的执行效率的问题。
第一方面,本发明提供一种任务调度方法,包括:主机设备通过第一应用实例竞争任务列表中的第一任务;所述任务列表中的各任务是由各应用实例注册并用于各应用实例共同竞争的;所述第一应用实例为所述各应用实例中任一应用实例;所述第一任务为所述任务列表中的至少一个任务;所述主机设备若通过所述第一应用实例竞争到所述第一任务,则通过所述第一应用实例调度所述第一任务。
上述方法中,所述任务列表中的各任务是由各应用实例注册并用于各应用实例共同竞争的,对于所述各应用实例中任一应用实例,如第一应用实例,都可以从任务列表的任务中竞争第一任务,所述主机设备若通过第一应用实例成功竞争到所述第一任务后,可以调度所述第一任务,也就是说,不论第一任务是哪个应用实例注册的,最终调度所述第一任务的是成功竞争到所述第一任务的应用实例,而各应用实例都参与了竞争,都有机会竞争到第一任务,从而可以让各应用实例之间充分竞争,充分调动各应用实例所在的主机设备的资源,使得各个应用实例都具有较高的执行效率。
一种可选实施方式中,所述主机设备通过第一应用实例竞争任务列表中的第一任务;包括:所述主机设备通过所述第一应用实例的轮询线程,按照预设周期,提交抢锁事务;所述抢锁事务用于抢占所述任务列表的互斥锁;所述互斥锁用于锁定所述第一任务调度所需的数据;若所述主机设备通过所述轮询线程提交所述抢锁事务成功后,根据所述任务列表中所述各任务的优先级,选择至少一个任务,作为所述第一任务,从而竞争到所述任务列表中的第一任务;所述抢锁事务提交成功表示所述互斥锁已成功获取;所述主机设备通过所述第一应用实例调度所述第一任务,包括:所述主机设备通过所述第一应用实例,根据所述第一任务调度所需的数据,调度所述第一任务。
上述方法中,所述主机设备通过所述第一应用实例的轮询线程,按照预设周期,提交抢锁事务,可以定时地尝试锁定所述第一任务调度所需的数据,所述主机设备通过所述轮询线程提交所述抢锁事务成功后,根据所述任务列表中所述各任务的优先级,从而竞争到所述任务列表中的第一任务,从而提供了一种通过互斥锁机制来竞争第一任务的方式,保证只有一个应用实例竞争到第一任务,选择至少一个任务是基于所述任务列表中所述各任务的优先级,对不同优先级的任务进行区分,进一步增加应用实例的执行效率。
一种可选实施方式中,所述主机设备通过所述第一应用实例调度所述第一任务之后,还包括:所述主机设备通过所述第一应用实例释放所述互斥锁。
上述方式下,在调度所述第一任务之后,及时地通过所述第一应用实例释放所述互斥锁,从而方便任务调度所需资源的回收。
一种可选实施方式中,所述各任务设置了任务类型;所述主机设备通过第一应用实例竞争任务列表中的第一任务之后,还包括:所述主机设备通过所述第一应用实例,确定所述第一任务的任务类型;所述主机设备调度所述第一任务,包括:所述主机设备根据所述第一任务的任务类型,从所述主机设备的多个线程池中,确定与所述第一任务的任务类型对应的线程池;所述主机设备通过所述与所述第一任务的任务类型对应的线程池中的至少一个空闲线程,调度所述第一任务。
上述方法中,所述各任务设置了任务类型;所述主机设备通过所述第一应用实例,可以先确定所述第一任务的任务类型,再根据所述第一任务的任务类型,从所述主机设备的多个线程池中,确定与所述任务类型对应的线程池,使得不同类型的任务通过各自对应的线程池中的至少一个空闲线程,来调度所述第一任务,针对性的设置相应类型的线程池,从而使得不同任务类型的线程互不影响,保障了每种任务类型都分配可用的线程资源。
一种可选实施方式中,所述多个线程池中每个线程池都设置了最大线程数;所述最大线程数是根据所述主机设备的压力测试设置的。
上述方式下,所述多个线程池中每个线程池都设置了最大线程数,且所述最大线程数是根据所述主机设备的压力测试设置的,从而在所述主机设备的压力测试的范围内,为每种任务类型的任务设置了可用线程资源的上限,避免某种任务类型的任务过多地占用主机设备的资源。
一种可选实施方式中,所述任务列表中的第二任务是由所述主机设备通过所述第一应用实例中的注册线程注册的,所述第二任务为所述任务列表中的任务;所述第二任务包括多个任务;所述方法还包括:若所述多个任务被配置为可并行执行的任务,则所述主机设备通过所述注册线程,将所述多个任务注册到所述任务列表,以供所述各应用实例竞争。
上述方式下,第二任务是通过专用的注册线程注册的,保证了注册的及时性,且所述第二任务包括多个任务,若所述多个任务被配置为可并行执行的任务,便可以将所述多个任务注册到所述任务列表,以供所述各应用实例竞争,从而方便实现多个任务的并发执行,提升了任务处理的效率。
一种可选实施方式中,若所述多个任务被配置为仅能串行执行的任务,则所述主机设备通过所述第一应用实例,调度所述第二任务。
当所述多个任务被配置为仅能串行执行的任务时,即便注册到任务列表中也要按顺序串行执行,被各应用实例竞争也没有意义,因此便直接通过所述第一应用实例,调度所述第二任务,从而减少了不必要的竞争,进一步提升任务的执行效率。
一种可选实施方式中,所述主机设备通过所述第一应用实例执行所述第一任务时,若检测到所述第一任务生成了多个子任务,确定所述多个子任务是否为可并行执行的任务;若是,则所述主机设备将所述多个子任务注册到所述任务列表,以供所述各应用实例竞争。
上述方法中,当主机设备通过所述第一应用实例调度了所述第一任务,执行所述第一任务时,在检测到所述第一任务生成了多个子任务的情况下,且所述多个子任务为可并行执行的任务时,将所述多个子任务注册到所述任务列表,以供所述各应用实例竞争,从而将所述第一应用实例上的任务分摊到其他应用实例,避免第一应用实例在调度第一任务时,因临时产生多个子任务的情况负载过重,进一步增加应用实例的执行效率。
第二方面,本发明提供一种任务调度装置,包括:获取模块,用于通过第一应用实例竞争任务列表中的第一任务;所述任务列表中的各任务是由各应用实例注册并用于各应用实例共同竞争的;所述第一应用实例为所述各应用实例中任一应用实例;所述第一任务为所述任务列表中的至少一个任务;调度模块,用于若通过所述第一应用实例竞争到所述第一任务,则通过所述第一应用实例调度所述第一任务。
一种可选实施方式中,所述获取模块具体用于:通过所述第一应用实例的轮询线程,按照预设周期,提交抢锁事务;所述抢锁事务用于抢占所述任务列表的互斥锁;所述互斥锁用于锁定所述第一任务调度所需的数据;若通过所述轮询线程提交所述抢锁事务成功后,根据所述任务列表中所述各任务的优先级,选择至少一个任务,作为所述第一任务,从而竞争到所述任务列表中的第一任务;所述抢锁事务提交成功表示所述互斥锁已成功获取;所述主机设备通过所述第一应用实例调度所述第一任务,包括:所述主机设备通过所述第一应用实例,根据所述第一任务调度所需的数据,调度所述第一任务。
一种可选实施方式中,所述调度模块还用于:通过所述第一应用实例释放所述互斥锁。
一种可选实施方式中,所述各任务设置了任务类型;所述获取模块还用于:通过所述第一应用实例,确定所述第一任务的任务类型;所述调度模块具体用于:根据所述第一任务的任务类型,从所述装置的多个线程池中,确定与所述第一任务的任务类型对应的线程池;通过所述与所述第一任务的任务类型对应的线程池中的至少一个空闲线程,调度所述第一任务。
一种可选实施方式中,所述多个线程池中每个线程池都设置了最大线程数;所述最大线程数是根据所述装置的压力测试设置的。
一种可选实施方式中,所述任务列表中的第二任务是由所述主机设备通过所述第一应用实例中的注册线程注册的,所述第二任务为所述任务列表中的任务;所述第二任务包括多个任务;所述获取模块还用于:若所述多个任务被配置为可并行执行的任务,则通过所述注册线程,将所述多个任务注册到所述任务列表,以供所述各应用实例竞争。
一种可选实施方式中,所述调度模块还用于:若所述多个任务被配置为仅能串行执行的任务,则通过所述第一应用实例,调度所述第二任务。
一种可选实施方式中,所述调度模块还用于:通过所述第一应用实例执行所述第一任务时,若检测到所述第一任务生成了多个子任务,确定所述多个子任务是否为可并行执行的任务;若是,则将所述多个子任务注册到所述任务列表,以供所述各应用实例竞争。
上述第二方面及第二方面各个可选实施方式的有益效果,可以参考上述第一方面及第一方面各个可选实施方式的有益效果,这里不再赘述。
第三方面,本发明提供一种计算机设备,包括程序或指令,当所述程序或指令被执行时,用以执行上述第一方面及第一方面各个可选的方法。
第四方面,本发明提供一种存储介质,包括程序或指令,当所述程序或指令被执行时,用以执行上述第一方面及第一方面各个可选的方法。
附图说明
图1为本申请实施例提供的一种任务调度方法的步骤流程示意图;
图2为本申请实施例提供的一种任务调度方法的具体步骤流程示意图;
图3为本申请实施例提供的一种任务调度装置的结构示意图。
具体实施方式
为了更好的理解上述技术方案,下面将结合说明书附图及具体的实施方式对上述技术方案进行详细的说明,应当理解本申请实施例以及实施例中的具体特征是对本申请技术方案的详细的说明,而不是对本申请技术方案的限定,在不冲突的情况下,本申请实施例以及实施例中的技术特征可以相互结合。
下面首先列出本申请实施例中出现的名词。
悲观锁:一种数据库保证事务隔离性和一致性的机制,表示一个线程在修改数据之前,必须先对该数据进行锁定,以防止其他线程在同一时刻对该数据进行修改。如果事先已经有其他线程对该数据进行了锁定,当前线程必须被阻塞等待,直到持有线程将锁释放后再被当前线程锁定成功,或者被阻塞至事务超时。
互斥锁:又称为排他锁,是一种应用系统中编制的互斥机制,表示一个线程在执行某个特定的操作之前、或者修改某一段特定的数据之前,必须先对一个唯一的、排他性的对象加锁,这个锁用来保证在任一时刻,只能由一个线程来执行某个特定的操作、或者修改某一段特定的数据。当且仅当拥有这个对象锁的线程,将锁释放之后,其他线程才被允许竞争地再次对该对象加锁。这种应用系统中的各个线程互斥的机制称为互斥锁,一般通过数据库的悲观锁机制来实现。
Quartz:一种著名的、被广泛使用的、基于Java语言的任务调度框架。
Quartz Scheduler:Quartz调度器,向其中注册定时任务后,Quartz Scheduler将在约定的时间触发任务的执行。
Spring Batch:一种著名的、被广泛使用的、基于Java语言和Spring基础框架的数据处理框架。
轮询线程:Java虚拟机(Java virtual machine,JVM)中定时触发的线程,通过该线程执行定时任务。
Cron表达式:一种计划任务的表达式,指定任务在约定的时间触发执行。
在金融机构(银行机构、保险机构或证券机构)在进行业务(如银行的贷款业务、存款业务等)运转过程中,需要处理大量的数据、大量的任务。目前,金融机构的任务调度系统部署在多台硬件设备上,有多个运行的应用实例。但是,目前各个应用实例是独立处理任务的,任务只在被触发的应用实例上执行。这不利于资源的高效利用,这种情况不符合银行等金融机构的需求,无法保证金融机构各项业务的高效运转。为此,如图1所示,本申请提供一种任务调度方法。
步骤101:主机设备通过第一应用实例竞争任务列表中的第一任务。
步骤102:所述主机设备若通过所述第一应用实例竞争到所述第一任务,则通过所述第一应用实例调度所述第一任务。
步骤101~步骤102中,所述任务列表中的各任务是由各应用实例注册并用于各应用实例共同竞争的;所述第一应用实例为所述各应用实例中任一应用实例;所述第一任务为所述任务列表中的至少一个任务。
需要说明的是,所述任务列表中的各任务,可以由任何应用实例注册,也可以被任何应用实例竞争到。举例来说,在第一应用实例上注册的任务可能被第二应用实例竞争到,从而通过这种任务再分配的方法,使得各应用实例充分竞争。
上述步骤101和步骤102,可通过Quartz和Spring Batch来实现。其中,任务的具体执行内容可在Spring Batch中定义,如表1和表2所示。其中,表1为任务定义表,一个任务可以包括多个子任务,具体的子任务定义如表2所示。为提升查询效率,batch_job_define和batch_step_define可以预先加载到JVM缓存中。也可以不使用缓存,或者使用其他类型的缓存(比如Redis,Memcached等),都能达到提升查询效率的目的。
表1任务定义表batch_job_define
表2子任务定义表batch_job_define
任务列表也可在Spring Batch中定义,如表3所示。
表3任务列表batch_job_list
任务调度和管理是交由Quartz的,Spring Batch中的任务在Quartz中也有相应的任务,如表4所示。具体可由Quartz中的ScheduledJob.java实现类实现,该类能够实现Quartz Job基础接口,但并不实际执行任务;当ScheduledJob被触发时,它只负责将触发的任务转换为batch_job_list待处理任务。需要说明的是本发明更侧重于任务调度方法,而非任务执行方法,也非底层依赖技术。该方法不仅适用于Quartz+SpringBatch应用,对于非Quartz+SpringBatch甚至非Java应用程序,本方法仍然适用。
表4 Quartz任务定义表batch_job_schedule
对于所述任务列表中的各任务中任务的注册,以所述任务列表中的第二任务举例来说,所述主机设备可以在所述第一应用实例中分配一个专用的注册线程,用这个注册线程来注册第二任务,所述第二任务为所述任务列表中的任务;所述第二任务可以包括多个任务;那么当所述第二任务包括多个任务时,可以按照以下方式将所述多个任务注册到所述任务列表:
若所述多个任务被配置为可并行执行的任务,则所述主机设备通过所述注册线程,将所述多个任务注册到所述任务列表,以供所述各应用实例竞争。
举例来说,多个任务包括任务一、任务二和任务三,任务一、任务二和任务三可以并行执行,也就是说任务一、任务二和任务三并没有执行顺序上的约束关系。那么主机设备可以通过所述注册线程,将任务一、任务二和任务三注册到所述任务列表。之后,任务一、任务二和任务三可以被多个应用实例分别竞争到,从而将任务一、任务二和任务三分摊到多个应用实例上执行,从而增加了任务的执行效率。
需要说明的是,第二任务包括的多个任务中任务的任务类型可以为表3示出的子任务类型。
相应地,另一种可选实施方式具体可以如下:
若所述多个任务被配置为仅能串行执行的任务,则所述主机设备通过所述第一应用实例,调度所述第二任务。
仍然以上述例子来说,多个任务包括任务一、任务二和任务三。任务一、任务二和任务三既然被配置为仅能串行执行的任务时,那么即便注册到任务列表中也要按顺序串行执行,要相互等待,并不会因为分摊到多个应用实例就缩短了整体的执行时间,被各应用实例竞争并没有意义。因此便直接通过所述第一应用实例,调度任务一、任务二和任务三,从而减少了不必要的竞争,进一步提升任务的执行效率。
还有一种可选实施方式具体可以如下:
所述主机设备通过所述第一应用实例执行所述第一任务时,若检测到所述第一任务生成了多个子任务,确定所述多个子任务是否为可并行执行的任务;若是,则所述主机设备将所述多个子任务注册到所述任务列表,以供所述各应用实例竞争。
需要说明的是,“所述主机设备通过所述第一应用实例执行所述第一任务”中的“执行”指主机设备通过所述第一应用实例调度到所述第一任务之后,所述第一任务具体运行的过程,举例来说,所述主机设备通过所述第一应用实例执行所述第一任务时,所述第一任务生成了第一子任务、第二子任务和第三子任务,便将第一子任务、第二子任务和第三子任务注册到所述任务列表,从而第一子任务、第二子任务和第三子任务也可以被多个应用实例分别竞争到,所以即便在第一任务调度时临时产生多个子任务,也可以将多个子任务分摊到多个应用实例上执行,从而增加了任务的执行效率。
因此,上述步骤101~102基于Quartz和Spring Batch时,实现了一套灵活的任务调度方法,具有以下的优点:a)任务的触发与任务的执行,彻底分离:繁忙应用实例上被Quartz触发的任务,可由其他实例执行;单个实例上的任务生成的若干任务,可由多个实例并发执行。b)多实例相互协同,保证任务执行效率的最大化。c)各种任务调度方法统一。
步骤101的一种可选实施方式如下:
步骤(1-1):所述主机设备通过所述第一应用实例的轮询线程,按照预设周期,提交抢锁事务。
步骤(1-2):若所述主机设备通过所述轮询线程提交所述抢锁事务成功后,根据所述任务列表中所述各任务的优先级,选择至少一个任务,作为所述第一任务,从而竞争到所述任务列表中的第一任务。
步骤(1-1)~步骤(1-2)中,所述抢锁事务用于抢占所述任务列表的互斥锁。该互斥锁可以基于数据库的悲观锁而实现。但事实上,该互斥锁也可以基于数据库的乐观锁而实现,以及基于分布式缓存(比如Redis,Memcached等)而实现,只要都能达到互斥排他的目的都行。当任务通过Spring Batch来定义时,互斥锁的表定义如表5所示。需要说明的是,步骤(1-1)~步骤(1-2)可通过MutexLockFetcher.java和JobCompetitor.java两个实现类来实现。其中,MutexLockFetcher.java用于从batch_mutex_lock表获取或释放互斥锁。JobCompetitor.java是每个应用实例中定时触发的轮询线程,该轮询线程将从MutexLockFetcher.java获取互斥锁,再从batch_job_list中查询待执行任务、标记任务、提交任务,最后还可以释放互斥锁。
所述互斥锁用于锁定所述第一任务调度所需的数据;所述抢锁事务提交成功表示所述互斥锁已成功获取。
表5互斥锁定义表batch_mutex_lock
需要说明的是,步骤(1-1)~步骤(1-2)中的所述互斥锁将所述第一任务调度所需的数据锁定了,在锁定期间所述第一任务调度所需的数据不可被其它应用实例。基于此,一种可选实施方式如下:
在所述主机设备通过所述第一应用实例调度所述第一任务之后,所述主机设备通过所述第一应用实例释放所述互斥锁。通过该方式,及时将互斥锁回收,从而方便任务调度。
需要说明的是,步骤101~步骤102中的所述各任务可以设置任务类型。举例来说,对于任务类型,从不同的角度,有:1)日间定时任务、日终任务、外围系统提交的文件任务;2)仅仅处理少量数据的任务、需要处理海量的数据的任务;3)原子型任务、执行过程中会产生若干新任务的任务;4)高优先级任务、低优先级任务。那么如何统一和简化这些任务的调度?又如何确保高优先级的任务优先执行?为此,所述各任务设置了任务类型的情况下,一种可选实施方式如下:
步骤(2-1):所述主机设备通过所述第一应用实例,确定所述第一任务的任务类型。
步骤(2-2):所述主机设备根据所述第一任务的任务类型,从所述主机设备的多个线程池中,确定与所述第一任务的任务类型对应的线程池。
步骤(2-3):所述主机设备通过所述与所述第一任务的任务类型对应的线程池中的至少一个空闲线程,调度所述第一任务。
需要说明的是,步骤(2-1)~步骤(2-3)的方法可以在Quartz中的ThreadPoolService.java文件中写入,实现线程池服务,举例来说,包含以下3个线程池:
(1)commonThreadPool<java.util.concurrent.ThreadPoolExecutor>,普通任务线程池,用于执行普通任务。
(2)dayendThreadPool<java.util.concurrent.ThreadPoolExecutor>,日终任务线程池,用于执行日终任务。
(3)springBatchThreadPool<java.util.concurrent.ThreadPoolExecutor>,Spring Batch任务线程池,用于执行Spring Batch的任务。
步骤(2-1)~步骤(2-3)的一种可选实施方式中,所述多个线程池中每个线程池都设置了最大线程数;所述最大线程数是根据所述主机设备的压力测试设置的。
所述多个线程池中每个线程池都设置了最大线程数,且所述最大线程数是根据所述主机设备的压力测试设置的,从而在所述主机设备的压力测试的范围内,为每种任务类型的任务设置了可用线程资源的上限,避免某种任务类型的任务过多地占用主机设备的资源,对主机设备进行过载保护。
举例来说,多个线程池为上述3个线程池,这3个线程池的初始线程个数、最大线程个数,可以根据压力测试得到一个最合理的值,即:能发挥单个应用实例的最大效率,同时也不会因为任务太多而过载。可以为3个线程池设置等待队列来实现,都是阻塞式的(BlockingQueue),等待队列大小为0。
下面结合图2,具体说明本申请实施例提供的一种任务调度方法。图2以Quartz和Spring Batch为例,但该方法的实现并不限定于这两个工具。具体可以分为两个阶段:
第一阶段,系统启动阶段:
a)含有Quartz的应用实例,从batch_job_schedule表里读取所有定时任务和对应的cron表达式,并将其注册到Quartz Scheduler中。在这里,可以指定任务每次被Quartz触发时,都只拉起调度任务(ScheduledJob)。
b)启动线程池服务,将线程池的大小、参数等,预先置入到配置文件或系统参数表中。
c)启动1个或多个相互竞争的轮询线程(JobCompetitor),每间隔一定的时间(比如10秒)轮询一次。
第二阶段,系统运行阶段:
a)注册任务:batch_job_schedule里定义的每个任务,都会被Quartz按照约定的时刻触发,每个任务被触发时都会拉起ScheduledJob。ScheduledJob从Quartz的上下文中获得任务名(job_name),并从batch_job_define中查询到对应的优先级(priority)和任务类型(job_type),将该任务设置为待执行状态(READY),再插入batch_job_list中。
b)竞争任务:各个应用实例的轮询线程(JobCompetitor),可以按照预设周期通过MutexLockFetcher.java实现类获取互斥锁。若获取到了互斥锁,则从batch_job_list中查询状态为待执行的任务,根据优先级排序(数字越小优先级越高)获取任务。根据任务的类型(job_type),检查目标线程池是否有空闲线程,如果有,则将该条任务标记为执行中(PROCESSING),再将任务以就绪(Runnable)的状态提交到目标线程池,同时将互斥锁释放。但如果目标线程池满载,则放弃本条任务的执行,将互斥锁释放。
由于互斥锁的排他性,同一时刻只能有一个线程从batch_job_list中查询任务、标记任务、提交任务,如此防止了在多实例、多线程环境下任务被重复执行。另外,每个应用实例的每个轮询线程,是按照预设周期从batch_job_list中竞争地获取1条或多条任务。可以通过设置较短的预设周期(如10秒),使得任务的产生与任务的执行,几乎是实时的。同时,各个实例的负载,也几乎是平均的,效率是最大化的。另外,3个线程池都设置了最大线程数,在有大量任务涌入的情况下,也不会过载。
c)运行任务:任务在运行时,对于批量型任务,一个任务可能会包含多个子任务。如果多个子任务被配置为只能串行执行的,则直接在当前应用实例上执行;如果多个子任务被配置为可并行执行,只需要将多个子任务插入batch_job_list,由所有实例竞争地、并发地执行;另外,一些任务可能在在运行时,临时生成多个子任务(比如大块数据分片后交由SpringBatch执行),则只需要将生成的任务和参数插入batch_job_list,由所有实例竞争地、并发地执行。对于非批量型任务,如提交的文件型、统计型等普通任务,只需要由将任务和参数插入batch_job_list即可。
如图3,本发明提供一种任务调度装置,包括:获取模块301,用于通过第一应用实例竞争任务列表中的第一任务;所述任务列表中的各任务是由各应用实例注册并用于各应用实例共同竞争的;所述第一应用实例为所述各应用实例中任一应用实例;所述第一任务为所述任务列表中的至少一个任务;调度模块302,用于若通过所述第一应用实例竞争到所述第一任务,则通过所述第一应用实例调度所述第一任务。
一种可选实施方式中,所述获取模块301具体用于:通过所述第一应用实例的轮询线程,按照预设周期,提交抢锁事务;所述抢锁事务用于抢占所述任务列表的互斥锁;所述互斥锁用于锁定所述第一任务调度所需的数据;若通过所述轮询线程提交所述抢锁事务成功后,根据所述任务列表中所述各任务的优先级,选择至少一个任务,作为所述第一任务,从而竞争到所述任务列表中的第一任务;所述抢锁事务提交成功表示所述互斥锁已成功获取;所述主机设备通过所述第一应用实例调度所述第一任务,包括:所述主机设备通过所述第一应用实例,根据所述第一任务调度所需的数据,调度所述第一任务。
一种可选实施方式中,所述调度模块302还用于:通过所述第一应用实例释放所述互斥锁。
一种可选实施方式中,所述各任务设置了任务类型;所述获取模块301还用于:通过所述第一应用实例,确定所述第一任务的任务类型;所述调度模块302具体用于:根据所述第一任务的任务类型,从所述装置的多个线程池中,确定与所述第一任务的任务类型对应的线程池;通过所述与所述第一任务的任务类型对应的线程池中的至少一个空闲线程,调度所述第一任务。
一种可选实施方式中,所述多个线程池中每个线程池都设置了最大线程数;所述最大线程数是根据所述装置的压力测试设置的。
一种可选实施方式中,所述任务列表中的第二任务是由所述主机设备通过所述第一应用实例中的注册线程注册的,所述第二任务为所述任务列表中的任务;所述第二任务包括多个任务;所述获取模块301还用于:若所述多个任务被配置为可并行执行的任务,则通过所述注册线程,将所述多个任务注册到所述任务列表,以供所述各应用实例竞争。
一种可选实施方式中,所述调度模块302还用于:若所述多个任务被配置为仅能串行执行的任务,则通过所述第一应用实例,调度所述第二任务。
一种可选实施方式中,所述调度模块302还用于:通过所述第一应用实例执行所述第一任务时,若检测到所述第一任务生成了多个子任务,确定所述多个子任务是否为可并行执行的任务;若是,则将所述多个子任务注册到所述任务列表,以供所述各应用实例竞争。
本申请实施例提供一种计算机设备,包括程序或指令,当所述程序或指令被执行时,用以执行本申请实施例提供的一种任务调度方法及任一可选方法。
本申请实施例提供一种存储介质,包括程序或指令,当所述程序或指令被执行时,用以执行本申请实施例提供的一种任务调度方法及任一可选方法。
最后应说明的是:本领域内的技术人员应明白,本申请的实施例可提供为方法、系统、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、光学存储器等)上实施的计算机程序产品的形式。
本申请是参照根据本申请的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
Claims (11)
1.一种任务调度方法,其特征在于,包括:
主机设备通过第一应用实例竞争任务列表中的第一任务;所述任务列表中的各任务是由各应用实例注册并用于各应用实例共同竞争的;所述第一应用实例为所述各应用实例中任一应用实例;所述第一任务为所述任务列表中的至少一个任务;
所述主机设备若通过所述第一应用实例竞争到所述第一任务,则通过所述第一应用实例调度所述第一任务。
2.如权利要求1所述的方法,其特征在于,所述主机设备通过第一应用实例竞争任务列表中的第一任务;包括:
所述主机设备通过所述第一应用实例的轮询线程,按照预设周期,提交抢锁事务;所述抢锁事务用于抢占所述任务列表的互斥锁;所述互斥锁用于锁定所述第一任务调度所需的数据;
若所述主机设备通过所述轮询线程提交所述抢锁事务成功后,根据所述任务列表中所述各任务的优先级,选择至少一个任务,作为所述第一任务,从而竞争到所述任务列表中的第一任务;所述抢锁事务提交成功表示所述互斥锁已成功获取
所述主机设备通过所述第一应用实例调度所述第一任务,包括:
所述主机设备通过所述第一应用实例,根据所述第一任务调度所需的数据,调度所述第一任务。
3.如权利要求2所述的方法,其特征在于,所述主机设备通过所述第一应用实例调度所述第一任务之后,还包括:
所述主机设备通过所述第一应用实例释放所述互斥锁。
4.如权利要求1所述的方法,其特征在于,所述各任务设置了任务类型;所述主机设备通过第一应用实例竞争任务列表中的第一任务之后,还包括:
所述主机设备通过所述第一应用实例,确定所述第一任务的任务类型;
所述主机设备调度所述第一任务,包括:
所述主机设备根据所述第一任务的任务类型,从所述主机设备的多个线程池中,确定与所述第一任务的任务类型对应的线程池;
所述主机设备通过所述与所述第一任务的任务类型对应的线程池中的至少一个空闲线程,调度所述第一任务。
5.如权利要求4所述的方法,其特征在于,所述多个线程池中每个线程池都设置了最大线程数;所述最大线程数是根据所述主机设备的压力测试设置的。
6.如权利要求1至5任一项所述的方法,其特征在于,所述任务列表中的第二任务是由所述主机设备通过所述第一应用实例中的注册线程注册的,所述第二任务为所述任务列表中的任务;所述第二任务包括多个任务;所述方法还包括:
若所述多个任务被配置为可并行执行的任务,则所述主机设备通过所述注册线程,将所述多个任务注册到所述任务列表,以供所述各应用实例竞争。
7.如权利要求6所述的方法,其特征在于,还包括:
若所述多个任务被配置为仅能串行执行的任务,则所述主机设备通过所述第一应用实例,调度所述第二任务。
8.如权利要求1至5任一项所述的方法,其特征在于,所述通过所述第一应用实例调度所述第一任务之后,所述方法还包括:
所述主机设备通过所述第一应用实例执行所述第一任务时,若检测到所述第一任务生成了多个子任务,确定所述多个子任务是否为可并行执行的任务;
若是,则所述主机设备将所述多个子任务注册到所述任务列表,以供所述各应用实例竞争。
9.一种任务调度装置,其特征在于,包括:
获取模块,用于通过第一应用实例竞争任务列表中的第一任务;所述任务列表中的各任务是由各应用实例注册并用于各应用实例共同竞争的;所述第一应用实例为所述各应用实例中任一应用实例;所述第一任务为所述任务列表中的至少一个任务;
调度模块,用于若通过所述第一应用实例竞争到所述第一任务,则通过所述第一应用实例调度所述第一任务。
10.一种计算机设备,其特征在于,包括程序或指令,当所述程序或指令被执行时,如权利要求1至8中任意一项所述的方法被执行。
11.一种存储介质,其特征在于,包括程序或指令,当所述程序或指令被执行时,如权利要求1至8中任意一项所述的方法被执行。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010214730.7A CN111400015A (zh) | 2020-03-24 | 2020-03-24 | 一种任务调度方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010214730.7A CN111400015A (zh) | 2020-03-24 | 2020-03-24 | 一种任务调度方法及装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN111400015A true CN111400015A (zh) | 2020-07-10 |
Family
ID=71431179
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010214730.7A Pending CN111400015A (zh) | 2020-03-24 | 2020-03-24 | 一种任务调度方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN111400015A (zh) |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112115118A (zh) * | 2020-08-20 | 2020-12-22 | 北京健康之家科技有限公司 | 数据库压测的优化方法及装置、存储介质、电子设备 |
CN112819600A (zh) * | 2021-02-25 | 2021-05-18 | 深圳前海微众银行股份有限公司 | 定时任务的执行方法、装置、设备及计算机存储介质 |
CN113419836A (zh) * | 2021-07-07 | 2021-09-21 | 深圳市珍爱捷云信息技术有限公司 | 任务处理方法、装置、电子设备和计算机可读存储介质 |
CN112819600B (zh) * | 2021-02-25 | 2024-06-07 | 深圳前海微众银行股份有限公司 | 定时任务的执行方法、装置、设备及计算机存储介质 |
-
2020
- 2020-03-24 CN CN202010214730.7A patent/CN111400015A/zh active Pending
Cited By (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112115118A (zh) * | 2020-08-20 | 2020-12-22 | 北京健康之家科技有限公司 | 数据库压测的优化方法及装置、存储介质、电子设备 |
CN112115118B (zh) * | 2020-08-20 | 2023-09-22 | 北京水滴科技集团有限公司 | 数据库压测的优化方法及装置、存储介质、电子设备 |
CN112819600A (zh) * | 2021-02-25 | 2021-05-18 | 深圳前海微众银行股份有限公司 | 定时任务的执行方法、装置、设备及计算机存储介质 |
CN112819600B (zh) * | 2021-02-25 | 2024-06-07 | 深圳前海微众银行股份有限公司 | 定时任务的执行方法、装置、设备及计算机存储介质 |
CN113419836A (zh) * | 2021-07-07 | 2021-09-21 | 深圳市珍爱捷云信息技术有限公司 | 任务处理方法、装置、电子设备和计算机可读存储介质 |
CN113419836B (zh) * | 2021-07-07 | 2023-02-21 | 深圳市珍爱捷云信息技术有限公司 | 任务处理方法、装置、电子设备和计算机可读存储介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US9542221B2 (en) | Dynamic co-scheduling of hardware contexts for parallel runtime systems on shared machines | |
JP2829078B2 (ja) | プロセス分散方法 | |
US9454389B2 (en) | Abstracting a multithreaded processor core to a single threaded processor core | |
KR100898315B1 (ko) | 인핸스드 런타임 호스팅 | |
Attiya et al. | Transactional scheduling for read-dominated workloads | |
Kalé et al. | Converse: An interoperable framework for parallel programming | |
Willhalm et al. | Putting intel® threading building blocks to work | |
US20050125793A1 (en) | Operating system kernel-assisted, self-balanced, access-protected library framework in a run-to-completion multi-processor environment | |
Brandenburg | Multiprocessor real-time locking protocols | |
DE102013214756A1 (de) | Verfahren und vorrichtung zum verbessern des verarbeitungsleistungsvermögens eines mehrkernprozessors | |
JPH05204675A (ja) | スケジューリング方式 | |
JP2012511204A (ja) | リソースを最適化するためのタスク再編成方法 | |
CN111400015A (zh) | 一种任务调度方法及装置 | |
Jiang et al. | Scheduling and analysis of parallel real-time tasks with semaphores | |
US10360079B2 (en) | Architecture and services supporting reconfigurable synchronization in a multiprocessing system | |
US11301304B2 (en) | Method and apparatus for managing kernel services in multi-core system | |
Michael et al. | Relative performance of preemption-safe locking and non-blocking synchronization on multiprogrammed shared memory multiprocessors | |
Horowitz | A run-time execution model for referential integrity maintenance | |
Waddell et al. | A multithreaded simulation executive in support of discrete event simulations | |
Tekin et al. | Pruda: An api for time and space predictible programming in nvdia gpus using cuda | |
JP2021060707A (ja) | 同期制御システムおよび同期制御方法 | |
Giacaman et al. | Task parallelism for object oriented programs | |
Dos Santos et al. | On the design and implementation of real-time resource access protocols | |
Fang et al. | Go-realtime: a lightweight framework for multiprocessor real-time system in user space | |
Rothberg | Interrupt handling in Linux |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |