hostc

2000 个模块的 Vite 页面,走隧道为什么打不开

生产环境的网站会把 JavaScript 打包成几个文件,开发服务不会。Vite 把每个模块单独提供,一个大型应用加载一个页面可能要发出两千个请求。走隧道时,每个请求都是同一条连接上的一个流。

问题出在哪

hostc 每条隧道同时最多 256 个流,用来限制服务端内存。浏览器在一条 HTTP/2 连接上最多同时发约 256 个请求,所以模块多的页面会正好占满上限。

开发服务还有一条做热更新的 WebSocket,页面开着就一直占着一个流,这样就超了一个。

我们用一个导入 2000 个模块、再开一个 WebSocket 的页面复现了问题:5 个请求收到 503 Tunnel busy。一个模块加载失败,导入它的代码也会失败,所以页面没能打开。

为什么不直接提高上限?

提高上限解决不了,同时开两个页面还是会超。而且每个流都可能在内存里占一个窗口的数据,上限是用来控制内存的。

改成排队

这种突发请求很快就结束,所以我们让新请求排队:256 个流都在用时,新请求等待空位。队列也要有限制:

  • 最多 1024 个请求排队,超过就返回 503。
  • 等待时间不超过请求原有的 2 分钟时限。
  • 访客关掉页面后,请求离开队列。
  • CLI 断开时,排队的请求立刻返回 502。请求被唤醒时也会再检查一次连接。

结果

同样的页面,2000 个模块加一个 WebSocket,所有请求都返回 200,页面正常打开。

一条命令拿到公网地址,免费,不用注册

npx hostc@latest 3000

更多文章