使用 xhr 轮询时如何解决 Chrome 的 6 连接限制

Posted

技术标签:

【中文标题】使用 xhr 轮询时如何解决 Chrome 的 6 连接限制【英文标题】:How to solve Chrome's 6 connection limit when using xhr polling 【发布时间】:2015-12-18 07:29:04 【问题描述】:

我最近发现 Chrome 似乎有 6 个连接限制 (Chrome hangs after certain amount of data transfered - waiting for available socket) 不幸的是,我在加载太多选项卡 (7) 后收到“等待可用套接字”消息,很难解决这个问题。

我知道它是 Chrome,因为另一个 Chrome 用户(又名另一个浏览器会话)可以同时在同一台计算机上完美加载网页(我的计算机上打开了多个 Chrome 用户)。所以无论如何它都不是服务器。

我相信这是因为,在 socket.io(我用于通知)中,我是 xhr-polling,这导致 Chrome 必须等到它可以从其中一个连接中获取套接字才能处理页面。

解决办法是什么?

我想到了几个解决方案:

缩小 xhr-polling 窗口,这会增加浏览器和 node.js 中的连接,但意味着页面不会停止。 使用网络套接字。我不确定 websockets 是否也不受这个问题的影响。 在未聚焦的选项卡上使连接处于非活动状态。虽然其他网站似乎不必这样做...... 使用某种连接共享。考虑到 Chrome 将 websocket 和 xhr 请求隔离到标签页,我确实很难理解它是如何工作的。

补充一点:我从一开始就没有使用 websockets 的原因是因为我使用了 cloudflare。但如果这是解决问题的方法,那么:就这样吧。

【问题讨论】:

使用真正的 webSocket,而不是 XHR 轮询。 webSocket 连接不计入到同一来源的 http 连接限制。 @jfriend00 啊哈,谢谢! 几篇参考文章:Max parallel http connections in a browser? and Maximum concurrent connections to the same domain for browsers and HTTP simultaneous connections per host limit… are per tab, browser instance or global?. @jfriend00 如果你把它作为答案并给出一些解释,我肯定会支持它。我想我将不得不使用 cloudflare 的解决方法,我希望用 xhr 解决它的想法已经分崩离析了 tbh 从我们的测试来看,websocket 也受到同样的限制。 【参考方案1】:

使用真正的 webSocket,而不是 XHR Polling。 webSocket 连接不计入到同一来源的 http 连接限制。

对于可以创建多少个 webSocket 连接有一个单独的全局限制,但这个数字很高(Firefox 中为 200 - 不确定 Chrome 中究竟是什么)。

以下是有关该主题的一些参考资料:

Max parallel http connections in a browser?

Maximum concurrent connections to the same domain for browsers

HTTP simultaneous connections per host limit… are per tab, browser instance or global?.

【讨论】:

最终决定这样做,只是在 cloudflare 之外创建了一个 SSL 域,并决定对它说地狱。我失去了一些 cloudflares 保护,但这个域只提供一件事 Cloudflare 现在有 websockets。你有没有尝试过切换到它? @Simon_Weaver 抱歉,刚刚注意到您的评论。我认为 WS 是针对他们的企业计划的,所以我还没有 适用于所有计划,但服务水平不同。我的计划是 20 美元,效果很好

以上是关于使用 xhr 轮询时如何解决 Chrome 的 6 连接限制的主要内容,如果未能解决你的问题,请参考以下文章

如何根据连接器名称获取 Kafka 源连接器架构

连接错误:io.socket.engineio.client.EngineIOException:xhr 轮询错误

如何使用 chrome-extension 收听 xhr 响应?

使用 Chrome + XHR 时未定义 PHP POST 变量

带有 XHR 的 Chrome 推送通知(使用没有 PHP 的 JavaScript)

在 Chrome 中的 XHR 中设置断点