从Lambda回复API网关的响应

问题描述 投票:7回答:3

我正在使用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

amazon-web-services aws-lambda aws-api-gateway
3个回答
6
投票

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

  1. 异步调用Lambda,使用AWS集成在Lambda上调用InvokeAsync,或者使用SNS或Kinesis等中间服务来触发Lambda函数。
  2. 你是#2图,使用同步Lambda调用来启动异步调用。

4
投票

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


2
投票

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

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

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

此外,如果您无法通过微服务发送它,您可以配置此标头默认通过API网关资源中的方法执行 - >集成请求 - > HTTP标头传递

这对micro-service -> API Gateway -> Lambda场景起作用,就像问题中提到的那样。

© www.soinside.com 2019 - 2024. All rights reserved.