当前位置: 首页 > article >正文

NodeJS全栈开发面试题讲解——P1Node.js 基础与核心机制

1.1 Node.js 的事件循环原理?如何处理异步操作?

面试官您好,我理解事件循环是 Node.js 的异步非阻塞编程核心。

Node.js 构建在 V8 引擎与 libuv 库之上。虽然 Node.js 是单线程模型,但它通过事件循环(event loop)机制实现了异步 IO 和高并发能力。

🔁 事件循环核心阶段(简略版):

每一轮事件循环分为多个阶段,关键阶段有:

  1. timers:执行 setTimeoutsetInterval 的回调;

  2. pending callbacks:处理某些系统延迟回调;

  3. poll:执行 IO 回调,如网络、磁盘读取;

  4. check:执行 setImmediate() 回调;

  5. close callbacks:如 socket.on('close')

  6. 每个阶段结束后,还会处理 microtasks(如 process.nextTick()Promise.then());

🧠 异步操作如何配合事件循环?

比如我们调用异步文件读写:

fs.readFile('a.txt', () => {console.log('读文件完成');
});
  1. 任务由 libuv 线程池处理;

  2. 完成后注册回调,等待事件循环进入相应阶段;

  3. 在 poll 阶段执行对应的回调。


1.2 process.nextTick()、setImmediate()、Promise 的执行顺序?

这是一个非常容易被问到的陷阱问题,我用执行模型来解释它的顺序。

Node.js 将任务划分为两类:

  • Microtasks(微任务)process.nextTick()Promise.then()

  • Macrotasks(宏任务)setTimeoutsetImmediate

每个事件循环阶段后,都会清空微任务队列。

📌 执行优先级(从高到低):

1. process.nextTick()       // Node独有,优先级最高
2. Promise.then()           // 标准微任务
3. setTimeout(fn, 0)        // timers 阶段
4. setImmediate()           // check 阶段

🧪 示例代码:

setTimeout(() => console.log('timeout'), 0);
setImmediate(() => console.log('immediate'));
process.nextTick(() => console.log('nextTick'));
Promise.resolve().then(() => console.log('promise'));

📌 输出顺序:

nextTick
promise
timeout
immediate

补充:过多使用 process.nextTick() 会造成主线程“饿死”(starvation),所以要慎用。


1.3 如何避免阻塞主线程?举例说明

面试官,Node.js 是单线程的,一旦主线程执行了重 CPU 运算,就会阻塞事件循环,影响并发。

🧨 示例:阻塞代码

// 计算大量斐波那契数
function fibonacci(n) {if (n <= 1) return 1;return fibonacci(n - 1) + fibonacci(n - 2);
}
fibonacci(40); // 卡住主线程

✅ 避免方法:

✅ 1. 使用 worker_threads 执行 CPU 密集型任务
const { Worker } = require('worker_threads');
new Worker('./compute.js');
✅ 2. 拆分任务(分段执行)
function heavyTask() {let count = 0;function loop() {for (let i = 0; i < 10000; i++) count++;if (count < 1e6) setImmediate(loop);}loop();
}
✅ 3. 借助外部服务(如 Redis 缓存、Nginx 静态托管)减少计算需求

1.4 Node.js 如何实现定时任务?和浏览器定时器有区别吗?

面试官,Node.js 提供和浏览器相同 API,但其实现机制完全不同。

📌 相同点:

  • setTimeout(fn, ms)setInterval(fn, ms) 可用;

  • 支持取消:clearTimeout()clearInterval()

📌 不同点:

特性Node.js(libuv)浏览器(Web APIs)
核心实现libuv 的事件循环浏览器引擎 + 宿主环境
最小时间精度非实时,受事件循环影响一般为 4ms 最小
setImmediate()Node 独有,check 阶段执行无此函数


📌 高级定时任务方案(Node 专属):

  1. node-cron:cron 表达式任务调度;

  2. Agenda / Bree:基于数据库/文件持久化的任务调度;

  3. Redis 轮询 + 消息队列:实现分布式定时触发;

const cron = require('node-cron');
cron.schedule('0 0 * * *', () => console.log('每天零点执行'));

1.5 cluster 模块的原理及适用场景?如何实现负载均衡?

面试官,cluster 是 Node.js 提供的多进程扩展机制,用于充分利用多核 CPU 提升吞吐量。

🔧 原理:

  • 主进程(Master)通过 cluster.fork() 创建多个 worker 子进程;

  • 所有 worker 共享同一个 server 端口;

  • 实际请求由主进程分发给 worker 处理;

  • 每个 worker 都是独立的 Node 实例,进程隔离、内存独立;

