使用 AWS 服务安排长 运行 任务

Scheduling long-running tasks using AWS services

我的应用程序严重依赖 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

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

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

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

作为排队机制,您可以使用 S3(是的,您没有看错)。创建一个存储桶并让 Lambda 工作程序在创建对象时触发。当你想安排一个工作时,把一个文件放在桶里。 Lambda 启动并立即处理它。

现在你必须遵守一些限制。这样你只能同时拥有 100 个 worker(活跃的 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 中删除作业)