我在GKE上托管了一个应用程序,在许多任务中,它为客户端提供了一个zip文件。这些zip文件是通过谷歌云存储上的许多单独文件动态构建的。
我面临的问题是,当这些zip变得特别大时,连接会在中途随机失败(在1.4GB到2.5GB之间(。似乎也没有任何时间模式-可能发生在2-8分钟之间。
AFAIK,负载均衡器和我的应用程序之间的连接正在断开。GKE入口(负载均衡器(是否已知会关闭长/大连接?
GKE设置:
- HTTP(S(负载均衡器入口
- NodePort后端服务
- 部署(我的应用程序(
更多详细信息/调试步骤:
- 我无法在本地复制它(没有kubernetes(
- 负载平衡器记录
statusDetails: "backend_connection_closed_after_partial_response_sent"
,而响应具有200状态代码。谷歌对此毫无帮助 - 直接访问pod并使用k8s端口转发下载成功
- 我的应用程序记录请求已被取消(由请求者(
- 我可以验证没有任何文件损坏(可以直接从存储中下载所有文件(
我相信您的"backend_connection_closed_after_partial_response_sent"问题是由websocket连接被后端提前终止引起的。您可以在nginx中看到关于websocket代理的文档,它解释了这个过程的性质。简而言之,默认情况下,WebSocket连接会在10分钟后终止。
为什么当你直接从pod下载文件时它会起作用?因为您绕过了负载均衡器,并且websocket连接正常保持活动状态。当您代理websocket时,事情就会开始发生,因为websocket依赖于未代理的逐跳标头。
这里讨论了类似的案例。它是通过从后端向客户端发送ping帧来解决的。
在我看来,你最好也这样做。当代理websocket时,我发现了许多类似问题的案例,其中大多数都建议使用ping,因为它会重置连接计时器并使其保持活动状态。
以下是关于使用WebSocket和超时对客户端进行ping的更多信息
我在谷歌工作,这是我所能帮助你的——如果这不能解决你的问题,你必须联系GCP支持。