谷歌浏览器中的WebSocket接收缓冲区

5
我有一个应用程序,在其中从浏览器(在我这里是Chrome)向服务器打开了一个websocket,然后我开始从服务器端向浏览器发送消息。我发现的问题是,当我从服务器快速地发送消息时,消息开始在浏览器端缓冲。这意味着浏览器“落后”,最终处理了由服务器长时间前发送的消息,这在我的应用程序中是不希望的。
我已经排除了以下可能导致缓冲的原因:
- 服务器。我可以完全关闭服务器进程,并且我看到我的javascript代码继续接收消息数分钟,因此缓冲不会发生在服务器进程内部。 - 网络。当在与我的Web浏览器相同的机器上运行服务器并且我发送的数据量远低于TCP连接到本地主机的带宽限制时,我可以复现相同的问题。
这只剩下浏览器。是否有任何方法可以(a)确定Chrome为我的websocket保留的缓冲区大小,或者(b)减小此缓冲区的大小并使Chrome丢弃帧?
1个回答

7
  • (a) Chrome每个WebSocket连接缓冲大约128KB的数据,缓冲区大小对应用程序不可见。
  • (b) Chrome不会有意丢失帧(这将违反标准)。

当JavaScript处理的内容很简单时,Chrome可以通过WebSocket每秒处理超过50MB的数据。因此,您正在处理的内容可能并不简单。您可以在onmessage处理程序中删除太旧的消息(但请记住,客户端上的时钟可能与服务器上的时钟不同步)。

如果浏览器的主线程总是忙碌的,即使删除消息也可能无法跟上。我建议使用Chrome Devtools中的“性能”选项卡来查看应用程序花费时间的情况。


有关如何做到这一点的任何建议?似乎消息时间戳与websocket接收消息的时间无关。 - yesennes
2
我会让服务器在每条消息中发送一个时间戳。然后,我会尝试使用第一条消息上的时间戳来确定服务器时钟和客户端时钟之间的偏移量。在onmessage处理程序中,我将比较消息上的时间戳与我估计的服务器时钟,并在超出某个阈值时忽略该消息。 - lunchrhyme

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接