Amazon web services 使用AWS服务调度长时间运行的任务

Amazon web services 使用AWS服务调度长时间运行的任务,amazon-web-services,amazon-ec2,architecture,scheduled-tasks,amazon-sqs,Amazon Web Services,Amazon Ec2,Architecture,Scheduled Tasks,Amazon Sqs,我的应用程序严重依赖于AWS服务,我正在寻找基于这些服务的最佳解决方案。Web应用程序触发一个计划作业(假定无限重复),该作业需要执行一定数量的资源。单次运行任务通常最多需要1分钟 当前的想法是通过SQS传递作业,并根据队列大小在EC2实例上生成工作线程。(这部分内容大致清楚) 但我很难找到一个合适的解决方案,在一定的时间间隔内真正触发工作。假设我们正在处理10000个工作。因此,让调度器同时运行10k cronjobs(作业本身非常简单,只需通过SQS传递作业描述)似乎是一个疯狂的想法。所以实

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

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

或者,工作进程本身可以等待一定的时间,并通知调度程序它应该再次触发作业。假设频率为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则用于短时间运行的进程(现在最多5分钟)。了解CPU速度与RAM的线性耦合非常重要。如果我没有记错的话,1GB的Lambda函数相当于t2.micro实例,1.5GB的RAM意味着CPU速度提高了1.5倍。这些函数的成本非常低,您可以直接执行它。128MB的RAM有微实例1/8的CPU速度,所以我不建议实际使用这些

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

现在你必须尊重一些限制。通过这种方式,您同时只能有100个工作线程(活动Lambda实例的总数),但您可以要求AWS增加此数量

费用如下:

  • 每1000个PUT请求0.005美元,因此每百万个作业请求5美元(这比SQS更昂贵)
  • Lambda运行时。假设正常的t2.micro CPU速度(1GB RAM),则每个作业的成本为0.0001美元(60秒,前300.000秒是免费的=5000个作业)
  • 兰姆达请求$每百万触发器中有0.20个(第一个一百万是免费的)
此设置不需要您的任何服务器。这不能下降(只有在AWS本身下降的情况下)


(完成后别忘了将作业从S3中删除)

谢谢您的建议。还有一个问题,如果不是生成许多lambda函数,而是只生成很少的函数(假设我们创建单独的函数,每5分钟、每小时、每天等运行一次)。每个lambda函数将从s3检索作业并通过sqs传递它们。任何可能导致此体系结构出现问题的内容?您需要考虑s3键(文件名)的结构,以便lambda函数不包含双文件(lambda函数不知道其他文件)。很好的一点是,您可以在S3事件上触发lambda函数,因此您永远不会遇到这个问题。然后,您可以将其发送给SQS(每个lambda函数都有一个SQS调用,这不是问题,请您详细说明在1个SQS票证中定义批处理的含义好吗?感谢您在一个SQS票证(或1个批处理)中定义一个作业数组,而不是每个SQS票证定义一个作业。然后,当您处理通知单时,实例可以一次处理整个批处理。在这种情况下,SQS通知单的数量是N/B,其中N是您需要的作业数量,B是批处理大小。因此,如果您在一个通知单中放置50个作业,那么10.000个作业只需要200个SQS通知单。是的,这就是计划。我将运行Lambda函数来调度如果每5分钟有10k个作业要运行,我将通过sqs将200个作业从Lambda函数(调度函数)传递给处理实例。但是作业本身将存储在s3中(但可以选择dynamo db),并在每个循环迭代“长时间运行的任务”时从Lambda函数获取。。“最多需要1分钟”:/