任务调度与ERP难舍难分--第18篇
用日志记录“开源软件”的诞生
什么是任务调度?
任务调度这个词貌似很高大上,其实不难理解。我们知道一个应用它执行任务的方式默认是实时且同步的,而所谓的任务调度就是让任务非实时的或异步的进行。换一个词也可以把它理解成计划任务或定时任务。
它解决了什么问题
要分析任务调度所解决的问题,先要看这个任务的特点以及需要如何执行。首先这类任务一般是系统根据一定的预设逻辑去代替人工完成的一件事。其次这类事无需实时完成或需要在某个特定时间完成,任务启动后只需在后台静默执行,执行完成后有条件的通知用户或用户自主查询执行结果即可。由此可见,以上需求是传统的应用无法做到的,所以就需要任务调度系统去实现它。
为什么单独研发调度系统?
从Java技术角度有很多定时任务的实现方式,比如Timer、ScheduledExecutor、Quartz,无论是哪种方式都可以简单的在一个项目中去集成定时任务的功能,而无需单独开发项目。那为什么我们在进行系统设计时,要提出任务调度系统这一思路呢?
那就需要先来分析下信息化系统的特点,首先信息化系统从功能设计的角度是分散的,即一个项目或模块一般只完成一件事的情况下,我们从需要设计很多很多的应用才能满足用户需求。就拿ERP举例,ERP包含计划预算、订单管理、库存管理、财务管理等一系列的模块或系统,而这些系统都是与业务直接关联的,所以哪个系统也离不开计划任务的功能,如果按照上述方式,我们必不可少的要将每个项目中都整合一套完整的计划任务组件才能满足我们的需求。这种做法不仅开发时更加麻烦、同时也带来了维护或扩展复杂度的指数提升,这种设计的风险可想而知。所以独立的任务调度系统就应运而生。
设计思路探讨
那么我们如何设计这个系统呢?我们来重点关注一下几点。
1、统一灵活的任务配置
(1)任务实现可配置:任务的具体逻辑可以通过方法或存储过程去实现,然后通过配置方式根据不同参数去自定义不同的任务需求。
(2)定时执行配置:定义好任务的逻辑后我们就需要配置执行逻辑,什么时间执行,是固定时间还是循环,何时开始何时结束,单次执行还是多次执行都需要详细的配置。
(3)线程配置:任务需要同步执行还是异步执行,是守护线程还是非守护线程。异常处理机制等都需要分别配置好。
(4)任务流程配置:有的时候我们不仅仅需要执行一个任务,可能需要执行一系列的任务,而任务的执行又是有先后之分的,这时候我们可以将一个一个配置好的任务串联成一个流程去执行。
2、便捷的任务启动和反馈
(1)启动任务:所有的任务配置好以后我们就需要启动任务,通过API的方式启动是最优的选择。
(2)反馈机制:对于任务的执行效果要对用户有一个反馈机制,给用户通知、直接回调或反写都是可以选择的方式。
3、监控任务执行情况和日志追踪
(1)任务监控:任务的执行过程不是一帆风顺的,可能成功,也可能出现执行异常、意外终止、人工终止等多种情况,所以需要根据任务的执行情况显示执行状态,并根据需要,让用户可重启或继续任务。
(2)日志追踪:如果出现重新执行仍然无法成功的情况,那么多数一定是出现了程序异常,所以日志的记录就必不可少,可让维护人员根据日志处理问题并解决问题。
抛砖引玉的分布式
当一个任务调度系统研发完成后,随着使用频率的增加,一定会遇到瓶颈,所以我们就会考虑到部署多个任务调度系统形成分布式,但部署多个系统,就会涉及到注册中心、负载、路由、数据同步等各种问题。本文只是在讨论如何设计任务调度系统的功能,并不涉及分布式调度的思路。在此不展开谈,只是抛砖引玉,有兴趣的朋友可以深入探索。
后记
如果您对我们正在做的开源软件感兴趣,欢迎各种形式的合作,作为贡献者或直接加入我们!让我们一起打造一套开源的信息化解决方案。