const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length;if (cluster.isMaster) {for (let i = 0; i < numCPUs; i++) cluster.fork();
} else {http.createServer((req, res) => {res.end(`Worker ${process.pid} handled request`);}).listen(3000);
}

⚖️ 负载均衡策略:

  • Linux:基于 SO_REUSEPORT,内核自动均衡分发请求;

  • Windows/macOS:Node 内部使用 Round-Robin 分发策略;

  • Node v16+ 支持与 worker_threads 混合使用,提高 CPU 利用率;


✅ 适用场景:

  • 高并发 API 服务(如网关、接口层);

  • IO 与 CPU 混合负载应用;

  • 可与 pm2 配合实现进程守护 + 负载均衡;


❗ 注意事项:

  • 不共享内存,通信需用 IPC(如 worker.send());

  • 状态同步麻烦(需借助 Redis 等中间件);

  • cluster 并不适合细粒度计算,适合粗粒度多请求任务;


✅ 总结回顾

问题核心关键词
1.1libuv、事件循环、阶段、异步 IO
1.2微任务 vs 宏任务、执行优先级
1.3阻塞避免、worker_threads、任务拆分
1.4Node 定时器机制、cron、高级调度
1.5cluster 原理、多进程、负载均衡策略

相关文章:

NodeJS全栈开发面试题讲解——P1Node.js 基础与核心机制

✅ 1.1 Node.js 的事件循环原理&#xff1f;如何处理异步操作&#xff1f; 面试官您好&#xff0c;我理解事件循环是 Node.js 的异步非阻塞编程核心。 Node.js 构建在 V8 引擎与 libuv 库之上。虽然 Node.js 是单线程模型&#xff0c;但它通过事件循环&#xff08;event loop&a…...

Vulhub靶场搭建(Ubuntu)

前言&#xff1a;Vulhub 是一个开源的漏洞靶场平台&#xff0c;全称是 Vulhub: Vulnerable Web Application Environments&#xff0c;主要用于学习和复现各类 Web 安全漏洞。它的核心特征是通过 Docker 环境快速搭建出带有特定漏洞的靶场系统&#xff0c;适合渗透测试学习者、…...

C++:参数传递方法(Parameter Passing Methods)

目录 1. 值传递&#xff08;Pass by Value&#xff09; 2. 地址传递&#xff08;Pass by Address&#xff09; 3. 引用传递&#xff08;Pass by Reference&#xff09; 数组作为函数参数&#xff08;Array as Parameter&#xff09; 数组作为函数返回值 什么是函数&#xff…...

大语言模型的推理能力

2025年&#xff0c;各种会推理的AI模型如雨后春笋般涌现&#xff0c;比如ChatGPT o1/o3/o4、DeepSeek r1、Gemini 2 Flash Thinking、Claude 3.7 Sonnet (Extended Thinking)。 对于工程上一些问题比如复杂的自然语言转sql&#xff0c;我们可能忍受模型的得到正确答案需要更多…...

基于BERT和GPT2的实现来理解Transformer的结构和原理

Transformer 核心就是编码器和解码器&#xff0c;简单理解&#xff1a;编码器就是特征提取&#xff0c;解码器就是特征还原。 Transformer 完整架构 Transformer最初是一个Encoder-Decoder架构&#xff0c;用于机器翻译任务&#xff1a; 输入序列 → [Encoder] → 编码表示…...

.net consul服务注册与发现

.NET中Consul服务注册与发现的技术实践 在微服务架构中&#xff0c;服务的注册与发现是至关重要的环节&#xff0c;它能帮助各个服务之间实现高效的通信和协作。Consul作为一款功能强大的工具&#xff0c;为我们提供了优秀的服务注册与发现解决方案。今天&#xff0c;我们就来…...

WifiEspNow库函数详解

WifiEspNow库 项目地址https://github.com/yoursunny/WifiEspNow WifiEspNow 是 ESP-NOW 的 Arduino 库&#xff0c;ESP-NOW 是乐鑫定义的无连接 WiFi 通信协议。 有关 ESP-NOW 工作原理及其限制的更多信息&#xff0c;请参阅 ESP-NOW 参考。 WifiEspNow是 ESP-IDF 中 ESP-N…...

rsync使用守护进程启动服务

rsync 本身通常使用 SSH(Secure Shell)协议来进行数据传输,因此它默认使用 SSH 的端口 22。如果使用 rsync 进行通过 SSH 的数据同步,它会通过端口 22 来建立连接。 然而,如果你使用 rsync 作为一个守护进程进行文件同步(即不通过 SSH),则可以配置它使用 TCP 端口 873…...

