淺析Node.js:一個“編碼就緒”伺服器

來源:互聯網
上載者:User

轉載:http://sd.csdn.net/a/20110617/299900.html

 

導讀:
Node是一個伺服器端
JavaScript解譯器,它將改變伺服器應該如何工作的概念。它的目標是協助程式員構建高度可伸縮的應用程式,編寫能夠處理數萬條同時串連到一個(只
有一個)物理機的串連代碼。本文探究了Node.js能解決哪些問題,它如何工作,如何運行一個簡單應用程式,最後,Node何時是以及何時不是一個好的
解決方案。

Node旨在解決什麼問題?

Node公開宣稱的目標是“旨在提供一種簡單的構建可伸縮網路程式的方法”。當前的伺服器程式有什麼問題?我們來做個數學題。在Java和PHP這
類語言中,每個串連都會產生一個新線程,每個新線程可能需要 2 MB 配套記憶體。在一個擁有8GB
RAM的系統上,理論上最大的並發串連數量是4,000個使用者。隨著您的用戶端基礎的增長,您希望您的web應用程式支援更多使用者,這樣,您必須添加更多
伺服器。當然,這會增加業務成本,尤其是伺服器成本、運輸成本和人工成本。除這些成本上升外,還有一個技術問題:使用者可能針對每個請求使用不同的伺服器,
因此,任何共用資源都必須在所有伺服器之間共用。例如,在Java中,靜態變數和緩衝需要在每個伺服器上的JVMs之間共用。這就是整個web應用程式架
構中的瓶頸:一個伺服器能夠處理的並發串連的最大數量。

Node解決這個問題的方法是:更改串連串連到伺服器的方式。每個串連都建立一個進程,該進程不需要配套記憶體塊,而不是為每個串連產生一個新的OS
線程(並向其分配一些配套記憶體)。Node聲稱它絕不會死結,因為它根本不允許使用鎖,它不會直接阻塞I/O調用。Node還宣稱,運行它的伺服器能支援
數萬個並發串連。事實上,Node通過將整個系統中的瓶頸從最大串連數量更改到單個系統的流量來改變伺服器面貌。

現在您有了一個能處理數萬條並發串連的程式,那麼您能通過Node實際構建什麼呢?如果您有一個web應用程式需要處理這麼多串連,那將是一件很
“恐怖” 的事!那是一種“如果您有這個問題,那麼它根本不是問題”
的問題。在回答上面的問題之前,我們先看看Node如何工作以及它被設計的如何運行。

Node肯定不是什麼

沒錯,Node是一個伺服器程式。但是,它肯定不像Apache或Tomcat。那些伺服器是獨立伺服器產品,可以立即安裝並部署應用程式。通過這
些產品,您可以在一分鐘內啟動並運行一個伺服器。Node肯定不是這種產品。Apache能添加一個PHP模組來允許開發人員建立動態web頁,使用
Tomcat的程式員能部署JSPs來建立動態web頁。Node肯定不是這種類型。

在Node的早期階段(當前是version 0.4.6),它還不是一個“運行就緒”的伺服器程式,您還不能安裝它,向其中放置檔案,擁有一個功能齊全的web伺服器。即使是要實現web伺服器在安裝完成後啟動並運行這個準系統,也還需要做大量工作。

Node如何工作

Node本身運行V8 JavaScript。等等,伺服器上的JavaScript?沒錯,您沒有看錯。伺服器端JavaScript 是一個相對較新的概念,這個概念是大約兩年前在developerWorks上討論Aptana Jaxer產品時提到的(參見參考資料
)。儘管Jaxer一直沒有真正流行,但這個理念本身並不是遙不可及的 — 為何不能在伺服器上使用客戶機上使用的程式設計語言?

什麼使 V8?V8
JavaScript引擎是Google用於他們的Chrome瀏覽器的底層JavaScript引擎。很少有人考慮JavaScript在客戶機上實際
做了些什嗎?實際上,JavaScript引擎負責解釋並執行代碼。使用V8,Google建立了一個以C++編寫的超快解譯器,該解譯器擁有另一個獨特
特徵;您可以下載該引擎並將其嵌入任何 應用程式。它不僅限於在一個瀏覽器中運行。因此,Node實際上使用Google編寫的V8
JavaScript引擎並將其重建為在伺服器上使用。太完美了!既然已經有一個不錯的解決方案可用,為何還要建立一種新語言呢?

Node對什麼有好處?

到此為止,應該能夠回答“Node是什麼”
這個問題了,但您可能還不清楚什麼時候應該使用它。這是一個需要提出的重要問題,因為Node對有一些東西有好處,但相反,對另一些東西而言,目前
Node可能不是一個好的解決方案。您需要小心決定何時使用Node,因為在錯誤的情況下使用它可能會導致一個多餘編碼的 LOT。

正如您此前所看到的,Node非常適合以下情況:您預計可能有很高的流量,而在響應用戶端之前伺服器端邏輯和處理所需不一定是巨大的。Node表現出眾的典型樣本包括:

  • RESTful API

      提供RESTful
API的web服務接收幾個參數,解析它們,組合一個響應,並返回一個響應(通常是較少的文本)給使用者。這是適合Node的理想情況,因為您可以構建它來
處理數萬條串連。它還不需要大量邏輯;它只是從一個資料庫尋找一些值並組合一個響應。由於響應是少量文本,入站請求時少量文本,因此流量不高,一台機器甚
至也可以處理最繁忙的公司的API需求。

  • Twitter隊列

      想像一下像Twitter這樣的公司,它必須接收tweets並將其寫入一個資料庫。實際上,每秒幾乎有數千條 tweets
