代码之家  ›  专栏  ›  技术社区  ›  0xtuytuy

Lambda+API网关:任务完成前长时间执行函数返回

  •  1
  • 0xtuytuy  · 技术社区  · 8 年前

    我在Lambda中有一个函数,根据输入执行时间长达30秒。 该函数链接到一个API网关,因此我可以通过POST调用它,不幸的是,API网关被限制为30s exaclty,因此如果我的函数运行更长时间,我会从POST返回一个“内部服务器错误”。

    我看到了两种解决方案:

    • 创建一个“socket”,而不是一个连接到lambda函数的简单POST,不确定这是否可能,也不知道这是如何工作的。
    • 在lambda函数实际完成之前,向api网关返回通知。这对于我的用例来说是可以接受的,但我不确定这是如何工作的。

    该函数是在Python3.6中编码的,因此我可以访问事件和上下文对象。

    3 回复  |  直到 8 年前
        1
  •  4
  •   statut    8 年前

    在lambda函数实际完成之前,向api网关返回通知。这对于我的用例来说是可以接受的,但我不确定这是如何工作的。

    不幸的是,在Lambda完成之前,您将无法返回结果。否则,如果您尝试执行Lambda,例如通过多线程,AWS将中断Lambda的执行。

    我建议您创建以下系统:

    1. API网关将请求放入Kinesis流,并返回成功放入的响应。响应将包含 SequenceNumber 运动记录。( How to do it )
    2. Kinesis Stream事件调用Lambda,处理请求并将您的作业完成(或完成的结果)保存到DynamoDB 序列号 作为id。
    3. 调用另一个API网关方法 序列号 检查您在DynamoDB中的工作状态(如有必要)。

    如果只需要运行Lambda而不知道作业结果,可以避免使用DynamoDB。

        2
  •  4
  •   balsick    8 年前

    statut方法很好,但我想给您一个替代方法:AWS步骤函数。基本上它实现了statut解决方案的功能,但它可能更易于部署。

    您所要做的就是创建一个AWS步骤函数状态机,该状态机将lambda函数作为其唯一任务。AWS Step函数本质上是异步工作的,并且具有了解状态以及最终结果的方法。查看文档了解更多信息。

        3
  •  2
  •   cementblocks    8 年前

    一个非常简单的解决方案是,您的lambda函数只需异步调用另一个lambda函数,然后将结果返回给API网关。