如何将 AWS lambda 调用划分为独立的处理任务

Posted

技术标签:

【中文标题】如何将 AWS lambda 调用划分为独立的处理任务【英文标题】:How to partition AWS lambda invocations to independent processing tasks 【发布时间】:2022-01-20 08:46:27 【问题描述】:

我正在寻找一些关于 AWS 的最佳实践建议,并希望这个问题不会因为太开放而立即关闭。

我正在将 Windows 服务器应用程序转换为 AWS lambda。 服务器每 5 分钟运行一次,并抓取已上传到各个 FTP 位置的所有文件。 这些文件必须按特定顺序进行处理,这可能不是它们到达的顺序,因此它会对它们进行排序并相应地进行处理。 它与数据库交互以根据先前文件中的信息验证文件。 然后它发送相关信息,并在数据库中记录新信息。 错误被标记并记录在数据库中,以便手动处理。

请注意,目前没有进行并行处理。这会很困难,因为需要对文件进行排序并以正确的顺序处理它们。

因此,我一直假设 lambda 必须按计划作为单个调用运行。

但是,我意识到可以根据文件的来源对文件进行分区,并且可以独立处理这些位置。 所以我可以有一定的并行度。

我的问题是在 AWS 中管理有限并行性的正确方法是什么?

一种笨拙的方法是通过数据库,如下所示:

lambda 启动并读取数据库中的特定表 此表包含独立处理区域的列表,列:“状态”、“开始时间”。 lambda 找到最旧的不是当前 正在处理,将其注册为“处理”并更新 “开始时间”。 处理后状态设置为“完成”或类似的状态。

我认为这可行,但通过数据库管理此类事情感觉不太对。

有人可以建议我的问题适合的模式,以及这样做的正确 AWS 方式吗?

【问题讨论】:

按 5 分钟的计划运行并行作业是没有意义的,除非单线程作业可能无法在 5 分钟内完成。 确实,这就是我想的场景。我认为这项工作会及时进行,但我正在考虑缓解以防万一。 【参考方案1】:

如果您真的想通过并行 lambda 调用来做到这一点,那么是的,您应该绝对使用数据库来协调他们的工作。

您正在考虑的协议似乎是合理的。您需要使用数据库的事务功能来确保并行调用不会相互干扰,并且您需要确保系统对不会发生的 lambda 调用具有弹性。

当您的 lambda 被调用来处理事件时,它应该决定需要多少额外的并行调用,然后进行异步 lambda 调用来运行这些额外的实例。这些实例应该识别出它们是被直接调用的并跳过该部分。

在那之后,所有的并行 lambda 调用应该做同样的事情。确保它们都没有任何特殊之处,因此您不需要依赖任何特定的完成而不会出错。他们每个人都应该从数据库中的工作队列中提取工作,直到所有工作完成。

但请注意:通常您所说的任务类型不受 CPU 限制。如果是这种情况,那么在 same lambda 调用中运行多个并行任务将更好地利用您的资源。当然,两者都可以。

【讨论】:

以上是关于如何将 AWS lambda 调用划分为独立的处理任务的主要内容,如果未能解决你的问题,请参考以下文章

如何使用API 参考对AWS Lambda进行API调用

如何在 AWS Lambda 中等待异步操作?

来自 AWS lambda 的内存中查找

如何将特定 AWS API Gateway 阶段连接到特定 AWS lambda 别名

AWS SDK (PHP):异步调用 lambda 函数,检索状态

AWS Lambda使用S3