构建一个定时任务调度程序

5

目前,我正在尝试构建一个良好的调度程序系统作为在我的系统上设置和编辑cron作业的接口。我的系统是在Linux服务器上使用Zend框架1.11.11构建的。

我有两个主要问题需要您的建议:

问题1:应用程序本身的设置

我有两种运行cron作业的方式:

  1. 第一种方法是创建一个名为scripts的文件夹,并在其中创建一个公共引导文件,在其中只加载我需要的资源。然后,对于每个任务,我将创建一个单独的脚本,并在每个脚本中包含引导文件。最后,我将为这些脚本中的每一个添加一个cron任务,任务类似于***** php /path/to/scripts/folder/cronScript_1.php

  2. 其次,将cron作业视为普通请求(没有特殊引导)。为这些脚本中的每一个添加一个cron任务,任务类似于***** curl http://www.mydomain.com/module/controller/action

问题2:应用程序的界面

添加cron作业也可以有两种方式:

  1. 对于每个任务,在crontab文件中都会有一个条目。当我想要添加新任务时,必须通过cPanel或其他手段来编辑crontab(可能不可用)。

  2. 将任务存储在数据库中,并提供一个UI来与数据库交互(网格以添加几个任务和配置)。之后,在crontab文件中只编写1个每分钟运行一次的cron作业。此作业将从数据库中选择所有作业,并检查是否有应该立即运行的作业(任务的时间将被存储并与服务器当前时间进行比较)。


在您看来,每个部分实现哪种方式更好?是否有更好的通用解决方案?

注意

我在搜索现成的解决方案时发现了Quartz。这是我正在寻找的还是完全不同的东西?

谢谢。


Quartz 是针对 Java 的,所以我认为与 Zend Framework 集成不会是一项容易的任务。 - Zombaya
2个回答

4

这只是我的个人意见,但我个人喜欢1和2两种方法,具体取决于您的脚本想要实现什么目标。例如,我们大多数情况下都使用1来处理所有cron条目,因为查看/etc/crontab并一眼看出何时运行某些任务变得非常容易。然而,有时候需要每分钟调用一个脚本,因为脚本内部的逻辑会在那一分钟内计算出要运行什么内容(例如:需要持续处理数百万用户,因此您需要公式来确定每小时的哪些用户要进行处理)。

另外,请查看Gearman(http://gearman.org/)。它使您能够在一台机器上运行cron脚本,然后将作业分成更小的部分并将这些部分分配给其他服务器进行处理。您可以完全控制map/reduce方面的程度。它对我们帮助很大,允许我们每分钟处理数千个算法脚本。如果我们需要更多的计算能力,我们只需启动更多的“工作节点”,Gearman会自动检测并利用它们。

我们目前全部在命令行上操作,不使用cPanel、Plesk等工具,因此我无法证明从这些后端之一编辑crontab的情况如何。您可能希望考虑让一个人成为您团队的crontab“门卫”。将预期的crontab条目放入项目代码中不可访问的文件夹中。然后,每当对该文件进行更改并推送到版本控制时,该人员需要SSH到适当的机器上进行更改。我不确定您的内部结构,因此这可能可行也可能不可行,但开发人员能够看到crontab将执行脚本的方式是一个好主意。


1
+1 感谢您详细的回答 :) 我一定会研究Gearman!不过我有一个问题,如果我在共享主机上进行项目开发,而无法自由地按照我的需求操纵服务器,那么Gearman是否是一个好的解决方案?还是我需要在我的应用程序内构建一个定制系统? - Songo
@Songo 我只在自己的硬件或具有 root 访问权限的专用服务器上实现过。我认为,除非你拥有 root 访问权限,否则你将无法在共享环境中使用它。 - Michael Taggart

0
对于“问题2:应用程序界面”,我使用了方法1和2。我强烈推荐第二种方法。虽然需要更多的前期工作来创建数据库表和构建UI,但从长远来看,这将使添加新作业变得更加容易。我为我的现任公司构建了UI,它非常易于使用,以至于非技术人员(会计、仓库主管)能够进入并创建作业。
比起以root身份登录服务器、编辑crontab、记住模式并保存,这要容易得多。此外,你也不会被称为“crontab小伙子”,每当有人想要添加东西到crontab时都会找你。
至于设置应用程序本身,我会让cron调用一个脚本,然后让该脚本运行其余部分。这样,你只需要一个cron条目。只需注意,如果运行作业需要很长时间,你需要确保脚本仅在没有其他实例运行时才开始运行。否则,你可能会出现同一作业运行两次的情况。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接