Java开源的任务调度框架是怎样的?

背景

哪些是Maat

为何要做Maat

我们在项目的开发过程中,常常碰到一些步骤化调度的需求,如上线公布步骤、分析任务步骤等。对于某些步骤化的调度任务,我们尝试过自己开发了一套步骤调度系统,也尝试过接入企业集团的工作流,但难免会碰到一些问题:

技术选型

定时任务&步骤任务的调度是一个通用的需求,企业集团内的产品如D2、工作流,开源的产品如、等。

D2

D2是基于ODPS生态的一套步骤调度系统,承载企业集团基于ODPS数据产出的任务调度系统。支持用户自定义撰写脚本,支持定时任务触发和自动触发(补运行的模式),适于基于数据状态的任务步骤调度(如按照数据的产出执行任务流),由D2团队专门维护,有较差的UI。

但它有一些不足:

工作流

企业集团工作流是企业集团审批步骤的一个通用调度引擎,这些产品的审批步骤都是基于企业集团工作流的,同时它也可以作为一个简易的任务调度步骤使用,我们在Maat之前也使用企业集团工作流作为我们步骤任务的调度引擎。它支持自动触发,支持以HSF的方法读取外部系统,支持上下文传递。但它在配置上较为复杂,且支持外部系统的读取模式有限。

是Java开源的任务调度框架。它支持分布式调度、支持任务持久化、支持定时任务,但不支持步骤调度,且任务配置还要耦合在调度系统中,任务的热读取还要做一些扩建。

开源项目是一套分布式的步骤调度系统,它的优势如下:

经过一段时间的考察,我们采用作为我们的原型开发一套分布式任务调度系统,它的功能全面,基本满足业务需求,在功能上扩充相对便捷,外部依赖较少,和搜索生态对接相对容易。

原生的问题

可以解决步骤调度中面临的许多问题,但直接将原生的适于生产,仍面临一些问题:

Maat构架

任务平台广告任务网_魔导师平台任务_任务平台

maat构架:

业务层

任何流程式调度及定时触发的需求均可以通过maat争创应用,maat提供了可视化编辑页面及丰富的api,用户可以便捷地争创编辑步骤模版,设置复杂的分支逻辑,maat会在调度时根据运行时的状态决定步骤的流转路径。

现在接入maat的应用场景包括、、Kmon、容量平台、离线组件平台

管控层

因为原生的管控比较简略,是基于描述任务步骤dag的脚本调度,用户要进行任务的争创、更新、运行还要深入学习原理能够上手,但是后来维护只好基于文件操作,十分不便。因而maat在内层封装一层管控系统Maat,增加维保及用户学习的费用。

右图是Maat管控系统Aflow的操作界面

模版管理

在任务步骤调度的场景中,常见的状况是:不同任务执行的步骤基本一致,只有某些参数不同。因而Maat提出了基于模版管理的任务步骤,用户在模版管理中定义一个步骤的运行模版,对于其中未确定的部份用变量表示。当生成详细任务时,由详细变量和模版渲染出示体的任务。当模版更改时,可以将模版生效到所有依赖该模版的任务。

模版管理预设了集中任务节点,用户可以自由选择不同的任务节点装配模版步骤。

应用管理

管理所有详细的步骤调度任务,包括任务使用的模版、变量的值、报警信息、任务触发等,用户在通过模版争创应用后,后续可以通过应用管理继续维护任务的运行。

队列管理

因为Maat上运行的任务所属应用各不相似,不同应用运行环境也不相似,另外不同应用也希望达到集群隔离的目的。为了实现这个功能Maat提供了队列的管理,指定队列的任务节点会被调度到相应队列的机器上,相应队列的机器也只会运行指定队列的任务节点。

另外,队列上也可以指定并发数,表示当前队列上最多同时有多少个任务运行,确保机器上同时运行的任务不会很多造成负载过低,超过并发的任务会被挂起直至资源释放。

核心模块

Maat核心模块完成了任务调度的整个步骤。核心模块的每位节点都独立运行在机器上,启动上彼此不依赖,所有消息通讯通过DB(数据库)和MQ(消息队列)完成。

WebApi

WebApi提供了丰富的与外部交互的Api,包括任务增删改、历史任务状态、任务状态更改、任务的触发、任务的重试等插口。

任务平台_任务平台广告任务网_魔导师平台任务

