适用于具有长时间运行任务的应用程序,使用AWS Lambda或AWS Step Functions?

6
我在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可能是一个不错的选择

3个回答

2

回答你的问题:

1)如果你有一个运行时间大约为45分钟的东西,虽然你可以使用Lambda/Step函数进行工程设计,但最好还是选择EC2微实例。

2)没错,你已经基本掌握了。

3)与上述相同,你需要选择EC2,这里有一篇很好的文章介绍如何使用数据管道来启动/停止EC2实例(链接),这样只有在需要时才启动实例,成本(如果有的话)就会非常低廉。

我有一些以这种方式运行的作业,通常你可以使用t2.micro实例,这是符合免费套餐资格的。

你也可以在EC2实例上运行你的Perl脚本,所以不需要重写它们!


数据管道解决方案听起来很有趣。您如何从管道启动应用程序到EC2实例?当管道启动代码时,是否需要配置实例以运行您的代码? - RTF
你可以这样做,或者只需在实例上设置一个cron作业,但使用数据管道在cron应该开始之前启动它。 - Mrk Fldig
是的,我需要配置用户数据脚本或cloud-init等,因为我需要在必要时能够按需运行流水线,例如如果整个工作流失败并需要重新尝试。 - RTF
结果发现,Step Functions有他所需的东西,它们被称为活动工作者。 - Tim Bray

2
你需要的叫做“Activity Workers”。简单说,你可以注册“活动”,每个注册的活动都会获得一个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是资源字段的值。然后,添加代码以使用http://docs.aws.amazon.com/step-functions/latest/apireference/API_GetActivityTask.html轮询服务 - 每当运行的机器到达该任务时,它将寻找正在轮询的活动工作者。它会向您的轮询工作者提供任务输入,然后您可以处理输入并生成一些输出,并调用SendTaskSuccess或SendTaskFailure。所有这些都只是REST HTTP调用,因此您可以在任何地方运行它们,我是指任何地方;在Lambda、EC2实例上,甚至在Internet上的任何计算机上。

哦,你的活动工作者可以使用 Perl :) 但你可能还是想要进行更改。 - Tim Bray
1
我已经翻阅了几个小时的文档,但我不明白任务代码本身应该位于哪里。例如,如果我定义一个状态机(SM)并从控制台执行它,我的SM定义将指示要开始的状态(任务)。该任务与ARN相关联,这是我为任务创建的活动。但是我如何定义要运行的该任务的代码,或者告诉它代码在哪里? - RTF
如果您没有任何特殊环境要求,例如运行sphinxsearch等等,那么活动工作者都很好 - 如果他只是运行代码,那么这是一个不错的选择。 - Mrk Fldig
Mrk Fldig,我想我不同意。您的活动工作者可以在任何可以进行HTTP连接的地方运行,因此运行任何特定软件包会如何妨碍它并不明显。我有什么遗漏吗? - Tim Bray
看起来,如果我为应用程序中的每个单独步骤/任务创建Docker容器,并将这些Docker注册到EC2容器服务中,那么这个解决方案似乎是最好的。显然这是可能的,但我仍然不明白如何让Step Functions运行/启动Docker镜像中的代码,例如将Docker与活动相关联。 - RTF
显示剩余3条评论

0

我先从你似乎在寻找AWS上的工作流解决方案开始。SWF和Step Functions是最受欢迎的两种。Step Functions是一种较新的提供方式,AWS比SWF更加推荐使用。

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

使用Step Functions,您可以以两种不同的方式完成此操作。其中一种方法是由Tim在他的回答中建议的。 还有一种实现相同目的的替代方法,即使用Step Functions中的作业轮询器。作业轮询器具有调用(轮询)您的资源并查找任务是否完成的能力,如果未完成,则可以将执行发送到等待模式以等待指定时间。如上所述,任何工作流的最大执行时间目前允许为1年。如果您有可能需要超过1年的任务,则无法使用当前形式的Step Functions。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接