有没有办法';提前返回';来自Java AWS Lambda RequestStreamHandler
我正在使用API网关通过https调用JavaAWS Lambda 我有一个案例,我很快知道我想从我的Lambda返回什么状态,但我有更多的工作要做,这不会影响状态 有没有办法向调用者提供状态,但不结束Lambda的执行 我试过:有没有办法';提前返回';来自Java AWS Lambda RequestStreamHandler,java,amazon-web-services,aws-lambda,Java,Amazon Web Services,Aws Lambda,我正在使用API网关通过https调用JavaAWS Lambda 我有一个案例,我很快知道我想从我的Lambda返回什么状态,但我有更多的工作要做,这不会影响状态 有没有办法向调用者提供状态,但不结束Lambda的执行 我试过: @Override public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException { Json
@Override
public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException {
JsonWriter writer = new JsonWriter(new OutputStreamWriter(outputStream));
writer.beginObject();
writer.name("statusCode").value("200");
writer.endObject();
writer.flush();
writer.close();
try {
// this wait represents other work my Lambda is doing,
// e.g. DB calls, requests to other webservices
Thread.sleep(10 * 1000);
} catch (InterruptedException e) {
}
}
但来电者仍然需要10秒钟才能看到状态。
有什么办法可以满足我的要求吗
我希望使我的应用程序尽可能简单,并尽可能少地启动lambda,而不会让调用方等待超过必要的时间。您可以在调用方方法中等待这10秒,就在调用下面。如果您知道应该返回给调用方的状态,并且您必须执行的其他工作不会影响状态代码或http响应,那么为什么要保持lambda执行(这是一个坏主意,因为您是按执行时间x内存计费的) 使用SNS触发另一个lambda以继续该过程。它看起来像:
caller -> Lambda -> SNS -> Lambda
|
caller <---(status)----
caller->Lambda->SNS->Lambda
|
来电者我已经更新了问题,以澄清等待代表我的Lambda将完成的工作,但这不会影响返回给来电者的状态,因此不应延迟返回状态。调用另一个Lambda是一个选项,但我认为这不会为我节省任何钱-工作将在一个或另一个Lambda中完成,也需要同样的时间。如果我可以在一个Lambda中完成这一切,那么我的解决方案就更简单了,并且我避免了启动另一个Lambda的可能开销。Lambda启动和类加载大约需要2000毫秒,因此在第一个“冷”请求中对两个Lambda执行此操作将增加4000毫秒的开销。我忘了您正在使用Java…这就是为什么冷启动很痛苦的原因。在返回状态代码之前,您是否尝试过创建一个新线程?我尝试过——但我对文档的阅读(也许我应该将此作为一个单独的问题)是,在后台线程仍在运行的情况下从handleRequest()返回是不安全的——运行Lambda的JVM可能在后台线程完成之前被“冻结”。OT:有趣的是,据我所知,启动过程中代价高昂的部分是类加载,而不是JVM启动本身。是的,你是对的。从架构的角度来看,将一个事件广播到SNS,然后触发另一个lambda来执行特定任务更干净、更安全。你真的需要在同一个lambda中处理,只是为了保持简单?另外,您真的需要使用Java吗?如果可以,可以尝试node或python,这样可以使其保持简单、代码更少和冷启动更快。