【问题标题】:Scheduling long-running tasks using AWS services使用 AWS 服务安排长时间运行的任务
【发布时间】:2015-12-10 09:45:28
【问题描述】:

我的应用程序严重依赖 AWS 服务,我正在寻找基于它们的最佳解决方案。 Web 应用程序触发一个计划的作业(假设无限重复),这需要执行一定数量的资源。任务的单次运行通常最多需要 1 分钟。

当前的想法是通过 SQS 传递作业并根据队列大小在 EC2 实例上生成工作人员。 (这部分或多或少清楚) 但是我很难找到一个合适的解决方案,以在特定的时间间隔实际触发工作。假设我们正在处理 10000 个工作。因此,让调度程序同时运行 10k cronjobs(作业本身非常简单,只需通过 SQS 传递作业描述)似乎是一个疯狂的想法。所以实际的问题是,如何自动扩展调度程序本身(给定调度程序重新启动、创建新实例等的场景)? 或者调度程序作为应用程序是多余的,依赖 AWS Lambda 函数(或其他提供调度的服务)更明智?使用 Lambda 函数的问题是有一定的局限性,单个函数提供的 128mb 内存实际上太多了(20mb 似乎绰绰有余)

或者,worker 本身可以等待一段时间,然后通知调度程序它应该再触发一次作业。假设频率是 1 小时:

1. Scheduler sends job to worker 1
2. Worker 1 performs the job and after one hour sends it back to Scheduler
3. Scheduler sends the job again

然而,这里的问题是该工人可能会被缩减。

底线 我正在尝试实现一个轻量级的调度程序,它不需要自动缩放并作为一个枢纽,其唯一目的是传输工作描述。当然不应该在服务重启时受到限制。

【问题讨论】:

  • “长时间运行的任务”..“最多需要 1 分钟”:/

标签: amazon-web-services amazon-ec2 architecture scheduled-tasks amazon-sqs


【解决方案1】:

Lambda 非常适合这一点。您有很多运行时间短的进程(约 1 分钟),而 Lambda 用于短进程(现在最多 5 分钟)。知道 CPU 速度与 RAM 线性耦合是非常重要的。如果我没记错的话,一个 1GB 的 Lambda 函数相当于一个 t2.micro 实例,而 1.5GB 的 RAM 意味着 CPU 速度提高了 1.5 倍。这些功能的成本非常低,您只需执行此操作即可。 128MB RAM 的 CPU 速度是微型实例的 1/8,因此我不建议实际使用。

作为一种排队机制,您可以使用 S3(是的,您没看错)。创建一个存储桶并让 Lambda 工作线程在创建对象时触发。当您要安排作业时,请将文件放入存储桶中。 Lambda 立即启动并处理它。

现在您必须遵守一些限制。这样,您只能同时拥有 100 个工作人员(活动 Lambda 实例的总数),但您可以要求 AWS 增加此数量。

费用如下:

  • 每 1000 个 PUT 请求 0.005,因此每百万个作业请求 5 美元(这比 SQS 更昂贵)。
  • Lambda 运行时。假设 t2.micro CPU 速度正常(1GB RAM),每个作业的成本为 0.0001 美元(60 秒,前 300.000 秒免费 = 5000 个作业)
  • Lambda 请求。每百万次触发 0.20 美元(前一百万免费)

此设置不需要您使用任何服务器。这不会下降(仅当 AWS 本身下降时)。

(完成后不要忘记将作业从 S3 中删除)

【讨论】:

  • 感谢您的建议。还有一个问题,如果我们不生成许多 lambda 函数,而是只生成少量函数(假设我们创建每 5 分钟、每小时、每天等运行一次的单独函数),该怎么办。每个 lambda 函数都会从 s3 检索作业并将它们传递给 sqs。有什么可能导致此架构出现问题?
  • 您需要考虑 s3 键(文件名)的结构,因此 lambda 函数不包含双文件(lambda 函数不知道其他文件)。好消息是您可以在 S3 事件上触发 lambda 函数,因此您永远不会遇到这个问题。然后你可以将它发送到 SQS(每个 lambda 函数都有一个 SQS 调用,这不是问题,需要
  • 您能否详细说明在 1 个 SQS 票证中定义批次是什么意思?谢谢
  • 不是每个 SQS 票证一个作业,而是在一个 SQS 票证(或 1 个批次)中定义一组作业。然后,当您处理票证时,实例可以一次处理整个批次。在这种情况下,SQS 票证的数量为 N/B,其中 N 是您需要的作业数量,B 是批量大小。因此,如果您将 50 个作业放入一张工单中,则 10.000 个作业只需 200 个 SQS 工单。
  • 是的,这就是计划。我将运行 Lambda 函数来安排这些 sqs 票证。因此,如果每 5 分钟运行 10k 个作业,我将通过 sqs 将 200 个票证传递给来自 Lambda 函数(计划函数)的处理实例。但是作业本身将存储在 s3 中(但可以 dynamo db 作为替代方案)并在每次循环迭代时从 lambda 函数中获取
猜你喜欢
  • 2016-05-23
  • 1970-01-01
  • 1970-01-01
  • 2019-08-01
  • 2019-01-09
  • 1970-01-01
  • 2012-05-11
  • 2020-11-20
  • 1970-01-01
相关资源
最近更新 更多