不管是好是坏,我们已经将整个LAMP Web应用程序从专用计算机迁移到了云(Amazon EC2计算机)。这将极大到目前为止,但我们做的方式crons是次优的。我有一个特定于亚马逊的问题,关于如何使用“亚马逊方式”最好地管理云中的cron作业。
问题:我们有多个Web服务器,并且需要运行批处理作业,例如创建RSS提要,触发电子邮件以及实际上许多其他事情。但是cron作业只需要在一台机器上运行,因为它们经常写入数据库,因此如果在多台机器上运行,结果将重复。
到目前为止,我们将其中一个Web服务器指定为“主Web服务器”,它具有其他Web服务器所没有的一些“特殊”任务。云计算的权衡是可靠性-我们不希望有“主服务器”,因为它是单点故障。我们希望它们全部相同,并且能够进行升迁和降尺度,而不必记住不要将主Web服务器从群集中移出。
我们如何重新设计应用程序以将Linux cron作业转换为没有单点故障的临时工作项?
到目前为止,我的想法是:
- 有一台专用于仅运行克朗的机器。这将更易于管理,但仍将是单点故障,并且由于额外的实例而浪费一些钱。
- 可以将一些作业从Linux克隆转移到MySQL Events,但是我并不赞成这个想法,因为我不想将应用程序逻辑放入数据库层。
- 也许我们可以在所有机器上运行所有cron,但是可以更改cron脚本,因此它们都以实现锁定机制的逻辑开始,因此只有一台服务器实际采取了行动,而其他服务器只是跳过了。我不是这个想法的拥护者,因为它听起来可能有问题,我宁愿使用Amazon的最佳实践而不是自己动手做。
- 我正在想象这样一种情况:将作业安排在某个地方,添加到队列中,然后Web服务器可能每个都是工人,可以说“嘿,我来接这个”。Amazon Simple Workflow Service听起来完全是这种事情,但我目前对此了解不多,因此任何细节都将有所帮助。像cron这样简单的东西似乎有点沉重?是正确的服务还是有更合适的亚马逊服务?
更新:自从提出问题以来,我已经在YouTube上观看了Amazon Simple Workflow Service网络研讨会,并在34:40(http://www.youtube.com/watch?v=lBUQiek8Jqk#t=34m40s)注意到了这一点,幻灯片中提到cron作业作为示例应用程序。在其文档页面“ Amazon SWF的AWS Flow Framework示例 ”中,亚马逊表示它们具有cron的示例代码:
... > Cron作业在此示例中,长时间运行的工作流程会定期执行一项活动。演示了将执行作为新的执行继续执行的能力,从而使执行可以运行很长时间。...
我下载了适用于Java的AWS开发工具包(http://aws.amazon.com/sdkforjava/),并确保将足够的代码埋在一个荒谬的文件夹层中aws-java-sdk-1.3.6/samples/AwsFlowFramework/src/com/amazonaws/services/simpleworkflow/flow/examples/periodicworkflow
。
问题是,如果我说实话,这并没有真正的帮助,因为这不是我可以轻松使用自己的技能组合来消化的东西。PHP SDK中缺少相同的示例,并且似乎没有教程可循此过程。因此,基本上,我仍在寻找建议或技巧。