2011-06-20 79 views
5

现在,我们有一台带cronjob选项卡的单个服务器,每天发送电子邮件。我们想扩展那台服务器。该应用程序是部署在亚马逊云中的centos服务器上的标准zend框架应用程序。通过多台服务器扩展cronjob

我们已经负责负载平衡,内容管理和管理部署。然而,cronjob对我们来说仍然是一个问题,因为我们需要授予某些工作只执行一次。

例如,每天的电子邮件cronjob只能由一台服务器执行一次。我正在寻找最好的方法,只有一台服务器只会执行一次。

我在想2种解决方案,但我想知道是否有其他人有同样的问题。

  1. 使其中一台服务器“主”,谁只发出每日电子邮件。这将是一个问题,如果服务器故障,并且我们通常不想拥有“特殊”服务器。这也意味着我们需要跟踪哪个服务器是主服务器。
  2. 有一个要执行的计划任务队列。每个服务器打开该队列并查看需要执行哪些任务。第一个“抓住”任务的服务器将执行任务并将其标记为完成。我在查看亚马逊简单排队服务作为队列的解决方案。

这两种解决方案都有优点和缺点,我想知道是否有人想到可能帮助我们的其他人。

+1

这可能会更好地ServerFault服务? –

回答

5

当你需要进行扩展,cron作业,你是关闭使用任务管理器一样Gearman

+1

您可以使用PHP与gearman。 – datasage

+0

谢谢,我看到了原生的php库。看起来有趣。 – aporat

+0

+1为Gearman,它很好地与PHP集成。我们使用它进行大量跨平台通信,数据库之间的ETL用于迁移数据,发送电子邮件,跟踪用户活动等等。只有我发现,尽管可以运行多个Gearman客户端,但Gearman服务器核心进程本身并不会扩展,所以最终不得不运行多个服务器,可能调用不同的客户端分类以访问某些工作而不是其他人。 – iandouglas

0

我有同样的问题。我做的事很简单。

  1. 我创建了AWS上最便宜的EC2实例。
  2. 我只在此服务器上创建了cronjob(s)。
  3. cron作业只运行仅对我的端点/ api(即api.mydomain.com)发出简单请求的作业。
  4. 在我的api上,我只是有一条路线来监视这些特殊请求,以便执行我想要的工作。所以基本上,我所做的一切,而不是使用cronjob运行任务,即时通过http请求运行任务。

我希望有道理!现在,你有多少台服务器并不重要,它只会扩展!另外,你的cronjob服务器的唯一功能是运行死了的简单作业来发送请求,仅此而已。