Lambda 是否可以在返回状态代码为202
之类的响应后继续处理,然后 Lambda 必须在结束 Lambda 之前调用请求?
关于在函数返回响应之前启动的后台进程或回调,来自 Lambda 文档:
如果 AWS Lambda 选择重用执行上下文,则由您的 Lambda 函数启动的后台进程或回调在函数结束时未完成。在代码退出之前,应确保代码中的任何后台进程或回调都已完成。
编写 Lambda 函数代码时,不要假设 AWS Lambda 会自动重用执行上下文进行后续函数调用。其他因素可能要求 AWS Lambda 创建新的执行上下文,这可能会导致意外结果,例如数据库连接失败。
此外,对于 Node.js使用非异步处理程序的 Lambda 函数:
对于非异步处理程序,函数执行将继续,直到事件循环为空或函数超时。在所有事件循环任务完成之前,响应不会发送到调用程序。如果函数超时,则会返回错误。通过将
context.callbackWaitsForEmptyEventLoop
设置为 false,可以将运行时配置为立即发送响应。
您可以使用两个 lambda。第一个 lambda (lambda 1) 将对保存您的代码的 lambda (lambda 2) 进行异步调用。调用它后,您可以干净地退出"lambda 1",而无需等待"lambda 2"返回响应。
仅使用 AWS Lambda 是不可能的。
您可能需要研究 AWS Step Functions 以解决您的问题。
如果将自己的bootstrap
实现为自定义运行时的一部分,则可以执行此操作。与您可能已经熟悉的提供的 AWS Lambda 运行时不同,自定义运行时控制自己的事件循环。
以下是文档的相关摘录:
处理任务
[...]
清理– 在获取下一个事件之前释放未使用的资源、将数据发送到其他服务或执行其他任务。
您可以使用Step Functions来实现此目的。根据您的要求,可以使用以下方法:
-
通过 API 网关触发步进功能。API 网关将立即返回响应,然后步进函数将接管并触发 Lambda 函数,它将确保 Lambda 执行到最后。
-
您可以触发 Lambda 1,Lambda 1 将触发步进函数,然后步进函数将触发 Lambda 2。我假设 Lambda 2 将用于繁重的处理。