【发布时间】:2020-09-10 03:57:28
【问题描述】:
我在 Docker 容器中部署了一组应用程序,这些应用程序使用 websocket 进行通信。一个是后端,一个是前端。
我在实例组中都有两个 VM 实例,并通过负载均衡器提供服务,以便我可以将它们托管在 https 域中。
我遇到的问题是,在 Google Compute Engine 中,websocket 连接在 30 秒后关闭。
在本地运行时,websockets 不会超时。我已经搜索了问题并找到了这些可能的原因,但我找不到解决方案:
-
如果您不传递“保持活动”消息以使其保持活动状态,Websocket 可能会自行超时。所以我从前端向后端传递一个保持活动状态,并让后端每 10 秒响应一次前端。
-
根据GCE websocket support docs,需要在后端和前端之间进行某种类型的“升级”握手,以使 websocket 连接保持活动状态。但是according to MDN,“如果您使用 WebSocket API 或任何执行 WebSockets 的库打开新连接,那么大部分或所有这些都是为您完成的。”我正在使用该 API,实际上,当我检查标头时,我看到了这些字段:
对于外部 HTTP(S) 负载平衡器和内部 HTTP(S) 负载 平衡器,如果 HTTP 连接升级到 WebSocket,则 后端服务超时定义了一个最大的时间量 WebSocket 可以打开,不管是否空闲。
这似乎与GCE websocket support docs 的说法相冲突:
当负载均衡器识别出来自 HTTP(S) 客户端,然后是来自客户端的成功升级响应 后端实例,负载均衡器代理双向流量 当前连接的持续时间。
它是什么?我想在它们建立后保持套接字打开,但是如果初始化 websocket 连接的请求超过 30 秒,它们应该仍然超时。而且我也不想让其他标准 REST 调用永远阻塞。
我该怎么办?我是否必须将后端服务的超时设置为永远,并处理其他非 websocket REST 调用可能永远不会超时的事实?还是有更好的办法?
【问题讨论】:
-
增加后端服务的超时修复了 websockets 关闭的问题。但我仍然想找到一个解决方案,让我只为 websockets 执行此操作,而不是所有 http 请求。我还希望它根本不超时,而不必输入大量的秒数。
标签: google-cloud-platform google-compute-engine