一、 分布式任务调度的背景
无论是互联网应用或者企业级应用,都充斥着大量的批处理任务。我们常常需要一些任务调度系统帮助我们解决问题。随着微服务化架构的逐步演进,单体架构逐渐演变为分布式、微服务架构。在此的背景下,很多原先的任务调度平台已经不能满足业务系统的需求。于是出现了一些基于分布式的任务调度平台。
1.1 分布式任务调度的演进
在实际业务开发过程中,很多时候我们无可避免的需要使用一些定时任务来解决问题。通常我们会有多种解决方案:使用 Crontab 或 SpringCron (当然这种情况可能机器很少而且任务简单又不是很多的情况下)。然而,当我们应用复杂度升高,定时任务数量增多且任务之间产生依赖关系时,Crontab 进行定时任务的管理配置,就会非常混乱,严重影响工作效率。这时候就会产生一系列问题:
任务管理混乱,生命周期无法统一协调管理;
任务之间如果存在依赖关系,难以编排;
随着互联网的发展,分布式服务架构势越来越流行。相应也需要一个分布式任务调度系统来管理分布式架构中的定时任务。
1.2 分布式任务调度架构
当垂直应用越来越多,应用之间交互也会越来越复杂,通常我们采用分布式或者微服务架构,将核心业务抽取出来,形成单独的服务。一个独立的微服务群体逐渐形成稳定的服务中心,使得业务应用能更快地响应多变的市场需求。此时,用于提高业务复用及整合的分布式服务框架成为关键。同时,由于服务独立,一般能做到定时任务独立的情况,任务的更改对于整体系统的影响小之又小。一般我们会采用任务与调度分离的方式(如上图所示),任务的执行逻辑无需关注调度与编排,同时可以保证执行器和调度的高可用,易于开发和维护。
1.3 分布式任务调度优势
在分布式服务架构的基础上,由于独立业务的数量可能很多,此时如果定时任务单独在该服务中实现,很可能会出现难以管理的情况,且避免不了由于定时任务的更改而导致的业务重启。因此,一个独立的分布式任务调度系统是很必要的,可以用来全局统筹管理所有的定时任务。同时,将任务的配置单独抽离出来,作为该分布式任务调度系统的功能,就能做到定时任务的更改不影响任何业务,也不影响整个系统:
通过调度与任务分离的方式进行管理,大大降低了开发和维护成本;
分布式部署,保证了系统的高可用性,伸缩性,负载均衡,提高了容错性;
可以通过控制台部署和管理定时任务,方便灵活高效;
任务都可以持久化到数据库,避免了宕机和数据丢失带来的隐患,同时有完善的任务失败重做机制和详细的任务跟踪及告警策略。
二 、分布式任务调度技术选型
2.1 分布式任务调度考虑因素
任务编排:多个业务之间的定时任务存在流程次序
任务分片:对于一个大型任务,需要分片并行执行
跨平台:除了使用 Java 技术栈(SpringBoot、Spring 等)的项目之外,还有使用其他语言的应用
无侵入:业务不希望与调度高耦合,只关注业务的执行逻辑
故障转移:任务执行过程中遇到问题有补偿措施,减少人工介入
高可用:调度系统自身必须保证高可用
实时监控:实时获取任务的执行状态
可视化:任务调度的操作提供可视化页面,方便使用
动态编辑:业务的任务时钟参数可能变动,不希望停机部署
2.2 SIA-TASK 与其它分布式任务调度技术比较
SIA 是宜信公司基础开发平台 Simple is Awesome 的简称,SIA-TASK(微服务任务调度平台)是其中的一项重要产品,SIA-TASK 契合当前微服务架构模式,具有跨平台,可编排,高可用,无侵入,一致性,异步并行,动态扩展,实时监控等特点。
开源地址:https://github.com/siaorg/sia-task
下面我们先对比市场上主流的开源分布式任务调度框架,分析其优缺点,然后再说我们的技术选型。
Quartz: Quartz 是 OpenSymphony 开源组织在任务调度领域的一个开源项目,完全基于 Java 实现。该项目于 2009 年被 Terracotta 收购,目前是 Terracotta 旗下的一个项目。相比于 JDK 或 Spring 提供的定时任务,Quartz 对单个任务的控制基本做到了极致,以其强大功能和应用灵活性,在企业应用中发挥了巨大的作用。然而 Quartz 并不支持任务的编排(任务之间有依赖),而且不支持任务分片。
TBSchedule: TBSchedule 是一个支持分布式的调度框架,能让一种批量任务或者不断变化的任务,被动态的分配到多个主机的 JVM 中,不同的线程组中并行执行。基于 ZooKeeper 的纯 Java 实现,由 Alibaba 开源。TBSchedule 侧重于任务的分发,支持任务分片,但是没有任务编排,也不是跨平台的。
Elastic-Job: Elastic-Job 是当当开源的一个分布式调度解决方案,由两个相互独立的子项目 Elastic-Job-Lite 和 Elastic-Job-Cloud 组成。Elastic-Job 支持任务分片(作业分片一致性),但是没有任务编排,也不是跨平台的。
Saturn: Saturn 是唯品会开源的分布式,高可用的调度服务。Saturn 在 Elastic-Job 做二次开发,支持监控,任务分片,跨平台,但是没有任务编排。
Antares: Antares 是基于 Quartz 的分布式调度,支持分片,支持树形任务依赖,但是不是跨平台的。
Uncode-Schedule: Uncode-Schedule 是基于 Zookeeper 的分布式任务调度组件。支持所有任务在集群中不重复,不遗漏的执行。支持动态添加和删除任务。但是不支持任务分片,也没有任务编排,还不是跨平台的。
XXL-JOB: XXL-JOB 是一个轻量级分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。XXL-JOB 支持分片,简单支持任务依赖,支持子任务依赖,不是跨平台的。
下面我们简单对比下 SIA-TASK 与这些任务调度框架:
--------------- | ----- | ---- | ---- | — | ---- | -----
SIA-TASK | √ | √ | √ | √ | √ | √
Quartz | × | × | .NET | √ | × | API 监控
TBSchedule | × | √ | × | √ | √ | √
Elastic-Job | × | √ | × | √ | √ | √
Saturn | × | √ | √ | √ | √ | √
Antares | √ | √ | × | √ | √ | √
Uncode-Schedule | × | × | × | √ | √ | √
XXL-JOB | 子任务依赖 | √ | × | √ | √ | √
可以发现,这些调度框架基本上都支持高可用、故障转移与实时监控等功能,但是对于任务编排、任务分片与跨平台等功能的支持各有侧重点。这里 SIA-TASK 将全面支持这些功能。
本文转载自宜信技术学院网站。
原文链接:http://college.creditease.cn/detail/253
评论 1 条评论