【问题标题】:AWS - Load Balanced Instances & Cron JobsAWS - 负载平衡实例和 Cron 作业
【发布时间】:2017-01-15 11:15:12
【问题描述】:

我有一个 Laravel 应用程序,其中应用程序服务器位于负载均衡器后面。在这些应用程序服务器上,我运行了 cron 作业,其中一些应该只运行一次(或在一个实例上运行)。

我做了一些研究,发现人们似乎更喜欢锁定系统,在这种系统中,您可以在每个应用程序框上保持所有 cron 作业处于活动状态,并且当一个人去处理作业时,您会创建某种锁,以便其他人知道不处理相同的工作。

我想知道是否有人对此过程有更多关于 AWS 的详细信息,或者是否有更好的解决方案来解决这个问题?

【问题讨论】:

    标签: laravel amazon-web-services cron


    【解决方案1】:

    如果您只需要在全局范围内运行一次(而不是在每台服务器上一次)并“锁定”需要运行的东西,我强烈建议您使用 AWS SQS,因为它提供的正是:运行 cron 来获取票。如果你得到一个,解析它。否则,什么也不做。因此,所有机器上的所有 crons 都处于活动状态,但是当某些机器请求票并且另一台机器无法请求该特定票时,票处于“飞行中”。

    【讨论】:

    • 我们将 SQS 用于我们的工作进程,但我仍然需要一个 cron 作业将消息发送到 SQS 进行处理,这将使我处于同样的境地;如果所有服务器都在运行 cron,那么重复的消息可能会被发送到 SQS
    • SQS 不保证只发送一次消息。无论如何,您最终都必须为 SQS 消息构建某种锁定机制。 stackoverflow.com/questions/13484845/…
    【解决方案2】:

    您可以使用带有strongly consistent reads 的 DynamoDB 在 AWS 上构建分布式锁定机制。您也可以使用 Redis (ElastiCache) 执行类似的操作。

    或者,您可以使用 Lambda 计划事件按照 cron 计划向负载均衡器发送请求。由于只有一台后端服务器会接收到服务器可以执行 cron 作业的请求。

    当您的自动扩缩组遇到缩减事件并且处理任务的服务器被删除时,这些解决方案往往会中断。我更喜欢有一个小型服务器,比如 t2.nano,它不是集群的一部分,并在上面安排 cron 作业。

    【讨论】:

    • 谢谢马克!我刚刚研究了 Lambda,但之前正在考虑制作一个“cron”框,它可以处理和获取特定工作所需的记录,然后将它们推送到 SQS 以由工作人员处理。但是,我担心会出现单点故障(一个 cron 框)。
    • 插入 SQS 的 Lambda cron 作业肯定比插入 SQS 的 EC2 cron 服务器要好。 Lambda 也会更便宜。请记住,SQS 不保证“恰好一次”消息传递。此外,使用 SQS,您必须在服务器上提供服务不断轮询新消息。
    • 是的,我们目前有几个工作服务器已经在轮询 SQS,所以添加另一个工作人员会有点少。我将不得不试验 Lambda,看看我能做什么。谢谢!
    • 为 cron 设置小型服务器的好主意。更可靠的恕我直言。
    【解决方案3】:

    查看这个包以了解锁系统的 Laravel 实现(DB 实现): https://packagist.org/packages/jdavidbakr/multi-server-event

    此外,这个拉取请求使用锁定系统(缓存实现)解决了这个问题: https://github.com/laravel/framework/pull/10965

    【讨论】:

      猜你喜欢
      • 2018-09-05
      • 2014-08-31
      • 1970-01-01
      • 2017-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-21
      • 2019-01-08
      相关资源
      最近更新 更多