繁体   English   中英

应用程序是否适合长期运行的AWS Lambda或AWS Step Functions任务

[英]Suitability of app with long running tasks for AWS Lambda or 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可能是一个好主意

因此,回答您的问题:

1)是的,如果您可以运行45分钟左右,并且可以使用Lambda / Step函数对其进行工程设计,则最好使用EC2微型实例。

2)不,您已经了解了。

3)如上你想要去的EC2对于这一点,有关于使用数据管道开始的好文章/停止EC2实例在这里通过启动实例的方式,只有当你需要它的成本(如果有的话)是微不足道的。

我的工作通常以这种方式运行,您可以使用符合免费套餐资格的t2.micro实例。

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

您想要的就是活动工作者。 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 ...开头的字符串。然后在状态机中,以该ARN作为资源字段的值来创建任务状态。 然后,您将代码添加到color_turtles.pl中,以使用http://docs.aws.amazon.com/step-functions/latest/apireference/API_GetActivityTask.html轮询该服务-只要您正在运行的计算机执行该任务,它就会会去寻找活动工作者进行投票。 它将为轮询工作人员提供任务的输入,然后处理该输入并生成一些输出,然后调用SendTaskSuccess或SendTaskFailure。 所有这些都是REST HTTP调用,因此您可以在任何地方运行它们,我的意思是在任何地方; 在Lambda,EC2实例或Internet上任何位置的某些计算机上。

首先,看来您正在AWS上寻找工作流程解决方案。 SWF和Step函数是两个最受欢迎的函数。 步骤功能是最新的产品,并且比SWF更受AWS的鼓励。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM