定时任务界面化管理方案

背景

定时任务管理,在我们的开发过程中是一个很常见的场景。比如说,我们想要在每天的一个时间点做数据库的备份,或者每隔1分钟监控一次数据变化,并执行相应的数据处理动作等等。

在任务比较少、执行比较简单的情况下,我们可能会直接通过使用Linux的Crontab来进行管理,相信做过程序开发的对此都不陌生。


Crontab是一个很强大的定时任务管理方案,通过命令行的配置,可以根据分钟、小时、日、月、周来设置各种不同的定时任务方案。比如每分钟执行,每天的某几个时间点执行,每周几执行等等。


但是Crontab也有一些缺点,最大的问题就是它的配置相对复杂(比如通过vim来编辑),且任务的历史执行记录(如成功、失败情况)都需要自行处理。在任务逐渐增多的情况下,Crontab逐渐变得没那么胜任了。


那么,如果我们有一台VPS,还有什么其他的定时任务管理方案呢?

Jenkins

Jenkins这个系统,相信接触过持续集成、持续交付的同学都知道。在过去的十年甚至更长的时间里,可以说,Jenkins都是持续集成平台中不二的选择。


借助插件化的设计思路,Jenkins可以集成许多新的功能进来,比如代码的管理、环境的管理等。不过现在Jenkins的确也变得越来越复杂,尤其是Jenkins进行了Pipeline的支持后,基于配置化描述的语言,让流水线节点的配置、各类插件的调用不再像以前一样,几个配置勾勾选选就搞定。当然,Pipeline的显示效果会更好一些,如下图:


image.png

Pipeline的配置太过复杂,但值得庆幸的是,Jenkins对于比较传统式的Shell调用,也依然可以支持。我们可以用类似Crontab的写法,来设置一个Jenkins的Job作为定时任务,例如:

image.png

任务的具体执行命令,如果是采用Shell模式,基本就是一句curl搞定:

image.png


使用Jenkins的好处是,能够保持类似Crontab的灵活性,配置相对简单,任务的每一次执行日志,都可以在Jenkins中进行查看。我们也可以根据自己的需要设置一些监控,例如任务执行失败(即命令的返回值不为0),则触发邮件报警等。


不过Jenkins的配置确实还是有一定门槛(如报警、pipeline执行方式等),而Jenkins依赖Java、Tomcat环境,整个部署之后对机器的内存要求会比较高。如果说,VPS上原本就需要使用Jenkins做一些CI/CD的工作(比如用来做代码检查、自动化用例执行、环境部署发布等),那顺便用来做任务管理没问题。但如果没有CI/CD的需求,单纯为了定时任务而部署Jenkins就没有必要了。

gocron

除了Jenkins之外,有一些专门用于定时任务调度的执行框架,但也会提供界面化的管理方式。比如xxl-job、quartz、powerjob等。作为框架来说,它们功能无疑很强大,可是如果不需要做代码化的定时任务触发,只是单纯地需要个界面做任务管理,它们就有点过重了。


我在github上也找了一段时间,后来终于发现了gocron这个开源项目。虽然已经几年没有更新了,但目前使用下来基本没有问题。


配置比Jenkins更加简单,时间设置和Crontab类似,而且还可以支持到秒的级别。除了支持在机器上执行Shell命令,gocron还可以轻松地设置通过http进行访问。

image.png

每次任务执行的日志记录也很方便查看,成功、失败一目了然。

image.png

从资源对比来看,gocron的内存占用明显远低于java(jenkins)。

image.png

目前gocron已经用了几年,服务的稳定性还不错。有一个小小的问题:日志记录是用的MySQL,如果任务日志执行记录过大,数据库会变慢,占用空间也会逐渐变得很大,因此可以考虑做定期的清理。


gocron在github上是一个5.2K Star的开源项目,大家有需要的话可以自行搜索。

本文链接:https://www.poisonbian.com/post/5053.html 转载需授权!

分享到:
原文链接:,转发请注明来源!
「定时任务界面化管理方案」评论列表

发表评论