如何将 AWS lambda 调用划分为独立的处理任务
How to partition AWS lambda invocations to independent processing tasks
我正在寻找有关 AWS 的一些最佳实践建议,并希望这个问题不会因为过于开放而立即被关闭。
我正在将 windows 服务器应用程序转换为 AWS lambda。
服务器每 5 分钟 运行s 抓取所有已上传到不同 FTP 位置的文件。
这些文件必须按特定顺序处理,这可能不是它们到达的顺序,因此它会对它们进行排序并进行相应处理。
它与数据库交互以根据先前文件中的信息验证文件。
然后它将相关信息发送到数据库中,并在数据库中记录新信息。
错误会被标记并记录在数据库中,以供手动处理。
请注意,目前没有进行并行处理。这会很困难,因为需要对文件进行排序并以正确的顺序处理它们。
因此,我一直假设 lambda 必须 运行 作为计划中的单个调用。
但是,我意识到文件可以根据它们的来源进行分区,并且可以独立处理这些位置。
所以我可以有一定的并行度。
我的问题是在 AWS 中管理有限并行性的正确方法是什么?
一个笨拙的方法是通过数据库,像这样:
- lambda 启动并读取数据库中的特定 table
- 这个table有一个独立处理区域的列表,以及列:“Status”、“StartTime”。
- lambda 找到当前不存在的最旧的
正在处理中,将其注册为“处理中”并更新
“开始时间”。
- 处理后状态设置为“完成”或类似的状态。
我认为这可行,但感觉通过数据库管理此类事情不太合适。
有人可以提出适合我的问题的模式,以及正确的 AWS 方法吗?
如果您真的想通过并行 lambda 调用来做到这一点,那么是的,您应该绝对使用数据库来协调他们的工作。
你考虑的协议似乎是合理的。您需要使用数据库的事务功能来确保并行调用不会相互干扰,并且您需要确保系统对不会发生的 lambda 调用具有弹性。
当你的 lambda 被调用来处理事件时,它应该决定需要多少额外的并行调用,然后对 运行 这些额外的实例进行异步 lambda 调用。这些实例应该认识到它们是直接调用的并跳过那部分。
在那之后,所有并行的 lambda 调用都应该做完全相同的事情。确保其中 none 个在任何方面都是特殊的,因此您无需依赖任何特定的完成而不会出错。他们应该各自从数据库中的工作队列中提取工作,直到完成所有工作。
但请注意:通常您所谈论的任务类型不受 CPU 约束。如果是这种情况,那么 运行在 same lambda 调用中执行多个并行任务将更好地利用您的资源。当然,你可以两者都做。
我正在寻找有关 AWS 的一些最佳实践建议,并希望这个问题不会因为过于开放而立即被关闭。
我正在将 windows 服务器应用程序转换为 AWS lambda。 服务器每 5 分钟 运行s 抓取所有已上传到不同 FTP 位置的文件。 这些文件必须按特定顺序处理,这可能不是它们到达的顺序,因此它会对它们进行排序并进行相应处理。 它与数据库交互以根据先前文件中的信息验证文件。 然后它将相关信息发送到数据库中,并在数据库中记录新信息。 错误会被标记并记录在数据库中,以供手动处理。
请注意,目前没有进行并行处理。这会很困难,因为需要对文件进行排序并以正确的顺序处理它们。
因此,我一直假设 lambda 必须 运行 作为计划中的单个调用。
但是,我意识到文件可以根据它们的来源进行分区,并且可以独立处理这些位置。 所以我可以有一定的并行度。
我的问题是在 AWS 中管理有限并行性的正确方法是什么?
一个笨拙的方法是通过数据库,像这样:
- lambda 启动并读取数据库中的特定 table
- 这个table有一个独立处理区域的列表,以及列:“Status”、“StartTime”。
- lambda 找到当前不存在的最旧的 正在处理中,将其注册为“处理中”并更新 “开始时间”。
- 处理后状态设置为“完成”或类似的状态。
我认为这可行,但感觉通过数据库管理此类事情不太合适。
有人可以提出适合我的问题的模式,以及正确的 AWS 方法吗?
如果您真的想通过并行 lambda 调用来做到这一点,那么是的,您应该绝对使用数据库来协调他们的工作。
你考虑的协议似乎是合理的。您需要使用数据库的事务功能来确保并行调用不会相互干扰,并且您需要确保系统对不会发生的 lambda 调用具有弹性。
当你的 lambda 被调用来处理事件时,它应该决定需要多少额外的并行调用,然后对 运行 这些额外的实例进行异步 lambda 调用。这些实例应该认识到它们是直接调用的并跳过那部分。
在那之后,所有并行的 lambda 调用都应该做完全相同的事情。确保其中 none 个在任何方面都是特殊的,因此您无需依赖任何特定的完成而不会出错。他们应该各自从数据库中的工作队列中提取工作,直到完成所有工作。
但请注意:通常您所谈论的任务类型不受 CPU 约束。如果是这种情况,那么 运行在 same lambda 调用中执行多个并行任务将更好地利用您的资源。当然,你可以两者都做。