WebSocket 性能怎么优化?连接/传输/服务端三层优化策略
WebSocket性能优化要从连接、传输、服务端三个层面入手。连接层:用单例模式复用连接,避免重复建连;连接池管理多服务端场景,按负载分配。传输层:消息压缩(pako或服务端gzip)减少带宽;批量发送合并高频小消息;用二进制格式替代JSON减少序列化开销;心跳间隔根据网络环境调优,移动端可适当缩短。服务端:ws库配置maxPayload防大包攻击,合理设置heartbeat超时;客户端设置binaryType为arraybuffer避免Blob转换损耗。负载均衡需用sticky session保证同一客户端请求落到同一服务节点。
追问
连接复用和连接池有什么区别?
连接复用是单个客户端对同一服务端只维护一条连接,通过单例模式实现,避免重复握手开销。连接池则是预先创建多条连接供不同业务模块使用,适用于需要连接多个不同服务端的场景。实际开发中,连接复用更常见,连接池多用于微服务网关层。
什么时候该用二进制而不是JSON?
高频传输、数据量大、结构固定的场景优先二进制。比如实时坐标、传感器数据,用ArrayBuffer或protobuf比JSON体积小30%-60%,解析也更快。如果是低频控制指令,JSON可读性好,开发调试方便,没必要换。
消息批量发送怎么实现?
设一个缓冲区,短时间内的消息先攒起来,定时或达到阈值再一次性发送。比如50ms内的消息合并成一条发送。注意设置最大延迟,避免消息等太久。断线重连时缓冲区的消息要能补发。
心跳间隔怎么定?
局域网5-10秒足够,公网移动端建议15-30秒。间隔太短浪费流量和电量,太长又不能及时检测断连。关键原则:心跳超时时间至少是间隔的3倍,给网络抖动留余量。NAT超时一般2-5分钟,心跳间隔必须短于这个值。
sticky session有什么问题?
单点故障——某台服务端挂了,它上面的连接全部断开,不能自动漂移到其他节点。解决思路:服务端用Redis Pub/Sub同步状态,客户端断连后重试可落到新节点并恢复上下文。sticky session是妥协方案,真正想高可用得做有状态迁移。