GKE流式传输大文件下载失败,部分响应

我在GKE上托管了一个应用程序,在许多任务中,其中一个是将zip文件提供给客户端。这些zip文件是通过Google云存储中的许多单独文件动态构建的。

我面临的问题是,当这些zip变得特别大时,连接会部分随机中断(1.4GB至2.5GB之间的任何地方)。似乎也没有任何定时模式-可能会在2-8分钟之间发生。

AFAIK,该连接在负载均衡器和我的应用之间的某个位置断开连接。是否已知GKE入口(负载均衡器)会关闭长/大连接?

GKE设置:

  • HTTP(S)负载均衡器入口
  • NodePort后端服务
  • 部署(我的应用程序)

更多详细信息/调试步骤:

  • 我无法在本地复制(没有kubernetes)。
  • 当响应的状态代码为200时,负载平衡器记录statusDetails: "backend_connection_closed_after_partial_response_sent"。谷歌对此没有任何帮助。
  • 使用k8s port-forward直接访问pod并进行下载成功
  • 我的应用记录了请求已被(请求者)取消
  • 我可以确认所有文件均未损坏(可以直接从存储中下载所有文件)
a314913370 回答:GKE流式传输大文件下载失败,部分响应

我认为您的“ backend_connection_closed_after_partial_response_sent”问题是由于websocket连接被后端早熟杀死而引起的。您可以在websocket proxying in nginx上查看文档-它说明了此过程的性质。简而言之-默认情况下,WebSocket连接会在10分钟后终止。

当您直接从Pod下载文件时,为什么它起作用?因为您绕过了负载均衡器,所以websocket连接可以正常使用。当您代理websocket时,事情就会开始发生,因为WebSocket依赖于没有代理的逐跳报头。

类似case was discussed here。通过将ping帧从后端发送到客户端来解决。

在我看来,您最好的选择就是这样做。当websocket被代理时,我发现许多情况类似的问题,并且大多数情况下建议使用ping命令,因为它将重置连接计时器并使它保持活动状态。

有关pinging the client using WebSockettimeouts的更多信息

我为Google工作,尽我所能-如果这不能解决您的问题,您必须联系GCP支持。

本文链接:https://www.f2er.com/3105788.html

大家都在问