AWS API网关WebSocket是什么?

1cklez4t  于 2024-01-09  发布在  其他
关注(0)|答案(3)|浏览(329)

如何防止带有Lambda Java后端的API网关WebSocket API在30秒后超时?
AWS API Gateway和re:invent视频提到使用ping或heartbeats来保持WebSocket连接,但我还没有找到一个直接的工作示例(Java)。前端使用HTML 5 Websockets(vanilla JavaScript)。
我在Java中包含了我的Lambda测试驱动程序。它会导致API网关WS API在30秒后超时,如文档所示。如果您删除延迟,驱动程序将成功返回。感谢任何帮助.

  1. import java.io.InputStream;
  2. import java.io.OutputStream;
  3. import java.util.Map;
  4. import com.amazonaws.services.lambda.runtime.Context;
  5. import com.amazonaws.services.lambda.runtime.RequestStreamHandler;
  6. import com.fasterxml.jackson.databind.ObjectMapper;
  7. public class TestWSClient implements RequestStreamHandler {
  8. public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) {
  9. try {
  10. //
  11. // How do we keep API Gateway from timing out after 30 seconds?
  12. // Is something like this even needed in the lambda?
  13. //
  14. new Thread(() -> {
  15. while(true) {
  16. try {
  17. // Ping client every 15 seconds
  18. Thread.sleep(15000);
  19. //outputStream.write(); // What to write -- 0x89 0x00?
  20. outputStream.flush();
  21. } catch(Exception e) { e.printStackTrace(); }
  22. }
  23. }).start();
  24. //
  25. // Simulate long processing time or streaming
  26. //
  27. // NOTE: commenting sleep enables service to return w/o a timeout
  28. // connection from API Gateway
  29. //
  30. try { Thread.sleep(60000); } catch(Exception e) {}
  31. var response = Map.of(
  32. "statusCode", 200,
  33. "headers", Map.of("Content-Type", "text/csv"),
  34. "body", "Hello,World"
  35. );
  36. ObjectMapper om = new ObjectMapper();
  37. outputStream.write(om.writeValueAsBytes(response));
  38. outputStream.flush();
  39. } catch(Exception e) { e.printStackTrace(); }
  40. finally { try { outputStream.close(); } catch(Exception e) {} }
  41. }
  42. }

字符串

6qftjkof

6qftjkof1#

我不认为我正确理解了你的问题,但这里是如何WebSocket API在我的经验工作。客户端<-(1)-> API网关<-(2)-> Lambda
1)是Web Socket连接,它最多保持打开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 Gateway进行对话。

yx2lnoni

yx2lnoni2#

我也遇到了同样的问题。我发现即使WebSocket连接打开到2小时,API(第一个lambda调用)的处理也会在29秒内超时。
为了解决这个问题,你必须使用一个lambda策略。因此,创建一个代理,它将接收输入并通过SNS主题或SQS队列调用所需的lambda。
有关更多信息,此链接非常有用:https://repost.aws/questions/QUFXpcneknSgmhseduEh18dw/api-gateway-websocket-api-30s-timeout

np8igboo

np8igboo3#

Lambda调用AWS ApiGatewayManagementApi SDK提供的postToConnection函数似乎需要NAT网关。
遗憾的是,关于Websockets API或API网关,没有在任何地方指定此要求。
this页面上搜索'NAT',然后阅读以下句子:

相关问题