Golang WebSocket广播需安全维护连接集合并异步分发消息:用sync.RWMutex保护clients map,快照连接切片广播;通过broadcast channel解耦收发,设写 deadline、recover异常、启心跳检测失效连接。
在Golang中实现WebSocket消息广播,核心是**安全维护在线连接集合 + 异步分发消息**。不依赖第三方服务,用标准库配合 gorilla/websocket 就能稳定支撑百至千级并发。
所有活跃连接必须集中存储,并确保多协程读写不冲突:
clients map[*websocket.Conn]bool 存储当前连接sync.RWMutex 包裹增删操作(如新连接加入、断开时删除)clients[conn] = true,并在 defer 中清理RLock() 快照一份连接切片,防止遍历时被修改不让读消息的协程直接遍历连接,否则一个慢连接会拖垮所有人:
broadcast chan []byte 作为消息中转站for msg := range broadcast { ... }
conn.WriteMessage(websocket.TextMessage, msg)
conn.SetWriteDeadline(time.Now().Add(10 * time.Second)),防阻塞客户端断网、关页、超时都是常态,不能靠等待 Close 通知:
WriteMessage 外加 recover(),捕获 panic(如连接已关闭)websocket.ErrCloseSent 或 io.EOF,是则立即 conn.Close() 并从 clients 中删除ping,客户端需回 pong;超时未响应则主动断开conn.SetReadDeadline 配合 conn.ReadMessage,超时即视为离线浏览器端无需复杂逻辑,原生 WebSocket API 足够:
const ws = new WebSocket("ws://localhost:8080/ws")
ws.send(JSON.stringify({type:"msg", content:"hello"}))
ws.onmessage = e => con
sole.log("收到:", JSON.parse(e.data))
onclose,延迟 1–3 秒后尝试重建连接