另外原生提供的web展示功能只是由该角色完成。

是maat关键角色,它决定了所有开启运行的步骤何时可以触发一次运行,也决定一次任务运行中,这些节点可以被执行。被判断执行的节点会被通过mq发送给执行。

随着任务的增多,单一的负载过低引致调度周期下降,为了减少的压力,maat将根据队列分拆。不同队列的任务有独立的负责调度任务平台,将任务分发给对应队列的执行。

现在每位队列仅有一个负责调度,然后会改建为每位队列多的实现形式。

为详细执行任务的角色,会接受发出的任务,在上执行节点中描述的详细任务。角色有多个,任务会在任意一个对等的上机器,当资源不足时,可以动态扩容。

因为不同队列任务所需的基础环境不同,如、Java、、zk等,不同队列的角色启动参数有配置上的差别,不同队列的启动时会根据配置中描述的资源完成布署安装。

上任务完成后会回写db,发觉到当前任务状态变化后会继续任务的调度。

任务分发层负责将须要调度的任务发送到指定的上。

MQ:原生使用MQ完成到的消息传递,底层由+实现。将须要运行的任务发送到MQ中,发送到MQ中包含任务对应的队列信息。从MQ获取消息时,仅获取相应队列任务任务平台,拉取到对应上执行。MQ在maat中以实现,MQ和其他角色一样,只是独立布署的。

FaaS:FaaS(asa)是基于搜索生态实现的框架,Maat将其作为执行器。Maat的所有任务都具象成,任务执行时则读取相应的,完成后返回任务状态。现在已完成与FaaS的初步对接,期望未来能基于FaaS做更多优化,如:多元化的任务执行方法,可以将羽量级的任务函数化,将重量级的任务服务化;任务资源动态调整,并且这些任务可以执行时分配资源,完成后即释放。

基础组件

Maat平台的优势

可视化编辑及通用的节点类别

Maat提供了一个管控平台Aflow,用户可以便捷地编辑步骤节点,管理所有的模版和任务,具体见上文的[管控层]。

除此此外,Maat还提供了丰富的通用节点类别。原生支持许多不同种类的节点类别,这种节点可以执行不同类别的任务。在与用户的接触中,maat针对用户的使用习惯与需求,对一些节点进行封装,同时开发了几种新的节点类别,可以满足大部份用户的需求。如在使用中现有节点未能满足使用,请联系maat开发老师。

Drogo化布署

maat服务有多种角色,每种角色都还要不同的运行环境,为了维护这种运行环境,对维保老师来说绝对是个恶梦,这些状况下上hippo成为maat维保最好的选择。drogo作为基于二层调度服务的管控平台,为Maat各个节点布署在hippo上成为或许。详细来说,Drogo化的优势如下:

右图展示了现在Drogo上布署的Maat各个角色

因为原生的一些节点是有状态的,还要依赖本地一些文件,机器迁移会造成某些节点的状态遗失,我们对maat做了一些更改,保证机器迁移不会遗失运行状态:

分集群管理

因为不同任务隔离的需求,maat基于原生的队列管理扩充不同任务的集群管理功能,不同类别的任务可以争创自己的和,争创应用时可以使用指定的调度或运行在指定上(假如不指定由默认和调度)。

集群的配置参数包括以下信息:

监控&报案

平台监控报案

为了把握平台的运行情况,maat在各个节点的关键方法向kmon汇报信息,异常状态下会发送报案给开发老师。也可以按照这种信息辨别当前集群的负载情况,对任务负载较高的节点进行优化。

任务报案

对于详细任务,maat支持在每位任务节点运行异常的状况下发送报案,如节点运行异常、任务未按量运行、任务运行超时等。用户可以在管控平台设置报案条件及报案接收人。

平台状况

Maat平台初始仅服务于服务于业务平台内部,发展到如今已对多个团队的多个产品提供服务:

Maat线上集群任务执行状况(2018.4.27数据)

日均调度任务:1500+个

日均运行任务:38K+次

日均运行节点:42K+个

随着更多应用场景的接入,平台能力将要接受逐步的考验。

未来展望

随着业务的接入和数据规模的减小,Maat平台也须要逐步提高用户感受,提高平台稳定性。

最后

不例外地谢谢在Maat平台发展中给予我们支持的诸位老师。

标签: 流程管理

  • 评论列表 (0)

留言评论