具有长时间运行任务的应用程序对 AWS Lambda 或 AWS Step Functions 的适用性

RTF*_*RTF 6 amazon-web-services aws-lambda aws-step-functions

我在 AWS EC2 实例上有一个每天运行一次的应用程序。该应用程序从 Web 服务中获取一些文件,逐行解析文件,更新数据库,根据数据库中的更改更新 S3 文件,向客户发送通知电子邮件以及一些其他任务。

这是一系列必须按顺序发生的逻辑任务,尽管其中一些任务可以被视为可以并行执行的子任务。所有任务都是 Perl 脚本和 Java 程序的组合,单个 Perl 脚本充当依次执行每个任务的管理器。有些任务可能需要长达 45 分钟才能完成,整个过程总共可能需要长达 3 小时。

我想让整个过程成为无服务器的。我最初的想法是使用AWS Lambda,其中每个任务都将作为 Lambda 函数执行,直到我发现 Lambda 函数施加5 分钟的执行超时。看起来AWS Step Functions服务实际上更适合我的用例,但我的理解是该服务由 Lambda 支持,因此任务仍然有 5 分钟的执行限制。

(我还知道我必须将 Perl 脚本重写为 Lambda 支持的语言)。

我假设我可以通过将代码重构为较小的函数来解决执行时间限制,从而保证在 5 分钟内完成。但在我的特殊情况下,这似乎效率低下。

目前,数据库更新任务一次处理一个文件中的行。为了与 Lambda 配合使用,Lambda 函数只需处理文件中的一行(或极少量的行),以保证执行时间不超过 5 分钟。这将涉及在每次调用 Lambda 函数时打开和关闭与数据库的连接。此外,处理的每一行都应将一个条目写入文件,并存储在 S3 中。现在,我只是在内存中保留一个文件句柄,并在处理完所有行后将文件写入 S3,但使用 Lambda,我需要继续读取文件、更新文件并将其写回 S3。

我要问的是:

  • 我的用例是否不适合 AWS Lambda 和/或 AWS Step Functions?
  • 我是否误解了这些服务的运作方式?
  • 是否还有其他更适合我的使用案例的 AWS 服务?

经过进一步研究,我认为AWS Batch可能是一个好主意

Tim*_*ray 2

你想要的就是所谓的活动工作者。Tl;dr:您注册“活动”,每个活动都会获得一个 ARN。然后,您可以将该 ARN 放入任务状态的资源字段中,然后在某处(在 Lambda 中、在 EC2 上、在您的地下室中等任何地方)运行一些代码(“工作程序”)来轮询该 ARN 标识的任务,然后回电报告成功或失败。Activity Workers 可以运行长达一年。

AWS 文档中的分步详细信息

为了回应 RTF 的评论,这里有一个更深入的探讨:假设您在 color_turtles.pl 中有为海龟着色的代码。因此,您要做的就是调用 CreateActivity API - 请参阅http://docs.aws.amazon.com/step-functions/latest/apireference/API_CreateActivity.html - 提供名称“ColorTurtles”,它会给您返回一个 ARN ,以 arn:aws... 开头的字符串... 然后在状态机中使用该 ARN 作为资源字段的值创建一个任务状态。然后,您将代码添加到 color_turtles.pl 以使用http://docs.aws.amazon.com/step-functions/latest/apireference/API_GetActivityTask.html轮询服务- 每当您运行的计算机执行该任务时,它都会我们会去找活动工作者投票。它将为您的轮询工作人员提供任务的输入,然后您处理输入并生成一些输出,并调用 SendTaskSuccess 或 SendTaskFailure。所有这些都只是 REST HTTP 调用,因此您可以在任何地方运行它们,我的意思是任何地方;在 Lambda、EC2 实例或互联网上任何位置的某些计算机上。