我正在使用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网关。
我试图在下面的草图格式中说明这两个选项。我很想知道任何人都能解决这个问题。
目前,API Gateway要求AWS Lambda集成是同步的。如果您希望异步调用Lambda函数,则有2个选项:
截至2016年4月,可以使用AWS服务代理通过API网关创建异步Lambda执行。见http://docs.aws.amazon.com/apigateway/latest/developerguide/integrating-api-with-aws-services-lambda.html
您可以发送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
场景起作用,就像问题中提到的那样。