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

How to check TCP buffer size in Spring Websocket(Jetty)?

以上link就是我要解决的问题。我的服务器将向客户端推送大量数据。所以可能是客户端消费太慢了。

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

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

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

Jetty websocket 受惠于 Java 的网络。

你想知道的是WebSocket写入导致TCP拥塞/背压的结果。

为此,请注意写入调用。

使用阻塞式 WebSocket,写入只是一件简单的事情,它不会 return 直到写入完成。如果它阻塞,那么写入可能是 TCP 拥塞,您应该停止写入任何其他内容。

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

不注意异步写入callbacks/futures导致消息排队(队列没有上限,会增长以适应所有可用内存)。

作为使用 websocket 的应用程序,当您检测到这种缓慢的写入情况时,您可以决定要做什么。

你关闭连接了吗?
你有留言吗?
您是否对消息进行排队?

如果你做队列消息,你有消息优先级或重要性吗?
如果未发送一定数量的优先消息,是否关闭连接?
当(如果?)客户端重新连接时,您是否保留这些优先消息以重新发送?
排队消息是否过期/超时?
删除 X 时间未发送的消息?

感谢@Joakim Erdfelt。

但是我发现如果客户端是Chrome,慢客户端不会触发回调。 服务器端抛出错误 "Connection reset by peers"。 我认为当客户端的 websocket 缓冲区已满时,套接字可能会被 Chrome 关闭。

我最终的解决方案是在应用层。

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