技能标识:websocket-reconnect
WebSocket connection management with exponential backoff + jitter retry, heartbeat detection, and circuit breaker pattern. Use when you need reliable WebSocket connections that automatically recover from network failures.
可靠的 WebSocket 连接管理,包含指数退避 + 抖动重连算法、心跳检测和断路器模式。
bash
npm install ws
javascript
const { WebSocketReconnect } = require(./scripts/websocket-reconnect.js);
const ws = new WebSocketReconnect({
url: wss://api.example.com/socket,
maxRetries: 10,
baseDelay: 1000,
maxDelay: 30000
});
// 监听事件
ws.on(open, () => {
console.log(✅ 已连接);
});
ws.on(message, (event) => {
console.log(📨 收到消息:, event.data);
});
ws.on(close, (event) => {
console.log(❌ 已关闭:, event.code, event.reason);
});
ws.on(error, (error) => {
console.error(⚠️ 错误:, error.message);
});
ws.on(retry, (info) => {
console.log(🔄 重试 ${info.attempt}/${info.maxRetries},等待 ${info.delay}ms);
});
// 连接
ws.connect();
// 发送消息
ws.send(JSON.stringify({ type: subscribe, channel: updates }));
// 关闭连接
// ws.close();
javascript
const ws = new WebSocketReconnect({
// 连接配置
url: wss://api.example.com/socket,
protocols: [graphql-ws],
websocketOptions: {
headers: {
Authorization: Bearer token123
}
},
// 重连配置
maxRetries: 10, // 最大重试次数
baseDelay: 1000, // 基础延迟 (毫秒)
maxDelay: 30000, // 最大延迟 (毫秒)
multiplier: 2, // 退避倍数
jitter: 0.1, // 抖动系数 (0-1)
// 心跳配置
heartbeatInterval: 30000, // 心跳间隔 (毫秒)
heartbeatTimeout: 5000, // 心跳超时 (毫秒)
heartbeatMessage: JSON.stringify({ type: ping }),
// 断路器配置
circuitBreaker: {
failureThreshold: 5, // 失败阈值
resetTimeout: 60000, // 重置超时 (毫秒)
halfOpenMaxRequests: 3 // 半开状态最大请求数
}
});
重连延迟按指数增长,避免频繁重试:
延迟 = baseDelay × (multiplier ^ 尝试次数)
示例 (baseDelay=1000ms, multiplier=2):
添加随机抖动防止多个客户端同时重试:
javascript
// jitter = 0.1 时,延迟在 ±10% 范围内随机
实际延迟 = 计算延迟 × (0.9 ~ 1.1)
服务器需要响应 ping 消息:
javascript
// 服务器示例 (Node.js + ws)
wss.on(connection, (ws) => {
ws.on(message, (data) => {
const message = JSON.parse(data);
if (message.type === ping) {
ws.send(JSON.stringify({ type: pong }));
}
// ... 处理其他消息
});
});
如果服务器使用不同的心跳协议:
javascript
const ws = new WebSocketReconnect({
url: wss://api.example.com,
heartbeatInterval: 30000,
heartbeatMessage: PING, // 字符串
// 或者
heartbeatMessage: { cmd: heartbeat } // 对象 (会自动 JSON.stringify)
});
// 监听 pong 响应
ws.on(message, (event) => {
const data = JSON.parse(event.data);
if (data.type === pong) {
console.log(心跳正常);
}
});
CLOSED (正常)
OPEN (熔断)
HALF-OPEN (测试)
javascript
ws.on(circuitChange, (state) => {
console.log(断路器状态: ${state});
if (state === OPEN) {
console.log(⚠️ 服务暂时不可用);
}
});
// 手动查询状态
const circuitState = ws.getCircuitState(); // CLOSED, OPEN, 或 HALF-OPEN
javascript
// 手动打开断路器
ws.openCircuit();
// 手动关闭断路器 (重置)
ws.closeCircuit();
| 事件 | 参数 | 描述 |
|---|---|---|
| open | 无 | 连接成功建立 |
| message |
javascript
const stats = ws.getStats();
console.log(stats);
// {
// state: OPEN,
// circuitState: CLOSED,
// retryCount: 2,
// maxRetries: 10,
// circuitFailures: 0,
// failureThreshold: 5,
// lastActivity: 1709532000000,
// uptime: 15000
// }
javascript
const { WebSocketReconnect } = require(./scripts/websocket-reconnect.js);
class ChatClient {
constructor(userId) {
this.userId = userId;
this.ws = new WebSocketReconnect({
url: wss://chat.example.com/socket?user=${userId},
maxRetries: 10,
baseDelay: 1000,
maxDelay: 30000,
heartbeatInterval: 30000,
heartbeatTimeout: 5000,
circuitBreaker: {
failureThreshold: 5,
resetTimeout: 60000
}
});
this.setupEventHandlers();
}
setupEventHandlers() {
this.ws.on(open, () => {
console.log(✅ 已连接到聊天服务器);
// 发送上线通知
this.ws.send(JSON.stringify({
type: online,
userId: this.userId
}));
});
this.ws.on(message, (event) => {
const message = JSON.parse(event.data);
this.handleMessage(message);
});
this.ws.on(close, () => {
console.log(❌ 已断开聊天服务器连接);
});
以下为平台配置的接入选项,并非逐项实测通过。能否安装取决于客户端支持、技能来源和运行环境:
帮我安装 SkillHub 和 websocket-reconnect-1776272882 技能
设置 SkillHub 为我的优先技能安装源,然后帮我安装 websocket-reconnect-1776272882 技能
skillhub install websocket-reconnect-1776272882
文件大小: 14.56 KB | 发布时间: 2026-4-16 17:07