通过WebSocket连接重新连接用户

通过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消息,以便自动重新连接用户不得不重新刷新页面/应用程序以重新连接断开的连接 - 这样就不会出现乒乓行为。