深刻淺出Node.js學習筆記(一)

Node簡介

1.Node的誕生歷程

Node誕生於2009年3月。前端

2.Node的命名與起源

Node的別名:Nodejs、NodeJS、Node.js。編程

2.1爲何是JavaScript

設計高性能Web服務器的幾個要點:事件驅動、非阻塞I/O。後端

考慮到高性能、符合事件驅動、沒有歷史包袱這三個主要緣由,JavaScript成爲了Node的實現語言。瀏覽器

2.2爲何叫Node

Node能夠構建服務器、客戶端、命令行工具,Node發展爲一個強制不共享任何資源的單線程、單進程系統,其目的是成爲一個構建快速、可伸縮的網絡應用平臺。性能優化

Node自身很是簡單,經過通訊協議來組織許多Node,很是容易經過擴展來達到構建大型網絡應用的目的。服務器

每個Node進程都構建成這個網絡應用的一個節點,這是它名字所含意義的真諦。網絡

3.Node給JavaScript帶來的意義

Node打破了過去JavaScript只能在瀏覽器運行的局面,先後端編程環境統一,可大大減小先後端轉換所須要的上下文交換代價。架構

4.Node的特色

做爲後端JavaScript運行的平臺,Node保留前端瀏覽器JavaScript中那些熟悉的接口,沒有改變語言的任何特性,依舊依賴做用域和原型鏈,區別在於它將前端中普遍運用的思想遷移到服務端。異步

4.1異步I/O

異步調用中對於結果值的捕獲是符合"Don't call me, I will call you"原則。分佈式

在Node中,絕大多數的操做都以異步的方式進行調用。

4.2事件與回調函數

事件的編程方式具備輕量級、鬆耦合、只關注事務點等優點。

回調函數無處不在,在JavaScript中,函數做爲一等公民,能夠將函數做爲對象傳遞給方法做爲實參進行調用。

4.3單線程

在Node中,JavaScript與其餘線程沒法共享任何狀態。

單線程的優勢:

  1. 不用像多進程編程那樣到處在乎狀態的同步問題;
  2. 沒有死鎖;
  3. 沒有線程上線文交換所帶來的的性能的開銷;

單線程的缺點:

  1. 沒法利用多核CPU;
  2. 錯誤會引發整個應用退出,應用的健壯性值得考驗;
  3. 大量計算佔用CPU致使沒法繼續調用異步I/O;

Web Works可以建立工做線程來進行計算,以解決JavaScript大計算阻塞UI渲染的問題。

工做線程爲了避免阻塞主線程,經過消息傳遞的方式來傳遞運行結果,這也使得工做線程不能訪問到主線程中的UI。

Node解決單線程中大計算量的方式:child_process(子線程)。

子進程:經過計算分發到各個子進程,能夠將大量計算分解掉,而後經過進程之間的事件消息來傳遞結果,這能夠很好地保持應用模型的簡單和低依賴。

4.4跨平臺

Node能夠在Windows和*nix平臺運行,得益於在操做系統與Node上層模塊系統之間構建一層平臺層架構,即libux。

5.Node的應用場景

Node的應用場景主要分爲I/O密集型和CPU密集型。

5.1I/O密集型

Node面向網絡且擅長並行I/O,可以有效地組織起更多的硬件資源,從而提供更多更好的服務。

I/O密集型的優點:

利用事件循壞的處理能力,而不是啓動每個線程爲每個請求服務,資源佔有極少。

5.2是否不擅長CPU密集型業務

Node優秀的運算能力主要來自V8的深度性能優化。

CPU密集型應用給Node帶來的挑戰:

因爲JavaScript單線程的緣由,若是長時間運行的計算(如大循環),將致使CPU時間片不能釋放,使得後續I/O沒法發起。可是適當調整和分解大型運算任務爲多個小任務,使得運算可以適時釋放,不阻塞I/O調用的發起,這樣既能夠同時受到並行異步I/O的好處,又能充分利用CPU。

Node充分利用CPU的方式:

  1. 經過編寫C/C++擴展的方式高效的利用CPU,將一些V8不能作到性能極致的地方經過C/C++來實現;
  2. 經過子進程的方式,利用進程間的消息傳遞結果,將計算和I/O分離;

CPU密集不可怕,如何合理調度是訣竅。

5.3與遺留系統和平共處

舊系統具備很是穩定的數據輸出,持續爲傳統網站服務,同時爲移動版提供數據源,Node將該數據源當作數據接口,發揮異步並行的優點。

5.4分佈式應用

阿里巴巴的數據平臺。

5.5Node的使用者

Node的使用者:

  1. 先後端編程環境統一;(雅虎)
  2. Node帶來的高性能I/O用於實時應用;(騰訊,花瓣網,蘑菇街)
  3. 並行I/O使得使用者能夠更高效地利用分佈式環境;(阿里巴巴,eBay)
  4. 並行I/O,有效利用穩定接口提高Web渲染能力;(雪球財經,LinkedIn)
  5. 雲計算平臺提供Node支持;(微軟,阿里雲,百度雲)
  6. 遊戲開發領域;(網易)
  7. 工具類應用;
相關文章
相關標籤/搜索