Chrome 中的 websocket 接收缓冲区

Ale*_*int 6 google-chrome websocket

我有一个应用程序,在其中我从浏览器(在我的例子中是 Chrome)打开一个 websocket 到服务器,然后我开始从服务器端向浏览器发送消息。我发现,当我从服务器发送消息太快时,消息开始在浏览器端缓冲。这意味着浏览器“落后”并最终处理服务器很久以前发送的消息,这在我的应用程序中是不可取的。

我已经排除了以下可能发生缓冲的候选者:

  • 服务器。我可以完全终止服务器进程,并且我看到我的 javascript 代码继续接收消息几分钟,因此服务器进程内部不会发生缓冲。

  • 网络。当在与 Web 浏览器相同的计算机上运行服务器时,我可以重现相同的问题,并且我发送的数据量远远低于与本地主机的 TCP 连接的带宽限制。

这就离开了浏览器。有什么方法可以(a)确定 chrome 为我的 websocket 维护的缓冲区大小,或者(b)减小该缓冲区的大小并导致 chrome 丢帧?

lun*_*yme 7

  1. (a) Chrome 每个 WebSocket 连接缓冲大约 128KB。缓冲数据量对应用程序不可见。
  2. (b) Chrome 永远不会故意丢帧(这会违反标准)。

当 Javascript 完成的处理很简单时,Chrome 可以通过 WebSocket 每秒处理超过 50 MB。所以听起来你正在做的处理并不简单。您可以在 onmessage 处理程序中删除太旧的消息(但请记住,客户端上的时钟可能与服务器上的时钟不同步)。

如果浏览器的主线程始终繁忙,即使丢弃消息也可能不足以跟上。我推荐 Chrome Devtools 中的“性能”选项卡,这是查看应用程序将时间花在哪里的好方法。

  • 我会让服务器在每条消息中发送一个时间戳。然后我会尝试使用第一条消息上的时间戳来确定服务器时钟和客户端时钟之间的偏移。在 onmessage 处理程序中,我会将消息上的时间戳与我对服务器时钟的估计进行比较,如果超出某个阈值则忽略该消息。 (2认同)