面试题答案
一键面试1. 故障场景分析
- 网络闪断:通常是短时间的网络连接中断,可能由于网络波动等原因导致。需要检测到连接中断后,尽快尝试重新连接。
- 服务器硬件故障后重启:硬件故障导致服务器进程崩溃,重启后需要恢复到故障前的状态,例如重新建立网络连接并继续处理之前的任务。
2. 关键模块
- net:Node.js 内置模块,用于创建 TCP、UDP 等网络服务器和客户端,在故障恢复和重连机制中用于建立和管理网络连接。
- cluster:Node.js 内置模块,用于创建共享服务器端口的子进程,提高服务器的性能和稳定性,在硬件故障重启后可帮助快速恢复服务。
- events:Node.js 内置模块,提供了基于事件驱动的编程范式,用于监听和处理网络故障等事件。
3. 代码实现
网络闪断恢复机制
const net = require('net');
// 创建 TCP 客户端
const client = new net.Socket();
// 连接到服务器
function connectServer() {
client.connect({ port: 8080, host: '127.0.0.1' }, () => {
console.log('Connected to server');
});
client.on('error', (err) => {
console.error('Connection error:', err.message);
// 网络闪断时,尝试重新连接
setTimeout(connectServer, 5000);
});
client.on('close', () => {
console.log('Connection closed');
// 连接关闭时,尝试重新连接
setTimeout(connectServer, 5000);
});
}
connectServer();
服务器硬件故障后重启恢复机制
const cluster = require('cluster');
const net = require('net');
const http = require('http');
if (cluster.isMaster) {
// Fork workers.
for (let i = 0; i < require('os').cpus().length; i++) {
cluster.fork();
}
cluster.on('exit', (worker, code, signal) => {
console.log(`worker ${worker.process.pid} died`);
// 重启故障的 worker
cluster.fork();
});
} else {
const server = http.createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('Hello World!\n');
});
server.on('error', (err) => {
console.error('Server error:', err.message);
// 发生错误时,尝试重启服务器
setTimeout(() => {
process.exit(1);
}, 5000);
});
server.listen(8080, '127.0.0.1', () => {
console.log(`Worker ${process.pid} started on port 8080`);
});
}
4. 总结
通过上述代码实现,在网络闪断场景下,客户端可以通过 net
模块的事件监听和 setTimeout
函数来实现自动重连。在服务器硬件故障后重启场景下,利用 cluster
模块管理子进程,在子进程崩溃时自动重启,同时结合 http
模块创建服务器,对错误事件进行处理,以保障服务器快速恢复正常服务。