【问题标题】:Scaling cronjobs over multiple servers在多个服务器上扩展 cronjobs
【发布时间】:2017-10-23 22:49:33
【问题描述】:

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

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

例如,每日电子邮件 cronjob 只能由单个服务器执行一次。我正在寻找最好的方法来让一台服务器只执行一次。

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

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

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

【问题讨论】:

  • 这可能在 ServerFault 上提供更好的服务?

标签: php zend-framework centos amazon-sqs


【解决方案1】:

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

【讨论】:

  • Gearman 的 +1,它与 PHP 很好地集成。我们将它用于大量跨平台通信、用于迁移数据、发送电子邮件、跟踪用户活动等的数据库之间的 ETL。我发现的唯一问题是,虽然您可以运行多个 Gearman 客户端,但核心 Gearman 服务器进程本身无法扩展,因此您最终不得不运行多个服务器,可能调用不同的客户端分类来访问某些工作,而不是其他人。
【解决方案2】:

Beanstalkd 也可能是您的选择。

【讨论】:

    【解决方案3】:

    我遇到了同样的问题。我所做的非常简单。

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

    我希望这是有道理的!现在,无论您拥有多少台服务器,它都会扩展!此外,您的 cronjob 服务器的唯一功能是运行已死的简单作业来发送请求,仅此而已。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-24
      • 2010-10-08
      • 1970-01-01
      • 2015-08-29
      • 2015-07-28
      • 2011-07-20
      • 2015-12-26
      • 1970-01-01
      相关资源
      最近更新 更多