我在每天运行一次的 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 服务吗?