gpt4 book ai didi

python - 在 WebSocket 连接上重新连接用户

转载 作者:行者123 更新时间:2023-11-28 16:30:32 26 4
gpt4 key购买 nike

我们有一个平台(应用程序 + 网络应用程序),用户可以在其中通过 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()。因此,我们决定用新连接替换旧连接。

我们目前面临的问题是多个浏览器窗口上的客户端 - 客户端尝试重新连接并且标签/窗口进入某种重新连接战斗。一个连接和断开另一个,另一个重新连接和断开第一个。我们在我们的客户端(应用程序和 Web)中实现了自动重新连接,以便它们在(无论出于何种原因,通常是网络状况)连接断开时自动重新连接。

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

问题:

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

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

最佳答案

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

connections = {
'1': {
'iphone': ws_connection1,
'pc': ws_connection2
},
'2': {
'ipad': ws_connection3
}
}

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

关于python - 在 WebSocket 连接上重新连接用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32437912/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com