管理 WebSocket 连接需要考虑连接生命周期、资源优化、错误处理等多个方面。以下是最佳实践:
连接管理策略
1. 连接建立与初始化
客户端侧:
javascriptconst ws = new WebSocket('wss://example.com/socket'); ws.onopen = () => { console.log('WebSocket connected'); // 发送初始化消息 ws.send(JSON.stringify({ type: 'init', data: userData })); }; ws.onerror = (error) => { console.error('WebSocket error:', error); // 实现错误处理逻辑 };
服务器侧:
- 验证连接请求的合法性
- 设置合理的连接超时时间
- 记录连接元数据(用户ID、设备信息等)
2. 心跳机制
实现心跳保持连接活跃:
javascript// 客户端心跳 let heartbeatInterval; function startHeartbeat() { heartbeatInterval = setInterval(() => { if (ws.readyState === WebSocket.OPEN) { ws.send(JSON.stringify({ type: 'ping' })); } }, 30000); // 每30秒发送一次 } ws.onmessage = (event) => { const data = JSON.parse(event.data); if (data.type === 'pong') { // 收到服务器响应,连接正常 } };
服务器心跳:
- 监控客户端活跃状态
- 超时未响应则关闭连接
- 减少无效连接占用资源
3. 连接重连策略
指数退避重连算法:
javascriptfunction reconnect() { let retryCount = 0; const maxRetries = 5; const baseDelay = 1000; // 1秒 function attemptReconnect() { if (retryCount >= maxRetries) { console.error('Max reconnection attempts reached'); return; } const delay = Math.min(baseDelay * Math.pow(2, retryCount), 30000); setTimeout(() => { try { ws = new WebSocket('wss://example.com/socket'); retryCount++; } catch (error) { console.error('Reconnection failed:', error); attemptReconnect(); } }, delay); } attemptReconnect(); }
4. 连接池管理
服务器端连接池优化:
- 使用内存数据库(如 Redis)存储连接映射
- 实现连接分组和路由
- 设置最大连接数限制
- 实现连接负载均衡
javascript// 连接池示例 const connectionPool = new Map(); function addConnection(userId, ws) { connectionPool.set(userId, ws); } function getConnection(userId) { return connectionPool.get(userId); } function removeConnection(userId) { connectionPool.delete(userId); }
5. 资源清理
优雅关闭连接:
javascriptfunction closeConnection() { if (ws && ws.readyState === WebSocket.OPEN) { // 发送关闭帧 ws.send(JSON.stringify({ type: 'close', reason: 'user_logout' })); // 等待服务器确认 setTimeout(() => { ws.close(1000, 'Normal closure'); }, 1000); } // 清理定时器 if (heartbeatInterval) { clearInterval(heartbeatInterval); } }
6. 监控与日志
关键监控指标:
- 连接数量和趋势
- 消息发送/接收速率
- 连接失败率
- 平均连接时长
- 内存和 CPU 使用率
日志记录:
- 连接建立和断开事件
- 消息传输统计
- 错误和异常情况
性能优化建议
- 消息批处理:将多个小消息合并发送
- 压缩传输:启用 permessage-deflate 扩展
- 二进制数据:使用二进制格式传输大数据
- 连接复用:避免频繁创建和销毁连接
- 限流控制:防止消息洪泛