首页 文章

从Lambda回复API网关的响应

提问于
浏览
6

我正在使用API Gateway-to-Lambda进行一些微服务,但至少有一种情况下该服务需要20-30秒才能完成,所以在这种情况下,我想立即回复客户端, 就像是:

status: 200
 message: {
      progressId: 1234
 }

然后允许Lambda函数继续(并定期更新"processId"客户端可以访问的地方 . 问题是,如果你调用 context.succeed()context.fail()context.done() ,显然会阻止lambda函数进一步执行,但它是唯一的我知道将stdout缓冲区刷回API网关的方法 .

这导致我采用第二种方法,我还没有尝试解决(并且为了简单起见,希望避免),这涉及API网关调用“响应者”Lambda函数,然后异步激活微服务,然后立即响应API网关 .

我试图在下面的草图格式中说明这两个选项 . 我很想知道任何人都能解决这个问题 .

two approaches

3 回答

  • 6

    目前,API Gateway要求AWS Lambda集成是同步的 . 如果您希望异步调用Lambda函数,则有2个选项:

    • 异步调用Lambda,使用在Lambda上调用 InvokeAsync 的AWS集成,或使用SNS或Kinesis等中间服务来触发Lambda函数 .

    • 你是#2图,使用同步Lambda调用来启动异步调用 .

  • 2

    截至2016年4月,可以使用AWS服务代理通过API网关创建异步Lambda执行 . 见http://docs.aws.amazon.com/apigateway/latest/developerguide/integrating-api-with-aws-services-lambda.html

  • 4

    您可以发送 X-Amz-Invocation-Type 标头,它通过 Event 值支持异步调用

    您可以选择将Event指定为InvocationType来请求异步执行

    http://docs.aws.amazon.com/lambda/latest/dg/API_Invoke.html#API_Invoke_RequestSyntax

    此外,如果您无法通过微服务发送它,您可以配置此标头默认通过API网关资源中的 Method Execution - > Integration Request - > HTTP Headers 传递

    这对我来说是一个 micro-service -> API Gateway -> Lambda 场景,就像问题中提到的那样 .

相关问题