我有一个网页,它与服务器建立了websocket连接。我必须确保该网站的用户只能建立一个连接,因此打开一个新选项卡并导航到同一页面将关闭以前的连接。
我想维护一个以会话id为密钥的地图;然而,由于随着越来越多的客户端连接,映射的大小必须不断调整,我担心它会出现性能问题,而且由于它是并发访问的,您可能不得不进行某种锁定。
对于确保每个客户端都有唯一连接的高效性能方法,有什么想法吗?很乐意听取建议,谢谢。
我不会关心问题中概述的解决方案的性能。如果您想关闭以前的连接,就无法维护服务器端映射。假设只有一台服务器,并且您使用的是Gorilla websocket包,那么以下代码应该可以完成任务:
var (
mu sync.Mutex
conns map[string]*websocket.Conn
)
func addConn(sessionID string, conn *websocket.Conn) {
mu.Lock()
prev := conns[sessionID]
conns[sessionID] = conn
mu.Unlock()
if prev != nil {
// Close will stop concurrent reads and writes.
prev.Close()
}
}
func removeConn(sessionID string, conn *websocket.Conn) {
mu.Lock()
// We don't simply delete(conns, session) to avoid race on cleanup.
if conns[sessionID] == conn {
delete(conns, sessionID)
}
mu.Unlock()
}
与接受传入网络连接、完成websocket握手以及场景中发生的其他一切的成本相比,更新此映射的成本很小。