我在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。
我的问题是:
这是一系列必须按顺序进行的逻辑任务,尽管其中一些任务可以被视为可以并行执行的子任务。所有任务都是由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服务更适合我的用例?