当 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-Q
和Send-Q
列来表示队列中的字节数。【参考方案2】:
通常,websocket 客户端响应不慢。 为什么你的慢,请检查 await 方法 不要将 await 方法放在 while True 循环
如果放await,响应时间也太长太慢。 你可以测试,我建议测试也删除 await 方法并编写示例代码,我会看到 websocket client 有多快。哈哈
【讨论】:
以上是关于当 websocket 客户端太慢时 websocket 将如何工作?的主要内容,如果未能解决你的问题,请参考以下文章
使用rabbitmq广播模式来处理集群下的websocket消息推送