React 核心概念与生态系统

1. React 简介 React 是由 Facebook 开发并开源的一个用于构建用户界面的 JavaScript 库。它主要用于构建单页应用&#xff08;SPA&#xff09;&#xff0c;其核心理念是组件化和声明式编程&#xff0c;即 ui render(data)。 2. 核心特点 2.1. 声明式编程 React 使用声明式…...

使用React Native开发新闻资讯类鸿蒙应用的准备工作

以下是一篇关于使用React Native开发新闻资讯类鸿蒙应用的准备工作指南&#xff0c;结合鸿蒙生态特性与React Native技术栈整合要点&#xff1a; ​​一、环境搭建与工具链配置​​ ​​基础依赖安装​​ ​​Node.js 18​​&#xff1a;需支持ES2020语法&#xff08;如可选链操…...

node-sass 报错

背景&#xff1a;一些老项目使用"node-sass": “^4.14.1” &#xff0c;node版本要求 14.x&#xff0c;高版本不兼容 解决方案如下&#xff1a; 方案一&#xff1a;替换安装sass (无须降级Node版本) 卸载node-sass npm uninstall node-sass安装sass&#xff08;Dart…...

Redis的安装与使用

网址&#xff1a;Spring Data Redis 安装包&#xff1a;Releases tporadowski/redis GitHub 解压后 在安装目录中打开cmd 打开服务&#xff08;注意&#xff1a;每次客户端连接都有先打开服务&#xff01;&#xff01;&#xff01;&#xff09; 按ctrlC退出服务 客户端连接…...

Linux服务器运维10个基础命令

结合多篇权威资料&#xff0c;以下是运维工程师必须掌握的10个核心命令&#xff0c;涵盖文件管理、系统监控、网络操作等高频场景 1. "ls" 代码分析 "ls" 用于列出目录内容&#xff0c;通过参数组合可增强展示效果&#xff1a; "-l" 显示文件…...

2024年数维杯国际大学生数学建模挑战赛C题时间信号脉冲定时噪声抑制与大气时延抑制模型解题全过程论文及程序

2024年数维杯国际大学生数学建模挑战赛 C题 时间信号脉冲定时噪声抑制与大气时延抑制模型 原题再现&#xff1a; 脉冲星是一种快速旋转的中子星&#xff0c;具有连续稳定的旋转&#xff0c;因此被称为“宇宙灯塔”。脉冲星的空间观测在深空航天器导航和时间标准维护中发挥着至…...

C# 控制台程序获取用户输入数据验证 不合规返回重新提示输入

在 C# 控制台程序中实现输入验证并循环重试&#xff0c;可以通过以下方式实现高效且用户友好的交互。以下是包含多种验证场景的完整解决方案&#xff1a; 一、通用输入验证框架 public static T GetValidInput<T>(string prompt, Func<string, (bool IsValid, T Val…...

【大模型面试每日一题】Day 31:LoRA微调方法中低秩矩阵的秩r如何选取?

【大模型面试每日一题】Day 31&#xff1a;LoRA微调方法中低秩矩阵的秩r如何选取&#xff1f; &#x1f4cc; 题目重现 &#x1f31f;&#x1f31f; 面试官:LoRA微调方法中低秩矩阵的秩r如何选取&#xff1f;&#xff1a; #mermaid-svg-g5hxSxV8epzWyP98 {font-family:"…...

使用source ~/.bashrc修改环境变量之后,关闭服务器,在重启,环境变量还有吗?

环境变量在服务器重启后的留存性分析 1. 环境变量的存储机制 临时环境变量&#xff1a; 通过命令直接设置的环境变量&#xff08;如 export MY_VARvalue&#xff09;仅存在于当前 shell 会话中&#xff0c;服务器重启后会丢失。永久环境变量&#xff1a; 写入 配置文件&#…...

SQL 窗口函数深度解析:ROW_NUMBER 实战指南

SQL 窗口函数深度解析:ROW_NUMBER 实战指南 一、窗口函数核心概念 窗口函数(Window Function)是SQL中用于在结果集的"窗口"(即特定行集合)上执行计算的高级功能。与聚合函数不同,窗口函数不会将多行合并为单行,而是为每行返回一个计算值。 关键特性:窗口函数通…...

React从基础入门到高级实战:React 生态与工具 - React 国际化(i18n)

React 国际化&#xff08;i18n&#xff09; 引言 随着全球化的加速&#xff0c;开发支持多语言的应用已成为现代Web开发的重要需求。无论是面向国际市场的电商平台&#xff0c;还是提供多语言服务的SaaS应用&#xff0c;国际化&#xff08;i18n&#xff09;功能都是提升用户体…...

