繁体   English   中英

AWS API 网关 WebSocket 超时?

[英]AWS API Gateway WebSocket Timeout?

How do I keep an API Gateway Websocket API with a Lambda Java back end from timing out after 30 seconds?

AWS API 网关和 re:invent 视频提到使用 ping 或心跳来保持 Websocket 连接有效,但我还没有找到一个简单的工作示例(在 Java 中)。 前端使用 HTML 5 Websockets (vanilla javascript)。

我在 Java 中包含了我的 Lambda 测试驱动程序。 它会导致 API 网关 WS API 在 30 秒后超时,如记录所示。 如果您消除延迟,驱动程序将成功返回。 任何帮助表示赞赏...

import java.io.InputStream;
import java.io.OutputStream;
import java.util.Map;

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestStreamHandler;
import com.fasterxml.jackson.databind.ObjectMapper;

public class TestWSClient implements RequestStreamHandler {

    public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) {
        try {
            //
            // How do we keep API Gateway from timing out after 30 seconds?
            // Is something like this even needed in the lambda?
            //
            new Thread(() -> {
                while(true) {    
                    try {
                        // Ping client every 15 seconds
                        Thread.sleep(15000);
                        //outputStream.write(); // What to write -- 0x89 0x00?
                        outputStream.flush();
                    } catch(Exception e) { e.printStackTrace(); }
                }
            }).start();

            //
            // Simulate long processing time or streaming
            //
            // NOTE: commenting sleep enables service to return w/o a timeout
            //       connection from API Gateway
            //
            try { Thread.sleep(60000); } catch(Exception e) {}

            var response = Map.of(
                "statusCode", 200,
                "headers", Map.of("Content-Type", "text/csv"),
                "body", "Hello,World"
            );

            ObjectMapper om = new ObjectMapper();

            outputStream.write(om.writeValueAsBytes(response));
            outputStream.flush();
        } catch(Exception e) { e.printStackTrace(); }
        finally { try { outputStream.close(); } catch(Exception e) {} }
    }
}

我认为我没有正确理解您的问题,但根据我的经验,这是 WebSocket API 的工作方式。 客户端 <-(1)-> API 网关 <-(2)-> Lambda

1) 是 web 套接字连接,最长保持打开状态 2 小时,空闲超时为 10 分钟,如此处所述。 https://docs.aws.amazon.com/apigateway/latest/developerguide/limits.html

2 ) 使用@connection https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-how-to-call-websocket-api-connections.html管理通信

我相信您想使用 @connection 从 lambda 与您的 API 网关通信。

看起来 Lambda 需要 NAT 网关才能调用 AWS ApiGatewayManagementApi SDK 提供的 postToConnection function。

遗憾的是,在 Websockets API 或 API 网关的任何地方都没有指定此要求。

页面上搜索“NAT”,然后阅读该句子:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM