写点什么

我理想中的任务调度系统

用户头像
关注
发布于: 13 小时前
我理想中的任务调度系统

在应用系统中我们经常会遇到需要定时或根据某些条件触发执行某个任务的场景,在更复杂一些的场景中这些任务还会有依赖关系。而在这类任务中又用很多是批量的数据处理。我们最早用到的定时任务调度框架是 Quartz,用于定时发送邮件和短信、业务开关及任务批量处理等场景。由于业务对可用性有要求,要无单点故障,所以使用了 Quartz 基于数据库的高可用模式,Quartz 比较成熟稳定,支持秒级的计划,并且在下一次任务前线程会休眠,有效降低了 cpu 负载。但是,缺点也有,譬如,没有比较好的 UI(为此我们自己开了任务管理的 UI),基于数据库的高可用模式性能并不是太好(后来 terracotta 收购了 Quartz,并提供了基于它自身的高可用能力,这个可能很多同学没听说过,听起来是很厉害的,terracotta 提供了 jvm 级别的分布式能力,可以让普通的应用基本不用修改就变为分布式应用,但是并没有被广泛应用),也不支持任务编排等,可以说是一个比较好的定时任务工具。

后来我们转为使用 Spring XD,主要用于数据的批处理(类似 ETL),很不幸 Spring 后来停止了支持,转向 Spring Cloud,但是保留了 Spring batch 等组件。可能由于 Spring XD 发展的时间尚短,虽然其提供了分布式处理、任务编排等能力,但感觉都还尚未很成熟,对于我们的使用场景,性能表现也较为一般,或者说感觉有点慢,在多个任务并行时偶尔还会发生莫名的错误,导致任务执行失败。

之后我们还尝试过 elastic-job(Lite)、xxl-job,感觉都还不是很合适,一直没有找到比较合适的开源工具(后起之秀 airflow 还没用过,因为 tensorflow 官方支持,打算后面尝试一下)。下面说一下我们对于分布式任务系统希望能具备的功能。

灵活的任务调度

我们系统里使用了多种数据存储,包括 Mysql、Hbase、ES、druid(时序数据)、文件系统等,存在异构数据源之间的数据处理(类似 ETL)、数据备份及数据压缩归档等大量数据的处理,数据量较大,且存在一定依赖关系。顺序或简单的定时任务处理无法满足我们的需求,因此,我们希望在任务调度方面可以做到以下几方面:

  • 支持分布式的处理,可以同时执行多个任务,尽量利用空闲资源。

  • 可扩展的调度策略,除了最基本的基于 cron 表达式的定时执行外,可以根据不同场景通过插件的方式支持个性化策略。

  • 支持一定程度上的任务编排(譬如类似 airflow 的 DAG),并且可以从失败的节点继续执行任务,而不需要重新执行整个任务。

支持资源感知

同一个主机上的任务负载过大、数据存储(源或目的)的负载过大或者其它相关资源超过负载等都会造成任务执行效率下降(在超负载的情况下,很多时候并不是 1+1=2 的关系,而是 1+1<2),这些资源包括内存、CPU、硬盘 IO、网络等。因此,我们希望任务具备资源感知的能力,在最大化资源利用的同时,尽量避免对效率影响较大的超负载。

多种部署方式

各类应用的实际情况不同,有些任务是远程调用、有些需要和数据部署在一起以提高效率或甚至有些甚至并不需要一个集中的调度管理。因此,我们希望可以支持不同的部署方式,任务和数据可以部署在一起,也可以分开部署;任务之间既可以共享调度器也可以是 share-nothing 的。

接口友好

支持外部应用通过接口的方式对任务进行管理和监控,也就是说需要提供可供外部调用的 API,最好是 rest 风格的;另外需要对监控友好,可以比较方便的集成到监控系统中。


欢迎大家交流;)。

发布于: 13 小时前阅读数: 6
用户头像

关注

公众号"山 顽石"欢迎大家关注;) 2021.03.23 加入

IT老兵,关注Rust、Java、前端、架构、大数据、AI、算法等;平时喜欢美食、旅游、宠物、健身、篮球、乒乓球等。希望能和大家交流分享。

评论

发布
暂无评论
我理想中的任务调度系统