1. 程式人生 > >【NodeJS】我為什麼要學Node.js?

【NodeJS】我為什麼要學Node.js?

  NodeJS的作者說,他創造NodeJS的目的是為了實現高效能Web伺服器,他首先看重的是事件機制和非同步IO模型的優越性,而不是JS。但是他需要選擇一種程式語言實現他的想法,這種程式語言不能自帶IO功能,並且需要能良好支援事件機制。JS沒有自帶IO功能,天生就用於處理瀏覽器中的DOM事件,並且擁有一大群程式設計師,因此就成為了天然的選擇。

有了Node.js我們就可以拋棄PHP或者其他伺服器語言了?

  答案是否定的。
  
  首先要理解Node.js的優點,以及Node.js與其他語言之間的區別和聯絡。傳統的伺服器語言,如PHP和Java等,每個Web HTTP請求連線都會產生一個執行緒,假設每個執行緒需要2MB的配置記憶體,因此相對一個8GB的伺服器主機,也只能承受來自4000個併發使用者的請求,當伺服器承受不了這麼多使用者的情況下就需要新增伺服器,從而導致增加專案運營成本(當然現在有Nginx支撐,可以提供更高的併發量請求)。
  
  其次,理解Node.js解決的問題是什麼?Node.js解決多請求的方法,在於其處理連線伺服器的方式。在Node.js中每個HTTP連線都會發射一個在Node.js引擎的程序中執行的事件,而不是為每個連線生成一個新的OS程序(併為其分配一些配套內容)。
  
  綜上所述就可以清晰地看出Node.js相對PHP來說其優點在於能處理高併發請求,並且由於Node.js是事件驅動,因此可以更好地節約伺服器記憶體資源。
  
  在專案的開發中,我們應該如何抉擇是否使用Node.js作為專案開發實現呢?首先,必須要了解專案的型別是不是適合Node.js去開發專案。例如需要開發一個部落格、論壇或者微博,那麼是否能使用Node.js去開發?回答是肯定的,但是不合適,相對來說PHP在這方面已經很成熟。

  Node.js可以單獨實現一個server,這也是Node.js一個非常大的優點,對於那些簡單的server,通過Node.js實現比使用C++實現會簡單得多。最後,牢記Node.js解決長連線、多請求引發的成本問題,因此在一些專案,例如實時線上Game(如一些來畫畫、黑暗殺人遊戲、實時休閒遊戲等)、實時線上聊天室、實時訊息推送功能、SNS實時交流、實時監控系統(如股票、系統執行狀態等)等開發過程中,應該把握住機會,應用Node.js來開發。

Node.js的應用場景

適合

  • JSON APIs——構建一個Rest/JSON API服務,Node.js可以充分發揮其非阻塞IO模型以及JavaScript對JSON的功能支援(如JSON.stringfy函式)

  • 單頁面、多Ajax請求應用——如Gmail,前端有大量的非同步請求,需要服務後端有極高的響應速度

  • 基於Node.js開發Unix命令列工具——Node.js可以大量生產子程序,並以流的方式輸出,這使得它非常適合做Unix命令列工具

  • 流式資料——傳統的Web應用,通常會將HTTP請求和響應看成是原子事件。而Node.js會充分利用流式資料這個特點,構建非常酷的應用。如實時檔案上傳系統transloadit

  • 準實時應用系統——如聊天系統、微博系統,但Javascript是有垃圾回收機制的,這就意味著,系統的響應時間是不平滑的(GC垃圾回收會導致系統這一時刻停止工作)。如果想要構建硬實時應用系統,Erlang是個不錯的選擇

不適合

  • CPU使用率較重、IO使用率較輕的應用——如視訊編碼、人工智慧等,Node.js的優勢無法發揮

  • 簡單Web應用——此類應用的特點是,流量低、物理架構簡單,Node.js無法提供像Ruby的Rails或者Python的Django這樣強大的框架

  Node能夠最大限度利用硬體資源,其原因既如此。換句話說,CPU把絕大多數時間花在處理實際業務邏輯上,而不是執行緒或程序的等待和上下文切換上。在這種處理模式下,假如主執行緒阻塞,那說明真的是沒有任務需要處理,而不是等待I/O結束。

  我們知道了非同步程式設計的諸多好處,主要體現在節約CPU資源、不阻塞、快速、高響應。但還有一點沒有談到,就是非同步的編碼正規化幾乎用不到鎖,這在C++層面尤其體現出它的優勢。我們驚奇地發現,不僅所有JavaScript程式碼均運行於主執行緒,對於完全非同步的情況,C++程式碼也不需要使用鎖。因為所有程式碼也執行在主執行緒,物件內部狀態都在一個執行緒中維護。