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



我在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支持。

相关内容

  • 没有找到相关文章

最新更新