我要做一个任务调度器JobMan

前因

2014年底,我使用php+swoole扩展开发了一个定时任务管理程序。这个项目是我在阅文工作时碰到了实际的需求,从而促使我想搞一个这样的项目。彼时我的水平有限,精通点的语言就是php,而且也是php生态中对这个需求比较强烈,加上刚开始接触swoole,手握屠龙刀,说干就干,于是就有了 Swoole-Crontab 这个项目。

断断续续开发了1年多,项目还处于玩具状态,各种bug层出不穷。直到2016年我加入车轮,开始深入接触swoole,彼时车轮的定时任务管理非常混乱,开发人员在服务器上创建crontab,离职了谁都不知道还有个这样的任务。我快速的把Swoole-Crontab推广到了公司,并且全职开发了1个月,持续的修复了将近一年的bug。该项目上线以后受到了开发人员的一致好评,解决了很多痛点。后期现在一直平稳运行,我的精力放到其他项目想去了,4年过去了,这个项目还在稳定运行,但是,我有很多想法,想改进它,今年我开始写golang,发现golang更适合做这个事情,所以,我在想,是不是可以用golang重写以前的功能,并且实现我的很多想法,把这个项目做的完善一些?

我决定,我要做一个功能更完善的任务调度器,注意,这里去掉了定时任务,我希望它不仅仅是定时任务,它还能替代supervisor,做更多的事情。它有统一的管理界面,提供HttpApi,能运行各种脚本,支持docker运行,有完善的监控告警,日志系统。它是方便部署的,易于维护的。高可用的。

我给它取名JobMan.

架构图

6C1BADA48A7F488D80037378F0F01099.png

名词解释

  • Worker

    部署在每台服务器(虚拟机/物理机)上,监听固定的端口,Deployment与它通讯,执行Deployment发过来的命令,上报运行日志。

  • Deployment

    系统的核心,相应httpApi请求,连接数据库,定时器产生定时任务,记录任务运行日志。管理任务运行时。

  • Job

    任务的实体,可以是shell,php,python,等等脚本,也可以是可执行程序,docker镜像(启动容器执行)。

  • Task

    Job任务每次到了定时执行周期,会生成一个task任务发送给worker执行,并且会记录执行情况和执行日志。

  • Log

    每次task运行都会产生运行日志。

应用场景及痛点

大家可以想象以下几个场景:

一、你们公司有成百上千个定时任务需要执行,这些任务分别属于几十个项目组中的几百个开发,人员流动,这些定时任务是不是要在各个开发之间交接,某个开发把任务放在服务器上他的用户名下,离职后,接手的人可能根本不知道这个任务,怎么办?

二、某个定时任务执行失败了,你怎么知晓?是不是需要在每个脚本中加上告警?如果是这个任务压根就没执行呢?你怎么知晓?等发生了事故反推?

三、如何能知道某个任务现在的执行情况?登录服务器上ps进程?输出日志怎么看?

四、定时规则写错了咋办?

五、你是一个leader,如何知道您部门内所有项目的定时任务有那些?让每个开发汇报?漏了怎么办?

等等等,其实有很多痛点。

解决这些痛点,就是我们JobMan项目存在的价值。

JobMan应该做到一整套的解决方案,

一、 完善的权限系统,按组,按角色,按人员分配权限,管理定时任务。

二、针对任务有全方位的运行日志,控制权限,及及时精确的告警机制。

三、能实时监控任务运行时,并且有能力主动介入运行时。

三、支持更多的运行方式,php,jar,python,shell等脚本,并且支持不同的语言版本。支持http协议,支持自定义协议。支持docker。

四、JobMan应该是安全,高可用的,不存在单点,保证任务能稳定运行。

开发进度

JobMan 的第一个版本已经开发了60%,预计2020-12月发布第一个版本,大家拭目以待吧!(希望我的业余时间足够,不要跳票)

0%