達到,資料庫不可能及時處理高峰時段需要的寫入數量。Node成為這個問題的解決方案的重要一環。如您所見,Node能處理數萬條入站tweets。它能
迅速輕鬆地將它們寫入一個記憶體排隊機制(例如
memcached),另一個單獨進程可以從那裡將它們寫入資料庫。Node在這裡的角色是迅速收集tweet並將這個資訊傳遞給另一個負責寫入的進程。
想象一下另一種設計 — 一個常規 PHP 伺服器自己試圖處理對資料庫的寫入 —
每個tweet將在寫入資料庫時導致一個短暫的延遲,這是因為資料庫調用正在阻塞通道。由於資料庫延遲,一台這樣設計的機器每秒可能只能處理2000條入
站tweets。每秒100萬條tweets需要500個伺服器。相反,Node能處理每個串連而不會阻塞通道,從而能捕獲儘可能多的tweets。一個
能處理50,000 條tweets的Node機器只需要20個伺服器。

  • 映像檔案伺服器

      一個擁有大型分布式網站的公司(比如 Facebook 或
Flickr)可能會決定將所有機器只用於服務映像。Node將是這個問題的一個不錯的解決方案,因為該公司能使用它編寫一個簡單的檔案檢索器,然後處理
數萬條串連。Node將尋找映像檔案,返迴文件或一個404錯誤,然後什麼也不用做。這種設定將允許這類分布式網站減少它們服務映像、.js和
.css檔案等靜態檔案所需的伺服器數量。

它對什麼有壞處?

當然,在某些情況下,Node並非理想選擇。下面是Node不擅長的領域:

  • 動態建立的頁

      目前,Node沒有提供一種預設方法來建立動態網頁。例如,使用JavaServer Pages (JSP) 技術時,可以建立一個在
<% for (int i=0; i<20; i++) { } %> 這樣的JSP程式碼片段中包含迴圈的index.jsp
頁。Node不支援這類動態、HTML驅動的頁面。同樣,Node不太適合作為Apache和Tomcat這樣的網頁伺服器。因此,如果您想在Node
中提供這樣一個伺服器端解決方案,必須自己編寫整個解決方案。PHP程式員不想在每次部署web應用程式時都編寫一個針對Apache的PHP轉換器,當
目前為止,這正是Node要求您做的。

  • 關聯式資料庫重型應用程式

     
Node的目的是快速、非同步和非阻塞。資料庫並不一定分享這些目標。它們是同步和阻塞的,因為讀寫時對資料庫的調用在結果產生之前將一直阻塞通道。因此,
一個每個請求都需要大量資料庫調用、大量讀取、大量寫入的web應用程式非常不適合Node,這是因為關聯式資料庫本身就能抵銷Node的眾多優勢。(新的
NoSQL資料庫更適合Node,不過那完全是另一個主題了。)

結語

問題是“什麼是Node.js?” 應該已經得到解答。
閱讀本文之後,您應該能通過幾個清晰簡潔的句子回答這個
問題。如果這樣,那麼您已經走到了許多編碼員和程式員的前面。我和許多人都談論過Node,但它們對
Node究竟是什麼一直很迷惑。可以理解,他們具有的是Apache的思維方式 —
伺服器是一個應用程式,將HTML檔案放入其中,一切就會正常運轉。而Node是目的驅動的。它是一個軟體程式,使用JavaScript來允許程式員輕
鬆快速地建立快速、可伸縮的web伺服器。Apache是運行就緒的,而ode是編碼就緒的。

Node完成了它提供高度可伸縮伺服器的目標。它並不分配一個 “每個串連一個線程” 模型,而是使用一個 “每個串連一個流程”
模型,只建立每個串連需要的記憶體。它使用Google的一個非常快速的JavaScript引擎:V8引擎。它使用一個事件驅動設計來保持代碼最小且易於
閱讀。所有這些因素促成了Node的理想目標 — 編寫一個高度可伸縮的解決方案變得比較容易。

與理解Node是什麼同樣重要的是,理解它不是什麼。Node並不是Apache的一個替代品,後者旨在使PHP web應用程式更容易伸縮。事實確實如此。在Node的這個初始階段,大配量序員使用它的可能性不大,但在它能發揮作用的情境中,它的表現非常好。

將來應該期望從Node得到什麼呢?這也許是本文引出的最重要的問題。既然您知道了它現在的作用,您應該會想知道它下一步將做什麼。在接下來的一年
中,我期待著Node提供與現有的第三方支援庫更好地整合。現在,許多第三方程式員已經研發了用於Node的外掛程式,包括添加檔案伺服器支援和MySQL支
持。希望Node開始將它們整合到其核心功能中。最後,我還希望
Node支援某種動態網頁面模組,這樣,您就可以在HTML檔案中執行在PHP和JSP(也許是一個NSP,一個Node伺服器頁)中所做的操作。最後,希
望有一天會出現一個 “部署就緒”
的Node伺服器,可以下載和安裝,只需將您的HTML檔案放到其中,就像使用Apache或Tomcat那樣。Node現在還處於初始階段,但它發展得
很快,可能不久就會出現在您的視野中。

註:
本文內容是根據developerWorks作者Mike Abernethy的文章

理而來的,在Michael
Abernethy的13年技術生涯中,他與各種不同的技術和客戶打交道。他目前是一名自由程式員,擅長Java高可用性和jQuery。他現在專註於富
Internet 應用程式,試圖同時實現應用程式的複雜性和簡單性。他空閑時常常去打高爾夫球,更確切地說,是在灌木叢中尋找他打飛的高爾夫球。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.