面试题答案
一键面试1. 异步控制流优化
在Node.js高并发应用处理大量I/O操作时,可使用async/await
结合try/catch
,并配合Promise.all
等方法来优化异步控制流。
2. 避免内存泄漏和资源耗尽
- 限制并发数量:使用
async/await
和队列控制并发请求数,避免瞬间过多请求耗尽资源。 - 及时释放资源:确保I/O操作完成后,及时关闭文件描述符、数据库连接等资源。
3. 异常处理机制
- 使用
try/catch
块捕获async/await
中的错误,在catch
块中记录详细错误信息,防止应用崩溃。
代码示例
假设我们有一个读取多个文件内容的场景:
const fs = require('fs').promises;
const path = require('path');
// 模拟文件路径数组
const filePaths = [
path.join(__dirname, 'file1.txt'),
path.join(__dirname, 'file2.txt'),
path.join(__dirname, 'file3.txt')
];
async function readFiles() {
const results = [];
const maxConcurrent = 3; // 限制最大并发数
let currentCount = 0;
async function readFileAtIndex(index) {
try {
currentCount++;
const data = await fs.readFile(filePaths[index], 'utf8');
results.push(data);
} catch (error) {
console.error(`Error reading file ${filePaths[index]}:`, error);
} finally {
currentCount--;
}
}
const promises = filePaths.map((_, index) => {
while (currentCount >= maxConcurrent) {
await new Promise(resolve => setTimeout(resolve, 100));
}
return readFileAtIndex(index);
});
await Promise.all(promises);
return results;
}
readFiles().then(data => {
console.log('All files read successfully:', data);
}).catch(error => {
console.error('An unexpected error occurred:', error);
});
优化策略
- 并发限制:通过
currentCount
和maxConcurrent
变量控制并发数,避免同时发起过多I/O请求。 - 异常处理:在
try/catch
块中捕获每个文件读取操作的错误,并记录详细信息。 - 资源释放:
fs.readFile
操作完成后自动释放文件资源,若涉及其他资源(如数据库连接),确保在操作完成后正确关闭连接。