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

Posted

技术标签:

【中文标题】当 websocket 客户端太慢时 websocket 将如何工作?【英文标题】:How will websocket works when websocket client is too slow? 【发布时间】:2019-11-05 07:34:02 【问题描述】:

我有连接到远程服务器的 websocket 客户端。 服务器每秒向我发送大量数据(每秒约 10 000 条短消息)。 我如何理解我的 websocket 客户端将有时间读取所有传入数据? 或者服务器可以理解 ws-client 不会读取所有数据并且会断开连接? ws-client太慢时websocket协议如何工作?

【问题讨论】:

【参考方案1】:

底层的websocket传输是TCP,这个协调不同速率发送和接收的话题称为流控制(它是TCP层的一个特性),这个具体问题被称为“慢消费者”(并且很常见)当通过 TCP 发送大量数据时,例如金融市场数据)。

TCP 层允许在通信链路中的某些点进行缓冲,因此如果阅读器无法跟上服务器正在发送的字节,则可以将字节临时存储在这些缓冲区中(直到客户端能够处理它们)。读取端和发送端都可以有缓冲区,通常与套接字相关联。然而,这些通常是固定大小的。一旦这些缓冲区已满,服务器将在下一次尝试发送一些字节时面临选择:要么断开连接,要么等待(“阻塞”)直到缓冲区中有空间发送更多字节。

所以确实是服务器决定,我猜它很可能会断开连接(否则风险是由于套接字缓冲区已满,服务器上会消耗越来越多的内存)。

【讨论】:

有没有办法从服务器或客户端检查这些缓冲区? 如果你想知道发送和接收队列的大小,在linux上使用可以使用ss命令,例如ss -tm有一个Recv-QSend-Q列来表示队列中的字节数。【参考方案2】:

通常,websocket 客户端响应慢。 为什么你的慢,请检查 await 方法 不要将 await 方法放在 while True 循环

如果放await,响应时间也太长太慢。 你可以测试,我建议测试也删除 await 方法并编写示例代码,我会看到 websocket client 有多快。哈哈

【讨论】:

以上是关于当 websocket 客户端太慢时 websocket 将如何工作?的主要内容,如果未能解决你的问题,请参考以下文章

使用WebSocket实现聊天室

使用rabbitmq广播模式来处理集群下的websocket消息推送

webSocket 简单介绍

如何编写一个 websocket 客户端

带有异步计时器的 Python 异步 websocket 客户端

Python在tkinter中发送websocket消息