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 原理、多進程、負載均衡策略

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/82115.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/82115.shtml
英文地址,請注明出處:http://en.pswp.cn/web/82115.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【深度學習】sglang 的部署參數詳解

SGLang 的部署參數詳解 SGLang(Structured Generation Language)是一個高性能的大語言模型推理框架,專為結構化生成和多模態應用設計。本文將全面介紹SGLang的部署參數,幫助你充分發揮其性能潛力。 ?? SGLang 項目概覽 SGLang是由UC Berkeley開發的新一代LLM推理引擎,…

MATLAB實戰:機器學習分類回歸示例

以下是一個使用MATLAB的Statistics and Machine Learning Toolbox實現分類和回歸任務的完整示例代碼。代碼包含鳶尾花分類、手寫數字分類和汽車數據回歸任務&#xff0c;并評估模型性能。 %% 加載內置數據集 % 鳶尾花數據集&#xff08;分類&#xff09; load fisheriris; X_i…

數組。。。。。

//創建Book 對象&#xff0c;放入相關的屬性private String name;//書名private String[] writer;//作者private List<String> reader;//讀者private Map<String, Object> topics;//評講Book book new Book();book.setName("昆蟲總動員");book.setWrite…

day16 leetcode-hot100-31(鏈表10)

25. K 個一組翻轉鏈表 - 力扣&#xff08;LeetCode&#xff09; 1.模擬法 思路 將這個過程拆解為兩個步驟&#xff0c;第一步將單分組的節點反轉&#xff0c;第二步將反轉后的鏈表加入原鏈表。 針對節點反轉很容易&#xff0c;參考之前的206. 反轉鏈表 - 力扣&#xff08;Le…

測試總結(二)

持續集成 軟件開發實踐 開發提交代碼到gitlab上 自動化構建&#xff08;編譯、打包、部署、自動化測試&#xff09; 盡早發現集成問題 過程&#xff1a; 提交代碼-人工/定時觸發-自動構建-自動部署-構建成功-獲取構建環境信息-郵件通知-自動測試 快速集成、快速反饋、快速解決…

(二)微服務(grpc/grpc消費者)

文章目錄 項目地址一、grpc介紹1.1 項目初始化1. 創建grpc項目2. 項目結構二、Discount grpc創建2.1 實體層1. Coupon實體2.2 Protos1. 創建discount.proto2. 配置proto3. 創建DiscountService4. Program里注冊服務2.3 Seed 數據1. 創建表和Seed數據2. 自動migration2.4 更新Do…

InfluxQL 數據分析實戰:聚合、過濾與關聯查詢全解析

InfluxQL 作為時序數據庫的專用查詢語言&#xff0c;在處理時間序列數據時展現出獨特優勢。本文深入探討 聚合計算、數據過濾和跨測量關聯 三大核心操作&#xff0c;通過真實代碼示例展示如何從海量時序數據中提取關鍵洞察。文中涵蓋從基礎平均值計算到復雜多維度分析的完整流程…

TDengine 運維——巡檢工具(安裝前檢查)

簡介 本文檔旨在介紹 TDengine 安裝部署前后配套的巡檢工具。 相關工具的功能簡介&#xff1a; 工具名稱功能簡介安裝前檢查部署前對 TDengine 安裝部署的依賴要素進行安裝前檢查安裝前預配置部署前對 TDengine 安裝部署的依賴要素進行安裝前預配置安裝部署指定環境安裝部署…

大語言模型(LLM)入門 - (1) 相關概念

文章來自&#xff1a;大語言模型(LLM)小白入門自學項目-TiaoYu-1 GitHub - tiaoyu1122/TiaoYu-1: For People! For Freedom!For People! For Freedom! Contribute to tiaoyu1122/TiaoYu-1 development by creating an account on GitHub.https://github.com/tiaoyu1122/TiaoYu…

LearnOpenGL-筆記-其十一

Normal Mapping 又到了介紹法線貼圖的地方&#xff0c;我感覺我已經寫了很多遍了... 法線貼圖用最簡單的話來介紹的話&#xff0c;就是通過修改貼圖對應物體表面的法線來修改光照效果&#xff0c;從而在不修改物體實際幾何形狀的前提下實現不同于物體幾何形狀的視覺效果。 因…

