我们有一个平台(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):
有没有人处理过类似的问题?
是否有共同的设计模式来解决这个问题?
答案 0 :(得分:2)
如何使用user_id + device_key / cookie作为连接密钥?例如:
414041493
如果这是来自新设备的请求,如果至少连接了另一台设备,则必须拒绝它,如果它是同一设备 - 重新连接。
答案 1 :(得分:1)
谢谢,我们最终断开了传入新连接上的旧连接(此处的优先级是让用户进行全新连接),并且有一个转折:在关闭之前,我们推送 do_not_reconnect 消息因此,自动重新连接不会启动。用户必须刷新页面/应用程序以重新连接断开连接的连接 - 这样就不会观察到乒乓行为。