【问题标题】:AWS lambda sequentially invoke same functionAWS lambda 顺序调用相同的函数
【发布时间】:2021-08-10 07:18:00
【问题描述】:

我的数据库中有近 1000 个项目。我必须对每个项目运行相同的操作。问题在于这是一项第三方服务,每个操作的速率限制为 1 秒。到目前为止,我能够在 lambda 函数中完成所有工作。现在已接近 15 分钟(900 秒)的超时限制。

我想知道拆分它的最佳方法是什么。我可以将每个项目(或一批项目)转储到 SQS 并让 lambda 函数按顺序处理它们吗?但据我了解,这不是推荐的方法,因为我不能将调用延迟足够长的时间。或者我必须在 lambda 中调用 lambda,这听起来也很奇怪。

AWS Step Functions 是通往这里的路吗?我还没有使用该服务,所以我想知道是否还有其他选择。如果有任何意义,我也会使用无服务器框架来执行此操作。

【问题讨论】:

    标签: amazon-web-services aws-lambda


    【解决方案1】:

    您提到的两种方法都是可行的。在 lambda 中,您可以在处理一个项目后添加延迟(睡眠),然后在延迟之后触发另一个 lambda 调用。当然,如果您使用这种方法,您将为死时间付出代价,因此阶跃函数可能是一个更优雅的解决方案。一个 lambda 当然可以调用另一个——甚至调用它自己。如果您异步调用下一个 lambda,则初始函数将在新调用的函数开始运行时完成。这个article on Asynchronous invocation 对这种方法很有用。本质上,每个 lambda 调用将负责处理一项,延迟足够长以适应服务限制,然后调用下一项。

    如果出现任何问题,您需要构建适当的异常处理,这样一个项目的问题要么停止其余项目,要么允许链的其余部分继续,具体取决于您的用例。

    Step Functions 也可以很好地处理这个用例。使用Wait 之类的选项并使用循环,您可以获得相同的结果。例如,您的步进函数流可以调用一个处理一个项目并返回下一个项目的 lambda,然后它可以接下来运行等待步骤,然后处理下一个项目,依此类推,直到您到达终点。您可以使用运行 lambda 任务和等待任务的 Map

    地图状态(“类型”:“地图”)可用于运行一组步骤 输入数组的每个元素。并行状态执行时 使用相同输入的多个步骤分支,Map 状态将 对状态中的数组的多个条目执行相同的步骤 输入。

    这个article on Iterating a Loop Using Lambda也很有用。

    【讨论】:

      【解决方案2】:

      如果您希望消息被串行处理并乐意将消息转储到 sqs,请同时设置 lambda 的 concurency 和 sqs 的 batchsize 属性触发函数到 1

      的事件

      将其设为 FIFO 队列,这样消息在重要时不会被多次处理。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-06-18
        • 1970-01-01
        • 2018-08-02
        • 1970-01-01
        • 2019-07-30
        • 2021-09-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多