通过WebSocket连接重新连接用户
问题描述:
我们有一个平台(app + web应用程序),用户通过WebSocket连接连接到服务器。通过WebSocket连接重新连接用户
由于架构设计和安全原因,我们希望限制每个用户使用不超过1个并发连接。
我们使用python的龙卷风作为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()
。所以,我们决定用新的连接替换旧的连接。
我们目前面临的问题是客户端在多个浏览器窗口中 - 客户端尝试重新连接,并且选项卡/窗口进入某种重新连接的战斗。一个连接并断开另一个,另一个重新连接并断开第一个连接。我们在我们的客户端(包括应用程序和网络)中实现了自动重新连接,以便在无论何种原因(通常是网络条件)连接断开时自动重新连接。
我们尝试玩指数后退,但这似乎不是一个令人满意的解决方案。
问题(S):
有没有谁处理了类似的问题,任何人吗?
是否有共同的设计模式来解决这个问题?
答
如何使用user_id + device_key/cookie作为连接密钥?例如:
connections = {
'1': {
'iphone': ws_connection1,
'pc': ws_connection2
},
'2': {
'ipad': ws_connection3
}
}
如果这是来自新设备的要求,你必须拒绝它,如果至少一个其他设备连接,如果是相同的设备 - 重新连接。
答
谢谢,我们结束了(这里的优先级是有一个新的连接上的用户),断开对传入的新一个旧的连接,一拧:关闭之前,我们推do_not_reconnect消息,以便自动重新连接用户不得不重新刷新页面/应用程序以重新连接断开的连接 - 这样就不会出现乒乓行为。