跨多个服务器扩展cronjobs

8

目前,我们有一台单独的服务器,其中包含一个cronjob标签,用于发送每日电子邮件。我们希望扩展该服务器。该应用程序是在Amazon云中部署的CentOS服务器上的标准Zend Framework应用程序。

我们已经处理了负载均衡、内容管理和管理部署的问题。然而,cronjob对我们来说仍然是一个问题,因为我们需要保证某些作业仅执行一次。

例如,每日电子邮件cronjob必须由单个服务器执行一次。我正在寻找最佳方法,以保证只有一个服务器会执行它一次。

我考虑了两种解决方案,但我想知道是否有其他人遇到过同样的问题。

  1. 将其中一台服务器设置为“主服务器”,仅用于发送每日电子邮件。如果该服务器发生故障,那将是一个问题,而且通常我们不希望有一个“特殊”的服务器。这也意味着我们需要跟踪哪台服务器是主服务器。
  2. 拥有一个计划任务队列。每个服务器打开该队列并查看需要执行的任务。第一个“抓取”任务的服务器将执行任务并将其标记为完成。我正在寻找Amazon简单队列服务作为队列的解决方案。

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


2
这个问题可能在ServerFault上得到更好的解答? - Connor Smith
3个回答

6

当您需要扩展cron作业时,最好使用像Gearman这样的作业管理器。


+1 for Gearman,它与PHP的集成非常好。我们将其用于许多跨平台通信、数据库迁移的ETL、发送电子邮件、跟踪用户活动等方面。唯一的问题是,虽然您可以运行多个Gearman客户端,但核心的Gearman服务器进程本身并不具备可扩展性,因此您最终需要运行多个服务器,可能调用不同的客户端分类,这些分类可以访问某些作业而不能访问其他作业。 - iandouglas

0

0

我曾经遇到过同样的问题,解决方法非常简单。

  1. 我在AWS上启动了最便宜的EC2实例。
  2. 我只在这台服务器上创建了cronjob(s)。
  3. cron job只运行对我的端点/api(即api.mydomain.com)发出简单请求的作业。
  4. 在我的api上,我只需要监听这些特殊请求的路由,就可以运行我想要的任务。所以基本上,我所做的是不使用cronjob来运行任务,而是通过http请求来运行任务。

希望这样说得清楚!现在无论你有多少台服务器,它都会自动扩展!此外,你的cronjob服务器的唯一功能就是运行非常简单的作业来发送请求,没有其他额外的功能。


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