MST

星途 面试题库

面试题:Node.js 实现 TCP 长连接时的心跳机制设计

假设你要在 Node.js 项目里基于 TCP 实现一个长连接,设计一个合理的心跳机制来维持连接的有效性。请描述心跳包的发送频率如何确定、心跳处理函数的逻辑以及如何处理心跳超时情况。
16.0万 热度难度
前端开发Node.js

知识考点

AI 面试

面试题答案

一键面试

心跳包发送频率的确定

  1. 考虑网络状况:如果是在稳定的局域网环境中,心跳包发送频率可以相对较低,例如每 30 秒一次。因为局域网网络质量好,较少出现网络波动导致连接中断的情况。而在广域网或网络状况不稳定的环境下,如移动网络,可能需要提高频率,比如每 10 秒发送一次,以便更及时地检测连接状态。
  2. 业务需求:如果业务对实时性要求极高,即使短暂的连接中断都不允许,那么心跳频率应适当提高,确保能快速发现并恢复连接。相反,如果业务允许一定时间内的连接中断,频率可以适当降低,减少网络开销。

心跳处理函数的逻辑

  1. 发送心跳包
    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);
    }
    
  2. 接收心跳响应
    client.on('data', (data) => {
        const message = data.toString().trim();
        if (message === 'HEARTBEAT_RESPONSE') {
            // 接收到心跳响应,说明连接正常,可重置心跳超时定时器等相关操作
            console.log('Received heartbeat response, connection is alive.');
        }
    });
    

处理心跳超时情况

  1. 设置超时定时器: 在发送心跳包后,启动一个超时定时器。例如,如果心跳包发送频率是 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);
    }
    
  2. 连接恢复后操作:当重新连接成功后,重新启动心跳机制,继续维持连接的有效性。如上述代码中重新连接成功后调用 startHeartbeat() 函数。