【问题标题】:Is there any way to 'return early' from a Java AWS Lambda RequestStreamHandler有什么方法可以从 Java AWS Lambda RequestStreamHandler 中“提前返回”
【发布时间】:2017-09-07 06:05:38
【问题描述】:

我正在使用 API 网关通过 https 调用 Java AWS Lambda。

我有一个案例,我很快就知道我想从我的 Lambda 返回什么状态,但我还有更多工作要做,这不会影响状态。

有没有办法向调用者提供状态,但不会结束 Lambda 的执行?

我试过了:

@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,而不会让调用者等待不必要的时间。

【问题讨论】:

    标签: java amazon-web-services aws-lambda


    【解决方案1】:

    如果您知道应该返回给调用者的状态,并且您必须做的其他工作不会影响状态代码或 http 响应,为什么要保持 lambda 执行(这是一个坏主意因为您是按执行时间 x 内存计费的)?

    使用 SNS 触发另一个 lambda 以继续该过程。它看起来像:

    caller      ->      Lambda   ->   SNS  ->  Lambda
                          |
    caller <---(status)----
    

    【讨论】:

    • 调用另一个 Lambda 是一种选择,但我认为这不会为我节省任何钱——工作将在一个或另一个 Lambda 中完成,并且需要相同的时间。如果我可以在一个 Lambda 中完成所有操作,那么我的解决方案会更简单,并且我可以避免启动另一个 Lambda 的可能开销。 Lambda 启动和类加载大约需要 2000 毫秒,因此对第一个“冷”请求的 两个 Lambda 执行此操作将增加 4000 毫秒的开销。
    • 我忘了你在使用Java...这就是为什么冷启动是痛苦的。您是否尝试过在返回状态码之前创建一个新线程?
    • 我有——但我对文档的阅读(也许我应该把它作为一个单独的问题)是在后台线程仍在运行的情况下从 handleRequest() 返回是不安全的——运行 Lambda 的 JVM 可能会在后台线程完成之前被“冻结”。不过,我还没有证明会发生这种情况。
    • OT:有趣的是,据我所知,启动的昂贵部分是类加载,而不是 JVM 启动本身。
    • 是的,你是对的。从架构的角度来看,将一个事件广播到 SNS,然后触发另一个 lambda 来执行特定任务更干净、更安全。您是否真的需要在同一个 lambda 中进行处理以保持简单?另一件事,你真的需要使用Java吗?如果可以的话,试试 node 或者 python,你可以保持简单,更少的代码和更快的冷启动。
    【解决方案2】:

    你可以在 caller 方法中等待这 10 秒,就在调用之下。

    【讨论】:

    • 我已更新问题以澄清等待代表我的 Lambda 将执行的工作,但这不会影响返回给调用者的状态,因此不应延迟返回状态。
    猜你喜欢
    • 1970-01-01
    • 2013-12-19
    • 2020-03-17
    • 2021-08-08
    • 1970-01-01
    • 2019-07-04
    • 1970-01-01
    • 2017-07-10
    • 1970-01-01
    相关资源
    最近更新 更多