问题:我们有多个Web服务器,并需要运行批处理作业的cron,例如创建RSS提要,触发电子邮件等很多不同的任务。但是cron作业只需要在一台机器上运行,因为它们经常写入数据库,如果在多台机器上运行,会导致结果重复。
到目前为止,我们指定其中一台Web服务器为“主Web服务器”,并且它有一些其他Web服务器没有的“特殊”任务。云计算的权衡是可靠性-我们不想要“主Web服务器”,因为它是单点故障。我们希望它们都是相同的,并且能够升级和降级,而无需记住不将主Web服务器从集群中删除。
如何重新设计我们的应用程序以将Linux cron作业转换为临时工作项,从而消除单点故障?
到目前为止,我的想法有:
- 有一台专门运行cron的机器。这会更容易管理,但仍然存在单点故障,并且会浪费一些额外的实例。
- 一些工作可以从Linux crons移动到MySQL Events,但我不太喜欢这个想法,因为我不想将应用程序逻辑放入数据库层。
- 也许我们可以在所有机器上运行所有的crons,但更改我们的cron脚本,让它们都以实现锁定机制的一小段逻辑开始,这样只有一个服务器实际上采取行动,其他服务器则跳过。我不太喜欢这个想法,因为它听起来可能存在漏洞,我更愿意使用Amazon最佳实践而不是自己编写。
- 我想象一种情况,工作被安排在某个地方,加入队列,然后Web服务器可以成为工作者之一,可以说“嘿,我会处理这个”。Amazon Simple Workflow Service听起来像这种东西,但我目前对此了解不多,因此任何具体信息都会有所帮助。它似乎对于像cron这样简单的东西来说有点重量级?它是正确的服务还是有更合适的Amazon服务?
更新:自从我提出这个问题后,我在YouTube上观看了Amazon Simple Workflow Service网络研讨会,并注意到在34:40(http://www.youtube.com/watch?v=lBUQiek8Jqk#t=34m40s),我瞥见一张幻灯片提到cron作业作为一个示例应用程序。在他们的文档页面“AWS Flow Framework samples for Amazon SWF”中,亚马逊表示他们有cron的示例代码:
我下载了适用于Java的AWS SDK(http://aws.amazon.com/sdkforjava/),在一堆荒谬的文件夹中,确实有一些Java代码(... > Cron jobs 在这个示例中,一个长时间运行的工作流定期执行一个活动。演示了继续执行作为新执行的能力,以便执行可以运行非常长的时间。 ...
aws-java-sdk-1.3.6/samples/AwsFlowFramework/src/com/amazonaws/services/simpleworkflow/flow/examples/periodicworkflow
)。问题是说实话,这并没有真正帮助我,因为它不是我可以轻松理解的技能范围内的东西。PHP SDK中缺少相同的示例,并且似乎没有教程可以详细介绍该过程。所以基本上,我仍在寻找建议或提示。