leetcode93.复原IP地址:回溯算法中段控制与前导零处理的深度解析

一、题目深度解析与IP地址规则 题目描述 给定一个只包含数字的字符串s&#xff0c;返回所有可能的有效IP地址组合。有效IP地址需满足以下条件&#xff1a; 由4个0-255的整数组成&#xff0c;用.分隔每个整数不能以0开头&#xff08;除非该整数本身是0&#xff09;例如输入s&…...

TDengine 运维——巡检工具(安装前检查)

简介 本文档旨在介绍 TDengine 安装部署前后配套的巡检工具。 相关工具的功能简介&#xff1a; 工具名称功能简介安装前检查部署前对 TDengine 安装部署的依赖要素进行安装前检查安装前预配置部署前对 TDengine 安装部署的依赖要素进行安装前预配置安装部署指定环境安装部署…...

MySQL主从复制深度解析:原理、架构与实战部署指南

一、主从复制核心原理 复制流程解析 MySQL主从复制本质是通过二进制日志(binlog)实现数据同步的异步复制机制&#xff1a; 写操作记录&#xff1a;主库执行写操作时&#xff0c;将变更记录到binlog 日志传输&#xff1a;主库的binlog dump线程将日志发送给从库 中继存储&am…...

[SC]SystemC dont_initialize的应用场景详解(二)

SystemC dont_initialize的应用场景详解(二) 摘要:下面给出一个稍复杂一点的 SystemC 示例,包含三个模块(Producer/Filter/Consumer)和一个 Testbench(Top)模块,演示了在不同的进程类型中如何使用 dont_initialize() 来抑制 time 0 的自动调用。 一、源代码 …...

【Linux】权限chmod命令+Linux终端常用快捷键

目录 linux中权限表示形式 解析标识符 权限的数字序号 添加权限命令chmod 使用数字表示法设置权限 使用符号表示法设置权限 linux终端常用快捷键 &#x1f525;个人主页 &#x1f525; &#x1f608;所属专栏&#x1f608; 在 Linux 系统里&#xff0c;权限管理是保障系…...

Java八股文智能体——Agent提示词(Prompt)

这个智能体能够为正在学习Java八股文的同学提供切实帮助&#xff1a;不仅可以帮你优化答案表述&#xff0c;还能直接解答八股文相关问题——它会以面试者的视角&#xff0c;给出贴合求职场景的专业回答。 将以下内容发送给任何一个LLM&#xff0c;他会按照你提示词的内容&…...

Go语言的context

Golang context 实现原理 本篇文章是基于小徐先生的文章的修改和个人注解&#xff0c;要查看原文可以点击上述的链接查看 目前我这篇文章的go语言版本是1.24.1 context上下文 context被当作第一个参数&#xff08;官方建议&#xff09;&#xff0c;并且不断的传递下去&…...

快速掌握 GO 之 RabbitMQ 结合 gin+gorm 案例

更多个人笔记见&#xff1a; &#xff08;注意点击“继续”&#xff0c;而不是“发现新项目”&#xff09; github个人笔记仓库 https://github.com/ZHLOVEYY/IT_note gitee 个人笔记仓库 https://gitee.com/harryhack/it_note 个人学习&#xff0c;学习过程中还会不断补充&…...

JVM——SubstrateVM:AOT编译框架

引入 在现代软件开发领域&#xff0c;应用程序的启动性能和内存开销一直是影响用户体验的关键因素。对于 Java 应用程序而言&#xff0c;传统的即时编译&#xff08;JIT&#xff09;模式虽然能够在运行时对热点代码进行优化&#xff0c;提高程序的执行效率&#xff0c;但却无法…...

【HarmonyOS 5】鸿蒙Taro跨端框架

‌Taro跨端框架‌ 支持React语法开发鸿蒙应用&#xff0c;架构分为三层&#xff1a; ArkVM层运行业务代码和React核心TaroElement树处理节点创建和属性绑定TaroRenderNode虚拟节点树与上屏节点一一对应 import { Component } from tarojs/taro export default class MyCompon…...

数据库原理 试卷

以下是某高校教学管理系统的毕业论文指导ER图&#xff0c;数据信息&#xff1a;一名教师指导多名学生&#xff0c;一名学生只能选择一名教师&#xff0c;试分析完成以下各题&#xff0c;如用SQL命令完成的&#xff0c;在SQL Server2008验证后把答案写在题目的下方。 图1 毕业论…...