WebSocket连接不稳定需设读写超时、手动处理Ping/Pong、配置Nginx超时广播性能瓶颈在于锁竞争应改用连接分组无锁chan队列。WebSocket 连接不稳定频繁断开怎么办Go 的 net/http 原生支持 WebSocket但直接用 gorilla/websocket 时很多同学发现连接几秒就 close 1006 或静默断开。根本原因不是协议问题而是没处理好心跳和读写超时。必须显式设置 conn.SetReadDeadline 和 conn.SetWriteDeadline否则空闲连接会被中间代理如 Nginx、Cloudflare主动切断服务端要主动发 Ping客户端回 Ponggorilla/websocket 默认不自动响应 Ping得手动调 conn.SetPingHandlerNginx 配置里必须加 proxy_read_timeout 60 和 proxy_send_timeout 60否则默认 60 秒无数据就断连示例关键片段conn.SetReadDeadline(time.Now().Add(30 * time.Second))conn.SetPingHandler(func(appData string) error { return conn.WriteMessage(websocket.PongMessage, nil)})消息广播性能卡在 1000 连接以下用 map 存所有 *websocket.Conn 然后遍历写看似简单实则在 500 并发连接时 CPU 暴涨、延迟飙升。瓶颈不在网络而在锁竞争和内存分配。避免全局 sync.RWMutex 保护连接 map —— 每次广播都要读锁 所有连接的 Write 调用都串行化改用「连接分组 无锁队列」每个用户连接绑定一个 chan []bytegoroutine 从 chan 读消息并写入 socket广播时只往多个 chan 发送不碰连接本身注意 conn.WriteMessage 是阻塞的如果某个客户端网络差会拖慢整个 goroutine建议加 select { case 超时控制离线消息怎么存又快又不丢用 Redis 存离线消息最常见但直接 LPUSH user:123 msg 会导致两个问题消息顺序错乱、大用户量时 LRANGE 拉取慢。 文心快码 文心快码Comate是百度推出的一款AI辅助编程工具