在WebSocket连接上重新连接用户

时间:2015-09-07 11:45:04

标签: python architecture websocket server tornado

我们有一个平台(app + web app),用户通过WebSocket连接连接到服务器。

出于体系结构设计和安全原因,我们希望限制每个用户使用不超过1个并发连接。

我们使用python的tornado作为websocket处理程序并维护连接用户的全局列表。

这就是我们的open()函数的样子:

def open():
    """connections {user_id: ws_handler}
    """
    global connections
    user_id = self.get_argument("user_id", None)
    if user_id and user_id not in connections.keys():
         connections[user_id] = self 
         # proceed
    else:
         # replace the old connection
         connections[user_id].close()
         connections[user_id] = self

最初,我们会拒绝给定用户的第二个传入连接。移动设备丢失网络连接的问题使我们改变了我们的解决方案 - 在这种情况下,没有为WebSocket连接启动.close()。因此,我们决定用新的连接替换旧的连接。

我们目前面临的问题是客户端在多个浏览器窗口上 - 客户端尝试重新连接,并且选项卡/窗口进入重新连接战斗。一个连接和断开另一个,另一个重新连接并断开第一个。我们在客户端(app和web)中实现了自动重新连接,以便在(无论出于何种原因,通常是网络条件)连接被丢弃时自动重新连接。

我们尝试使用指数后退,但这似乎不是一个令人满意的解决方案。

问题(S)

有没有人处理过类似的问题?

是否有共同的设计模式来解决这个问题?

2 个答案:

答案 0 :(得分:2)

如何使用user_id + device_key / cookie作为连接密钥?例如:

414041493

如果这是来自新设备的请求,如果至少连接了另一台设备,则必须拒绝它,如果它是同一设备 - 重新连接。

答案 1 :(得分:1)

谢谢,我们最终断开了传入新连接上的旧连接(此处的优先级是让用户进行全新连接),并且有一个转折:在关闭之前,我们推送 do_not_reconnect 消息因此,自动重新连接不会启动。用户必须刷新页面/应用程序以重新连接断开连接的连接 - 这样就不会观察到乒乓行为。