面试题答案
一键面试事件循环优化
- 优化方法:避免在事件循环中执行长时间同步操作。将这类操作如复杂计算、文件读写等转为异步。例如使用
setImmediate
或process.nextTick
来处理非紧急任务,把它们放到事件循环的下一个阶段执行,防止阻塞当前事件循环。 - 原理:Node.js 的事件循环负责处理 I/O 事件、定时器等。若事件循环被长时间同步操作阻塞,新的 I/O 事件和回调就无法及时执行,导致响应延迟。通过异步化任务,事件循环可及时处理其他任务,提高响应速度。
内存管理优化
- 优化方法:
- 合理设置缓存。对频繁访问的数据进行缓存,减少重复计算和 I/O 操作。例如使用
node-cache
模块,设置合适的缓存过期时间,防止内存占用过大。 - 及时释放不再使用的对象。手动将不再使用的变量赋值为
null
,让垃圾回收机制(GC)能够回收这些对象占用的内存。 - 监控内存使用情况,通过
process.memoryUsage()
方法查看堆内存等使用信息,根据监控结果调整程序,避免内存泄漏。
- 合理设置缓存。对频繁访问的数据进行缓存,减少重复计算和 I/O 操作。例如使用
- 原理:高并发场景下,内存使用不当易导致内存泄漏或内存占用过高,影响性能。缓存减少重复操作提升效率,及时释放对象和监控内存确保内存高效利用。
异步 I/O 优化
- 优化方法:
- 使用
fs.promises
等异步文件系统操作替代同步操作。例如fs.promises.readFile
代替fs.readFileSync
。 - 对于数据库操作,利用异步驱动。如
mysql2
库的异步方法,避免数据库查询阻塞事件循环。 - 合理使用连接池。在数据库连接等场景下,创建连接池,复用连接,减少连接创建和销毁的开销。
- 使用
- 原理:I/O 操作通常是阻塞的,异步 I/O 允许在等待 I/O 完成时继续执行其他任务,提高事件循环利用率,从而提升高并发处理能力。连接池减少连接开销,提高资源利用率。
线程池与集群优化
- 优化方法:
- 利用 Node.js 的线程池。对于无法异步化的 CPU 密集型操作,可使用
worker_threads
模块将任务分配到线程池执行,避免阻塞事件循环。 - 采用集群模式。通过
cluster
模块创建多个工作进程,充分利用多核 CPU 资源,每个进程处理一部分请求,提高整体并发处理能力。
- 利用 Node.js 的线程池。对于无法异步化的 CPU 密集型操作,可使用
- 原理:线程池分担 CPU 密集型任务,防止其阻塞事件循环。集群模式利用多核 CPU,将请求分散到多个进程处理,提升系统整体性能和资源利用率。
网络优化
- 优化方法:
- 启用 HTTP/2。它具有多路复用、头部压缩等特性,能提高网络传输效率,减少延迟。在 Node.js 中可通过
http2
模块启用。 - 优化 TCP 参数。如调整
TCP_NODELAY
选项,禁用 Nagle 算法,减少小包合并延迟,让数据及时发送。 - 合理设置服务器端口监听数量,避免端口竞争和资源浪费。
- 启用 HTTP/2。它具有多路复用、头部压缩等特性,能提高网络传输效率,减少延迟。在 Node.js 中可通过
- 原理:HTTP/2 优化网络传输特性,提升数据传输效率。TCP 参数优化确保数据及时传输,合理设置端口监听提高网络资源利用率。