我正在使用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网关 .
我试图在下面的草图格式中说明这两个选项 . 我很想知道任何人都能解决这个问题 .
3 回答
目前,API Gateway要求AWS Lambda集成是同步的 . 如果您希望异步调用Lambda函数,则有2个选项:
异步调用Lambda,使用在Lambda上调用 InvokeAsync 的AWS集成,或使用SNS或Kinesis等中间服务来触发Lambda函数 .
你是#2图,使用同步Lambda调用来启动异步调用 .
截至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
值支持异步调用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
场景,就像问题中提到的那样 .