概述WebSocket在网络抖动或后端故障时需要可靠的重连与背压管理。通过心跳保持连接活性,指数退避控制重连节奏,基于缓冲量做发送节流,可提升稳定性与用户体验。关键实践与参数心跳:每 `30s` 发送 `ping` 文本帧,超时无 `pong` 则重连退避:初始 `500ms`,倍率 `1.6`,上限 `10s`背压:`bufferedAmount>1MB` 暂停发送并排队可靠性:在恢复后批量发送排队消息并限速示例/配置/实现class WSClient {
constructor(url) { this.url = url; this.ws = null; this.retry = 500; this.queue = []; this.timer = null; }
connect() {
this.ws = new WebSocket(this.url)
this.ws.onopen = () => { this.retry = 500; this.startHeartbeat() }
this.ws.onmessage = (e) => { if (e.data === 'pong') return; /* handle */ }
this.ws.onclose = () => { this.stopHeartbeat(); this.scheduleReconnect() }
this.ws.onerror = () => { this.ws.close() }
}
startHeartbeat() { this.timer = setInterval(() => { this.send('ping') }, 30000) }
stopHeartbeat() { if (this.timer) clearInterval(this.timer) }
scheduleReconnect() { setTimeout(() => { this.retry = Math.min(this.retry * 1.6, 10000); this.connect() }, this.retry) }
send(data) {
if (!this.ws || this.ws.readyState !== WebSocket.OPEN) { this.queue.push(data); return }
if (this.ws.bufferedAmount > 1_000_000) { this.queue.push(data); return }
this.ws.send(data)
}
}
// Node.js 服务端 (ws)
const WebSocket = require('ws')
const wss = new WebSocket.Server({ port: 8080 })
wss.on('connection', (ws) => {
ws.on('message', (m) => { if (m.toString() === 'ping') ws.send('pong') })
})
验证断网与重连:断开网络,观察指数退避重连节奏;恢复后队列消息按限速发送背压:模拟后端限速,`bufferedAmount` 超阈值时暂停发送并排队心跳:在正常连接下周期性 `ping/pong` 往返指标:记录重连次数、平均延迟与丢包率,评估稳定性注意事项浏览器不支持原生 `ping` 帧,需用文本帧模拟并在服务端应答 `pong`背压阈值需结合业务与网络环境调优需处理页面切换与后台状态对心跳与重连的影响与后端限速与断路策略协同,避免雪崩

发表评论 取消回复