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

时间:2018-03-23 12:00:05

标签: sockets lambda aws-lambda

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

我看到了两个解决方案:

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

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

3 个答案:

答案 0 :(得分:3)

  

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

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

我建议您创建以下系统:

  1. API Gateway向Kinesis流发出请求并返回成功推送的响应。响应将包含Kinesis记录的df1.registerTempTable('df1') df2.registerTempTable('df2') query = "select df1.* from df1 where df1.id in (select df2.id from df2)" sqlContext.sql(query).show() #+---+-----+ #| id|value| #+---+-----+ #| 1| a| #| 2| b| #+---+-----+ 。 (How to do it
  2. Lambines由Kinesis Stream Event调用,处理请求并将您的工作完成(或已完成的结果)保存到DynamoDB,SequenceNumber为id。
  3. 您调用另一个API网关方法并SequenceNumber检查您在DynamoDB中的作业状态(如有必要)。
  4. 如果只需要在不知道作业结果的情况下运行Lambda,就可以避免使用DynamoDB。

答案 1 :(得分:2)

statut方法很好,但我想给你一个替代方案:AWS步骤功能。基本上它可以实现法律解决方案的功能,但部署起来可能更容易。

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

答案 2 :(得分:0)

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