当 WebSocket 客户端过慢时,WebSocket 如何工作?

8
我有一个连接到远程服务器的 WebSocket 客户端。 服务器每秒发送给我大量数据(约 10,000 条短消息每秒)。 我如何知道我的 WebSocket 客户端是否有足够的时间来读取所有传入的数据? 或者,服务器能否知道 ws-client 没有读取所有数据并且会断开连接? 当 WebSocket 客户端过慢时,WebSocket 协议将如何运行?
2个回答

8
底层websocket传输使用TCP,协调发送和接收不同速率的问题称为流量控制(这是TCP层的一个特性),而这个具体的问题被称为“慢消费者”(当通过TCP发送非常大量的数据,例如金融市场数据时,很常见)。
TCP层允许在通信链的某些点上进行缓冲,因此如果读取器无法跟上服务器发送的字节,则字节可以暂时存储在这些缓冲区中(直到客户端能够处理它们)。读取器端和发送器端都可以拥有缓冲区,通常与套接字相关联。但是这些缓冲区通常是固定大小的。一旦这些缓冲区已满,服务器将面临一个选择:要么断开连接,要么等待(“阻塞”),直到缓冲区有足够的空间发送更多字节。
所以这实际上是一个服务器的决定,我猜最有可能的是它会断开连接(否则风险是由于完整的套接字缓冲区而在服务器上消耗越来越多的内存)。

有没有办法从服务器或客户端检查这些缓冲区? - ianstarz
如果您想了解发送和接收队列的大小,在Linux上可以使用ss命令,例如,ss -tm具有Recv-QSend-Q列,用于指示队列中的字节数。 - Darren Smith

2

enter image description here

通常情况下,WebSocket客户端的响应不会很慢。如果您的响应很慢,请检查await方法。不要将await方法放在while True循环中。
如果您使用await,响应时间也会太长和太慢。您可以进行测试,我建议您还可以测试删除await方法并编写示例代码,我会看到WebSocket客户端的速度。哈哈

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