如何在SpringWebsocket(Jetty)中检查TCP缓冲区大小



当websocket客户端速度太慢时,websocket将如何工作?

上面的链接就是我想要解决的问题。我的服务器会向客户端推送大量数据。因此,客户端可能消耗太慢。

我想通过检查TCP缓冲区大小来检测springboot应用程序中的慢速客户端。但我不知道如何在Spring Websocket(Jetty 9.2.x(中检查大小。在Jetty Websocket源代码中找不到任何与TCP缓冲区相关的接口。

如果我做不到,有没有其他方法可以检测慢速客户端?

抱歉,您无法访问TCP缓冲区。

Jetty websocket得益于Java的网络。

您想知道的是WebSocket写入会导致TCP拥塞/背压。

要做到这一点,你要注意写电话。

阻塞WebSocket只是一个简单的写操作,在写操作完成之前它不会返回。如果它阻塞了,那么写入很可能是TCP拥塞,您应该停止写入其他内容。

使用异步WebSocket写入,您需要注意写入的结果(来自Future或Callback(,并且在确认当前消息已成功写入之前不会写入下一条消息。

如果不注意异步写回调/期货,就会导致消息排队(队列没有上限,并且会增长到适合所有可用内存(。

作为一个使用websocket的应用程序,当您检测到这种缓慢的写入场景时,您应该决定该怎么做。

你关闭连接了吗
你投递了一些信息吗
您对邮件进行排队吗?

如果对消息进行排队,那么消息的优先级或重要性是多少
如果尚未发送一定数量的优先级邮件,是否关闭连接
当(如果?(客户端重新连接时,您是否保留这些优先级消息以重新发送
排队的消息是否有过期/超时时间
是否删除X时间内未发送的邮件?

感谢@Joakim Erdfelt。

但我发现,如果客户端是Chrome,那么速度较慢的客户端不会触发回调。服务器端抛出错误"对等方重置连接"。我认为当客户端的websocket缓冲区已满时,Chrome可能会关闭套接字。

我的最终解决方案是在应用程序级别。

用户应该每隔一段时间提交消息偏移量,服务器端将客户端提交的偏移量与服务器端最新的消息偏移量进行比较。通过这两个偏移之间的间隙来检测慢速客户端。

最新更新