5

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

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

我想让整个过程serverless。我最初的想法是使用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可能是一个好主意

4

3 回答 3

2

所以回答你的问题:

1) 是的,如果您有一个可以运行大约 45 分钟的东西,而您可以使用 Lambda/Step 函数对其进行设计,那么您最好获得一个 EC2 微型实例。

2) 不,你已经明白了。

3) 如上所述,您想为此使用 EC2,有一篇关于使用数据管道在此处启动/停止 EC2 实例的好文章,仅在您需要时启动实例,成本(如果有)可以忽略不计。

我的工作通常以这种方式运行,您可以使用符合免费套餐条件的 t2.micro 实例来摆脱困境。

您还可以在 EC2 实例上运行 perl 脚本,因此无需重写它们!

于 2017-06-05T12:38:40.267 回答
2

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

AWS 文档中的分步详细信息

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

于 2017-06-06T08:13:41.160 回答
0

我将从您似乎正在 AWS 上寻找工作流解决方案开始。SWF 和 Step 函数是两个最流行的函数。Steps 功能是较新的产品,AWS 比 SWF 更鼓励它。

SWF 具有处理长时间运行任务的本机能力,缺点是您必须为决策者提供自己的执行环境(不能使用 lambda)。

使用步进函数,您可以通过两种不同的方式执行此操作。蒂姆在他的回答中提出了一种方法。有一种替代方法可以实现相同的目的,即在步骤函数中使用作业轮询器。作业轮询器能够调用(轮询)您的资源并确定任务是否已完成,如果未完成,您可以在指定时间以等待模式发送执行。如上所述,当前任何工作流允许的最大执行时间为 1 年。如果您的任务可能需要超过 1 年的时间,则不能以当前形式使用步进函数。

于 2018-10-26T20:57:36.233 回答