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中,能夠將函數做爲對象傳遞給方法做爲實參進行調用。web

3.單線程
Node保持了JavaScript在瀏覽器中單線程的特色,並且在Node中,JavaScript與其他線程是沒法共享任何狀態的。JavaScript採用單線程的緣由和他最先的用途有關,最先在Web瀏覽器中,JavaScript主要作的是響應用戶DOM操做以及作表單校驗,這些功能使用單線程來處理徹底夠了,並且對於DOM操做來講,使用多線程的話還將形成線程安全問題,同時多線程還將給瀏覽器帶來更大的內存消耗並下降CPU的使用率。編程

單就單線程自己來講,存在以下幾個弱點:瀏覽器

一、沒法利用多核CPU
二、錯誤會引發整個應用退出,應用的健壯性須要考慮
三、大量計算佔用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個廚師,中午高峯期的時候回一下來不少人就餐,對於同步的場景,收銀員收完錢後將訂單給廚師,廚師開始作,作完以後把快餐交給顧客,而後再接受下一個顧客的訂單,對於異步的場景,收銀員收完錢後將訂單給廚師同時給顧客一個號碼牌,廚師開始作,這時候顧客能夠去隔壁買個飲料,等到廚師作完叫好去取餐就行。對於同步的場景若是須要增長顧客的處理速度,須要多加幾個收銀員(多線程),這意味着須要更多的人力成本,雖然對於系統的處理能力(廚師)來講是同樣的。

總結

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

相關文章
相關標籤/搜索