自动重连机制怎么写 实用操作步骤与避坑指南

自动重连机制怎么写

网络连接不稳定时,程序断开后手动重连太麻烦。比如你写的爬虫跑着跑着突然断网,或者聊天客户端掉线没人通知,用户体验直接打折扣。这时候就得靠自动重连机制来兜底。

实现这个功能不难,核心思路就是:检测连接状态,一旦发现断开,就尝试重新建立连接。关键在于怎么判断“断了”,以及重试的策略怎么定。

判断连接是否中断

常见的做法是通过心跳包。客户端定时发个简单请求,比如 ping,服务端回个 pong。如果连续几次没收到回应,基本就能判定连接断了。

也可以监听底层连接事件,比如 WebSocket 的 onclose 事件,或者 TCP 连接的 EOF 错误。一触发就启动重连流程。

写一个简单的重连逻辑

以 JavaScript 的 WebSocket 为例,可以这样封装:

function createReconnectWebSocket(url) {
let socket = null;
let isConnected = false;
let retryDelay = 1000; // 初始重试间隔
let maxRetryDelay = 30000; // 最大重试间隔

function connect() {
socket = new WebSocket(url);

socket.onopen = () => {
isConnected = true;
retryDelay = 1000; // 连接成功,重置重试时间
console.log('连接已建立');
};

socket.onclose = () => {
isConnected = false;
console.log('连接断开,尝试重连...');
setTimeout(connect, retryDelay);
// 指数退避,避免频繁请求
retryDelay = Math.min(retryDelay * 2, maxRetryDelay);
};

socket.onerror = (err) => {
console.error('连接出错', err);
};
}

connect();

return {
send(data) {
if (isConnected) {
socket.send(data);
} else {
console.warn('连接未建立,无法发送数据');
}
},
close() {
socket.close();
}
};
}

这段代码里用了指数退避策略,第一次等 1 秒,第二次 2 秒,然后 4、8、16……直到最大值。这样既不会在服务不可用时疯狂刷请求,也能在恢复后快速接上。

加上重连次数限制

有时候网络彻底挂了,一直重连也没意义。可以加个最大重试次数,比如 10 次之后就弹个提示,让用户检查网络。

let retryCount = 0;
const maxRetries = 10;

socket.onclose = () => {
if (retryCount >= maxRetries) {
alert('网络异常,请检查连接');
return;
}
retryCount++;
setTimeout(connect, retryDelay);
retryDelay = Math.min(retryDelay * 2, maxRetryDelay);
};

实际项目中还可以把重连逻辑抽成通用模块,供多个连接复用。比如 MQTT 客户端、数据库连接池、API 请求器,都能套这套模式。

别忘了加上日志,记录每次重连的时间和原因,排查问题时能省不少事。