如何在Spring Websocket(Jetty)中检查TCP缓冲区大小?

问题描述 投票:0回答:2

How will websocket works when websocket client is too slow?

以上链接是我要解决的问题。我的服务器将大量数据推送到客户端。因此,客户端消耗的速度可能太慢。

通过检查TCP缓冲区大小,在我的springboot应用程序中

我想检测慢客户端。但是我不知道如何在Spring Websocket(Jetty 9.2.x)中检查大小。我在码头网络套接字源代码中找不到与TCP缓冲区相关的任何接口。

如果不能,是否还有其他方法可以检测到速度较慢的客户端?

websocket jetty spring-websocket jetty-9
2个回答
0
投票

对不起,您无法访问TCP缓冲区。

Jetty websocket依赖于Java的网络。

您想知道的是WebSocket在TCP拥塞/背压中的写入结果。

为此,您要注意写调用。

通过阻塞WebSocket,这只是一个简单的写操作,在写操作完成之前它不会返回。如果阻止,则写入可能会发生TCP拥塞,您应该退出写入其他任何内容。

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

未能注意异步写入回调/功能会导致消息排队(队列没有上限,并且将增长以容纳所有可用内存)。

作为使用websocket的应用程序,当您检测到这种慢速写入情况时,由您决定如何处理。

您是否关闭连接?你放一些消息吗?您是否在所有消息中排队?

如果您将消息放入队列中,您是否具有消息优先级或重要性?如果尚未发送一定数量的优先级消息,那么您是否关闭连接?您是否保留客户端重新连接时重新发送的那些优先级消息?排队的消息是否有过期/超时?删除X时间内未发送的消息?


0
投票

感谢@Joakim Erdfelt。

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.