面试题答案
一键面试心跳包发送频率的确定
- 考虑网络状况:如果是在稳定的局域网环境中,心跳包发送频率可以相对较低,例如每 30 秒一次。因为局域网网络质量好,较少出现网络波动导致连接中断的情况。而在广域网或网络状况不稳定的环境下,如移动网络,可能需要提高频率,比如每 10 秒发送一次,以便更及时地检测连接状态。
- 业务需求:如果业务对实时性要求极高,即使短暂的连接中断都不允许,那么心跳频率应适当提高,确保能快速发现并恢复连接。相反,如果业务允许一定时间内的连接中断,频率可以适当降低,减少网络开销。
心跳处理函数的逻辑
- 发送心跳包:
const net = require('net'); const client = new net.Socket(); const HEARTBEAT_INTERVAL = 10000; // 10 秒发送一次心跳包 let heartbeatInterval; function sendHeartbeat() { const heartbeatMessage = 'HEARTBEAT'; client.write(heartbeatMessage); } function startHeartbeat() { heartbeatInterval = setInterval(sendHeartbeat, HEARTBEAT_INTERVAL); }
- 接收心跳响应:
client.on('data', (data) => { const message = data.toString().trim(); if (message === 'HEARTBEAT_RESPONSE') { // 接收到心跳响应,说明连接正常,可重置心跳超时定时器等相关操作 console.log('Received heartbeat response, connection is alive.'); } });
处理心跳超时情况
- 设置超时定时器:
在发送心跳包后,启动一个超时定时器。例如,如果心跳包发送频率是 10 秒,那么超时时间可以设置为 30 秒(即连续 3 次未收到心跳响应)。
let heartbeatTimeout; function sendHeartbeat() { const heartbeatMessage = 'HEARTBEAT'; client.write(heartbeatMessage); clearTimeout(heartbeatTimeout); heartbeatTimeout = setTimeout(() => { console.log('Heartbeat timeout, connection may be lost.'); // 尝试重新连接 client.end(); client.connect({ port: 8080, host: '127.0.0.1' }, () => { console.log('Reconnected successfully.'); startHeartbeat(); }); }, 30000); }
- 连接恢复后操作:当重新连接成功后,重新启动心跳机制,继续维持连接的有效性。如上述代码中重新连接成功后调用
startHeartbeat()
函数。