Node.js特點和適用場景


Node 起源

Node是由Ryan Dahl創造出來的,Ryan Dahl是一名資深的C/C++程序員,在創造出Node之前,他的主要工作都是圍繞高性能web服務器來展開的,他找到了設計高性能web服務器的幾個要點:事件驅動、非阻塞I/O,基於對已有的幾種語言的對比和考量,Ryan Dahl選擇了JavaScript作為Node的實現語言。

 

Node特點

1.異步I/O
在Node中,絕大多數的操作都以異步的方式進行調用,從文件讀取到網絡請求,均是如此,異步I/O意味着每個調用之間無須等待之前的I/O調用結束,在編程模型上可以提升效率,如果存在兩個文件讀取任務,最終的耗時只取決於最慢的那個文件讀取耗時,對於同步I/O而言,他的耗時是兩個任務之和。

2.事件與回調
在Node中事件得到了廣泛的應用,如創建一個服務器,我們會為器其綁定request對象,對於請求對象綁定data和end事件,同時在前端我們通常也是為Ajax請求綁定success事件、error事件等。同樣,在Node中回調也是無處不在的,事件的處理基本都是依賴回調來實現的,在JavaScript中,可以將函數作為對象傳遞給方法作為實參進行調用。

3.單線程
Node保持了JavaScript在瀏覽器中單線程的特點,而且在Node中,JavaScript與其余線程是無法共享任何狀態的。JavaScript采用單線程的原因和他最早的用途有關,最早在Web瀏覽器中,JavaScript主要做的是響應用戶DOM操作以及做表單校驗,這些功能使用單線程來處理完全夠了,而且對於DOM操作來說,使用多線程的話還將造成線程安全問題,同時多線程還將給瀏覽器帶來更大的內存消耗並降低CPU的使用率。

單就單線程本身來說,存在如下幾個弱點:

1、無法利用多核CPU
2、錯誤會引起整個應用退出,應用的健壯性需要考慮
3、大量計算占用CPU將使阻塞程序的運行
嚴格來說,Node並非真正的單線程架構,Node自身還有一定的I/O線程存在,這些I/O線程由底層libuv處理,這就意味着Node在訪問系統I/O時還是多線程的,對於文件讀取、SQL查詢、網路請求這些具體操作,Node還是使用多線程來進行處理從而保證Node的處理效率。

為了應對單線程存在的CPU利用率問題,Node采用了多進程的架構,也就是著名的Master-Worker模式,又稱主從模式,如下圖所示,這種典型的用於並行處理業務的分布式架構具有較好的伸縮性和穩定性。Node通過fork()復制的進程都是一個個獨立的進程,這個進程中有着獨立的V8實例,每個獨立進程需要至少30毫秒的啟動時間和至少10MB的內存,雖然fork()進程是有一定開銷的,但是可以提高多核CPU的利用率,這在CPU普遍多核化的今天還是有很大的作用的,同時我們也應該認識到Node通過事件驅動的方式在單線程上已經可以解決大並發的問題,啟動多進程只是為充分利用CPU資源。

Node的Master-Worker多進程模式中主進程和工作進程通過消息傳遞的形式而不是共享或直接操作資源的方式進行通信,通過fork()創建工作進程之后會在主進程和工作進程之間創建IPC通道,關於多進程相關內容,Node官方提供了cluster模塊對進程進行管理,相關內容可參考cluster。

關於應用的健壯性問題,我們同樣可以采用上述的Master-Worker模式,主進程只負責管理工作進程,具體的業務處理交由工作進程來完成,在工作進程中監聽uncaughtException事件可以捕獲未知的異常,然后告知主進程,主進程根據策略重新創建工作進程,或者直接退出主進程,這種情況代碼中一定要給出足夠的日志信息,通過日志監控任務及時產生報警。

4.跨平台
Node剛發布的時候,只能在Linux平台上運行,后來Node在架構層面進行了改動,在Node和操作系統之間引入了一層libuv,從而實現跨平台。

 

Node適合的應用場景

1.I/O密集型
Node異步I/O的特點使得他可以輕松面對I/O密集型的業務場景,處理效率將比同步I/O高,雖然同步I/O可以采用多線程或者多進程的方式進行,但是相比Node自帶異步I/O的特性來說,將增加對內存和CPU的開銷。

2.高並發場景
針對高並發請求場景,Node的異步I/O以及事件回調特點可以高效的處理並發請求,舉個簡單的例子:

有家快餐店,有一個收銀員,有4個廚師,中午高峰期的時候回一下來很多人就餐,對於同步的場景,收銀員收完錢后將訂單給廚師,廚師開始做,做完之后把快餐交給顧客,然后再接受下一個顧客的訂單,對於異步的場景,收銀員收完錢后將訂單給廚師同時給顧客一個號碼牌,廚師開始做,這時候顧客可以去隔壁買個飲料,等到廚師做完叫好去取餐就行。對於同步的場景如果需要增加顧客的處理速度,需要多加幾個收銀員(多線程),這意味着需要更多的人力成本,雖然對於系統的處理能力(廚師)來說是一樣的。

廣州品牌設計公司https://www.houdianzi.com PPT模板下載大全https://redbox.wode007.com

總結

總體來說Node的異步I/O能在開銷固定的情況下極大的提高並發處理速度,適合高並發,I/O密集型的使用場景,同時由於單線程的特點,Node程序不如多線程程序健壯性高,也不能利用多線程來使用多核CPU,不過對於Node來說,使用多進程的成本相對較小,上述問題都可以通過合理使用多進程來處理,最終程序的高效穩定運行還是取決於軟件架構和編碼質量。為了便於學習,接下來還會寫關於Node中Buffer、內存控制、程序測試等相關內容。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM