这是一个基于Node.js开发的任务管理(这里的任务指的是crontab,并不是团队协作之类的)工具。
起因
经过这几年的开发经验,我遇到了这样一个困扰:当项目慢慢变大了,我们会有一部分工作需要定时跑脚本去做,例如数据统计、预处理等等。我们一般采用的方法是通过Linux系统自带的crontab结合shell脚本来完成。例如,我们会将一个经过测试的shell脚本和crontab参数交给运维,然后部署到线上环境。在小规模的时候,脚本确实可以解决问题,但是慢慢规模变大之后,使用脚本就会有如下问题:
- 不可维护,一般我们写脚本都会采用过程是编程(ps:可能我不是运维,或者对shell不太了解),这样时间一长,就很难读懂2、3年前的这段代码到底在干什么。(吐个槽:一般互联网公司2、3年前的东西也就不维护了)
- 影响面无法控制,可能会对正在运行的程序或者系统带来破坏性的影响。
- 无法执行秒级任务,因为crontab本身只支持到分钟。
- 代码无法复用,我们会发现,在写定时任务的时候,我们很多时候会想到“这个方法我在项目中已经实现过了”,但因为他是一个个独立的shell,所以并没有办法从代码层面上做复用。
- 日志格式不规范,一般情况下,我们会将crontab的输出直接打到某一个文件中去,虽然可以利用logrotate之类系统自带的工具,但无法保证日志格式的规范行。
基于以上几个问题,我觉得应该把定时任务和相应的系统做整合,用系统的形式替代原来的crontab+shell的模式,使得定时任务功能更强,更加可维护、可跟踪。
项目介绍
目录介绍
task.js // 程序启动
package.json
configs
dev // 开发环境配置
config.json
production // 生产环境配置
config.json
libs // 基础库
config.js // 配置管理器
logger.js // 日志管理器
task_manager.js // 任务集中管理器
tasks
example.js // 样例
功能介绍
task_manager.js
启动时,获取所有任务,并根据cronTime和run方法注册到taskPool中(基于Later)。这个操作完成后,所有任务已经有了对应的定时器,到了指定时间就会触发执行。
执行任务时,先付给每个任务一个uuid,用来跟踪任务情况,并且打下log,记录任务已经开始执行。同时,传入一个callback到每个任务中,作为任务结束后的回调。任务结束后,根据回调传的参数,判定任务是成功还是失败,并且记录结束时间。
config.js
配置集中管理,解决了Javascript配置对象因为引用传递,导致可能会被修改的问题。在和原有项目整合的时候非常有用。
logger.js
日志配置,并导出日志使用接口。
example.js
任务样例,导出一个接受callback的run方法和一个格式为:“秒 分 时 日 月 DayOfWeek”的cronTime。run方法结束之后,一定要调用callback告诉管理器任务已经结束。
TODO
- 可以给任务设置超时时间
- 动态增减、调整任务
- 日志格式再优化