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。
我要问的是:
你想要的就是所谓的活动工作者。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 实例或互联网上任何位置的某些计算机上。
归档时间: |
|
查看次数: |
4738 次 |
最近记录: |