客户端断开连接时WebSocket消息排队

时间:2013-07-29 21:22:00

标签: python websocket tornado

我们有一个使用tornado编写的服务器,它通过websockets向客户端发送异步消息。在这种情况下,在Mac上的Chrome中运行的javascript应用。当客户端被强行断开连接时,在这种情况下,通过让客户端进入休眠状态,服务器仍然认为它正在向客户端发送消息。此外,当客户端从睡眠中唤醒时,消息将以突发方式传递。

这些消息排队/缓冲的机制是什么?谁是负责的人?为什么他们仍然交付?谁重新连接套接字?我的直觉是,即使websockets不是像HTTP那样的请求/响应,它们仍然需要ACK数据包,因为它们是基于TCP构建的。这样做是为了使协议对移动时代的临时性下降更加健壮吗?

1 个答案:

答案 0 :(得分:0)

浏览器可以在单独的线程中处理websocket客户端消息,该线程不会被睡眠阻止。

即使自定义应用程序的某个线程未处于活动状态,当您强制它进入休眠状态时(如sleep(100)),在这种情况下也不会关闭TCP连接。套接字句柄仍然由OS内核管理,TCP服务器仍然发送消息,直到它到达TCP客户端的接收窗口溢出。即使在此之后,服务器端的应用程序仍然可以成功提交新消息,这些消息在服务器端的TCP级别上缓冲,直到TCP输出缓冲区溢出。当传出缓冲区已满时,应用程序应该在发送请求中获得错误代码,例如“没有更多空间”。我没有试过自己,但它的行为应该是这样的。

尝试关闭客户端(终止进程),您将看到完全不同的图片 - 服务器会发现断开连接。

在高度可靠的情况下,服务器端都难以处理断开和溢出这两种情况。断开连接的情况可以转换为溢出情况(websocket服务器可以在重新连接客户端时将消息缓冲到用户空间的某些限制)。但是,没有简单的方法来处理发送缓冲区限制的可靠溢出。我只看到一个解决方案 - 将溢出错误传播回事件的发起者,这会引发消息,该消息因溢出而被丢弃。