網頁

搜尋此網誌

2014年5月21日 星期三

Node.js 伺服端事件驅動非阻斷式平台

Node.js 是一個建於 V8 JavaScript 引擎上的一套伺服端平台,採用 JavaScript 程式語言,Node.js 使用事件驅動 (event-driven)、非阻斷式 (non-blocking) 的輸入/輸出模型,因此具有輕量級、高效率的特性,特別適合用於資料密集 (data-intensive)、即時 (real-time) 的應用領域。

為什麼創造Node.js

Node.js 的創造者瑞安‧達爾 (Ryan Dahl) 在 Node: Up and Running 一書的前言說明 Node.js 的緣起。Ryan 在2008年尋找用於建置網站的程式語言平台,他注意到推送 (server push) 這項技術,伺服器將資料推送給用戶,而不是讓使用者以輪巡 (polling) 的方式取得。當時的方式是,伺服器接收請求後,依序發送資料給用戶端,伺服器本身必須處理一堆開啟且閒置的連線,這顯然不是個好方法。

Ryan 知道 C 語言如何解決這個問題,使用 Non-Blocking Sockets 的方式可以有效降低閒置連線的成本 (overhead),因此一台伺服器將能處理上千個閒置連線並且有很高的吞吐量 (throughput)。不過這種方法有兩個問題:
  1. Ryan 不想使用 C 語言開發,他想使用動態語言。雖然任何程式語言可以用系統呼叫的方式做,但那會讓程式碼變醜,也僅是另一種Socket程式設計罷了。
  2. 他認為使用 Non-Blocking Sockets根本上是困難的,只要是 Non-Blocking 的方法就會讓開發變得困難。
在 2008 年 9 月 Google 發表 Chrome 瀏覽器和高效能 JavaScript 引擎 V8 ,執行較快的 JavaScript 引擎可以讓網頁速度更快,而 V8 確實讓網頁執行速度快了很多,突然間Google, Apple, Mozilla, 和 Microsoft 開始在 JavaScript 引擎上展開競賽。與此同時,Douglas Crockford的「JavaScript:優良部分」這本書的出版,讓鄙視的 JavaScript 變成一種重要的程式語言。

Ryan 有個偉大的想法:JavaScript 的 Non-Blocking Sockets,由於 JavaScript 沒有現成的 Socket 程式庫,所以 Ryan 可以是第一個引進這種 Socket ,並希望提供更好的介面。他所要做的事是:將高效能 JavaScript 引擎 V8 結合 C 語言開發的 Non-Blocking Sockets,Ryan 辭掉他的工作,全心全意實現這個想法。

JavaScript 與 Non-Blocking Sockets 結合得非常好,這個特點不是一開始就很明顯清楚的。閉包 (closure) 讓一切都有可能,人們可以用幾行 JavaScript 程式碼完成非常複雜的非阻斷式伺服器。 他原本擔心 Node.js 會變成不能用的平台,但隨著世界各地的社群高手開發程式庫,Ryan 舒緩他的憂慮,由於單一的 Event Loop 和完全的非阻斷式介面,程式庫將可以越加越複雜而不需要採用昂貴的執行緒。

在 Node.js 中,使用者發現預設情況下就能容易擴展 (scale)。在於系統核心不允許使用者做出很可怕的事情,例如阻斷運行中的執行緒,所以效能不會顯著地下降,比起傳統阻斷式的方式好上一個數量級 (10倍以上),可以處理更多的流量。

從上述內容我們可以知道 Non-Blocking 是一件重要的事情,為何需要 Non-Blocking 呢?傳統上,伺服器會開啟一定數量的程序(或執行緒)處理連線,當這些程序因為處理 I/O而被 block 時,這個程序將只能等待回應而不能服務其他用戶,由於伺服器開啟的程序數量有上限,阻斷的程序將嚴重影響服務的吞吐量,特別是一堆開啟且閒置的連線。如果有 Non-Blocking 的處理方式,則整體效率將可以提升。

為何要使用Node.js

Node.js 用優雅的方法解決 Blocking 問題,提供 Non-Blocking 的 I/O 程式庫,採用非同步 (Asynchronous) 的呼叫方式,利用簡單的 Event Loop 實作 ,因而具有輕量級、高效率的特性。加上用 JavaScript 為程式語言,不需要使用多程序或多執行緒的程式架構,大幅降低學習門檻,提高開發成效。

了解這些開發背景,那些地方適合使用 Node.js 呢?我想大概有這些地方:
  1. 需要伺服端推送資料的應用程式。(長時間的閒置連線)
  2. 資料處理密集的應用程式。(I/O次數非常高)
  3. 具有擴展需求、大量並行處理、即時性的應用程式。
  4. 統一以 JavaScript 程式語言開發的應用程式。
這些應用特性符合 Node.js 的長處,也才能發揮 Node.js 的效益。如果是開發傳統的網頁應用程式(如留言板、部落格等),不妨以PHP、Python的框架平台進行開發,畢竟這些資源比  Node.js 還多,也比較純熟,使用上會更有幫助些。

參考書籍:
Tom Hughes-Croucher & Mike Wilson, Node: Up and Running, O'Reilly Media, 2012

如何安裝 Node.js

請先到下載頁面下載 Node.js ,如果你的系統是 Windows,那就用 Windows Installer (.msi) 吧!這是最簡單的安裝方式。如果你的系統是 Linux ,可以選擇下載 Source Code 自己編譯,或是下載 Binaries (注意你的系統是 32 或 64 位元)。以下指令是在 Ubuntu 上自己編譯 Node.js,提供大家參考。

apt-get -y install build-essential
tar xzvf node-v0.10.28.tar.gz
cd node-v0.10.28
./configure
make
sudo make install

node -v

npm

###

沒有留言:

張貼留言

熱門文章