Node誕生於2009年3月。前端
Node的別名:Nodejs、NodeJS、Node.js。編程
設計高性能Web服務器的幾個要點:事件驅動、非阻塞I/O。後端
考慮到高性能、符合事件驅動、沒有歷史包袱這三個主要緣由,JavaScript成爲了Node的實現語言。瀏覽器
Node能夠構建服務器、客戶端、命令行工具,Node發展爲一個強制不共享任何資源的單線程、單進程系統,其目的是成爲一個構建快速、可伸縮的網絡應用平臺。性能優化
Node自身很是簡單,經過通訊協議來組織許多Node,很是容易經過擴展來達到構建大型網絡應用的目的。服務器
每個Node進程都構建成這個網絡應用的一個節點,這是它名字所含意義的真諦。網絡
Node打破了過去JavaScript只能在瀏覽器運行的局面,先後端編程環境統一,可大大減小先後端轉換所須要的上下文交換代價。架構
做爲後端JavaScript運行的平臺,Node保留前端瀏覽器JavaScript中那些熟悉的接口,沒有改變語言的任何特性,依舊依賴做用域和原型鏈,區別在於它將前端中普遍運用的思想遷移到服務端。異步
異步調用中對於結果值的捕獲是符合"Don't call me, I will call you"原則。分佈式
在Node中,絕大多數的操做都以異步的方式進行調用。
事件的編程方式具備輕量級、鬆耦合、只關注事務點等優點。
回調函數無處不在,在JavaScript中,函數做爲一等公民,能夠將函數做爲對象傳遞給方法做爲實參進行調用。
在Node中,JavaScript與其餘線程沒法共享任何狀態。
單線程的優勢:
單線程的缺點:
Web Works可以建立工做線程來進行計算,以解決JavaScript大計算阻塞UI渲染的問題。
工做線程爲了避免阻塞主線程,經過消息傳遞的方式來傳遞運行結果,這也使得工做線程不能訪問到主線程中的UI。
Node解決單線程中大計算量的方式:child_process(子線程)。
子進程:經過計算分發到各個子進程,能夠將大量計算分解掉,而後經過進程之間的事件消息來傳遞結果,這能夠很好地保持應用模型的簡單和低依賴。
Node能夠在Windows和*nix平臺運行,得益於在操做系統與Node上層模塊系統之間構建一層平臺層架構,即libux。
Node的應用場景主要分爲I/O密集型和CPU密集型。
Node面向網絡且擅長並行I/O,可以有效地組織起更多的硬件資源,從而提供更多更好的服務。
I/O密集型的優點:
利用事件循壞的處理能力,而不是啓動每個線程爲每個請求服務,資源佔有極少。
Node優秀的運算能力主要來自V8的深度性能優化。
CPU密集型應用給Node帶來的挑戰:
因爲JavaScript單線程的緣由,若是長時間運行的計算(如大循環),將致使CPU時間片不能釋放,使得後續I/O沒法發起。可是適當調整和分解大型運算任務爲多個小任務,使得運算可以適時釋放,不阻塞I/O調用的發起,這樣既能夠同時受到並行異步I/O的好處,又能充分利用CPU。
Node充分利用CPU的方式:
CPU密集不可怕,如何合理調度是訣竅。
舊系統具備很是穩定的數據輸出,持續爲傳統網站服務,同時爲移動版提供數據源,Node將該數據源當作數據接口,發揮異步並行的優點。
阿里巴巴的數據平臺。
Node的使用者: