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