Spring Boot 讀取.env文件獲取配置

Spring Boot 讀取.env文件獲取配置 在Resouce 目錄下創建.env文件 # DEEP SEEK TOKEN DEEP_SEEK_TOKENyour_deep_seek_key # 阿里云百煉 TOKEN ALI_BAILIAN_TOKENyour_ali_bailian_keyyml引入.env文件 spring:config:import: optional:classpath:.env[.properties]使用.env文…

【C++高級主題】命令空間(三):未命名的命名空間

目錄 一、未命名的命名空間的基本概念 1.1 定義與特點 1.2 基本語法 1.3 訪問方式 1.4 未命名的命名空間的作用 二、未命名的命名空間與靜態聲明的比較 2.1 靜態聲明的作用 2.2 未命名的命名空間的優勢 2.3 示例代碼比較 2.4. 未命名的命名空間的作用域和鏈接屬性 三…

【Unity】AudioSource超過MaxDistance還是能聽見

unity版本&#xff1a;2022.3.51f1c1 將SpatialBlend拉到1即可 或者這里改到0 Hearing audio outside max distance - #11 by wderstine - Questions & Answers - Unity Discussions

多個vue2工程共享node_modules

手頭有多個vue2項目&#xff0c;它們每個都需要一個node_modules&#xff0c;拷貝起來超級麻煩。于是想到能否共享一個node_modules呢&#xff1f;&#xff1f; 方法其實挺多&#xff0c;我選擇了一個較簡單的&#xff1a;符號連接法(win11平臺) 創建方法很簡單&#xff1a;比…

C語言-10.字符串

10.1字符串 10.1-1字符串 字符數組 char word[] = {‘H’,‘e’,‘l’,‘l’,‘o’,‘!’}; word[0]Hword[1]eword[2]lword[3]lword[4]oword[5]!這不是C語言的字符串,因為不能用字符串的方式做計算 字符串 char word[] = {‘H’,‘e’,‘l’,‘l’,‘o’,‘!’}; word[0]Hwo…

Python訓練營打卡Day41(2025.5.31)

知識回顧 數據增強卷積神經網絡定義的寫法batch歸一化&#xff1a;調整一個批次的分布&#xff0c;常用與圖像數據特征圖&#xff1a;只有卷積操作輸出的才叫特征圖調度器&#xff1a;直接修改基礎學習率 卷積操作常見流程如下&#xff1a; 1. 輸入 → 卷積層 → Batch歸一化層…

樂觀鎖:高效并發無鎖方案

4.樂觀鎖 這一章主要介紹樂觀鎖。前面的管程部分講了悲觀鎖&#xff0c;現在做一些總結&#xff1a; 悲觀鎖&#xff08;Pessimistic Lock&#xff09;&#xff1a;悲觀鎖認為數據在多線程或多進程環境下總是容易發生沖突/沖突的概率高&#xff0c;所以在數據操作前&#xff…

山海鯨輕 3D 渲染技術深度解析:預渲染如何突破多終端性能瓶頸

在前期課程中&#xff0c;我們已系統講解了山海鯨兩大核心渲染模式——云渲染與端渲染的技術特性及配置方法。為滿足復雜場景下的差異化需求&#xff0c;山海鯨創新推出輕3D渲染功能&#xff0c;本文將深度解析該技術的實現原理與操作實踐。 一、輕3D功能研發背景 針對多終端協…

【合集】Linux——31個普通信號

Linux普通信號總表&#xff08;1-31&#xff09;?? ?編號??信號名??觸發原因??默認動作?1SIGHUP終端連接斷開&#xff08;如SSH會話終止&#xff09;或守護進程重載配置&#xff08;如nginx -s reload&#xff09;終止進程2SIGINT用戶輸入CtrlC中斷前臺進程終止進程…

小程序使用npm包的方法

有用的鏈接 npm init -y 這個命令很重要, 會初始化 package.json 再重新打開微信小程序開發工具 選擇工具中npm構建 在程序中引用時在main.js中直接使用包名的方式引用即可 如安裝的是generator包&#xff0c;npm構建后就會生成 const myPackage require(***-generato…