Node.Js 学习随笔2
Node 旨在解決什么問題?
Node 公開宣稱的目標是 “旨在提供一種簡單的構建可伸縮網絡程序的方法”。當前的服務器程序有什么問題?我們來做個數學題。在 Java? 和 PHP 這類語言中,每個連接都會生成一個新線程,每個新線程可能需要 2 MB 配套內存。在一個擁有 8 GB 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 表現出眾的典型示例包括:
- 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,不過那完全是另一個主題了。)
?
?? 注:本文參考CSDN?以及 developerWorks作者Mike Abernethy的文章整理而來
轉載于:https://www.cnblogs.com/iori_bao/archive/2012/02/07/2341512.html
總結
以上是生活随笔為你收集整理的Node.Js 学习随笔2的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++后继有人——D语言
- 下一篇: delphi Bpl 学习杂记