Node.Js 学习随笔2
Node 旨在解決什么問(wèn)題?
Node 公開宣稱的目標(biāo)是 “旨在提供一種簡(jiǎn)單的構(gòu)建可伸縮網(wǎng)絡(luò)程序的方法”。當(dāng)前的服務(wù)器程序有什么問(wèn)題?我們來(lái)做個(gè)數(shù)學(xué)題。在 Java? 和 PHP 這類語(yǔ)言中,每個(gè)連接都會(huì)生成一個(gè)新線程,每個(gè)新線程可能需要 2 MB 配套內(nèi)存。在一個(gè)擁有 8 GB RAM 的系統(tǒng)上,理論上最大的并發(fā)連接數(shù)量是 4,000 個(gè)用戶。隨著您的客戶端基礎(chǔ)的增長(zhǎng),您希望您的 web 應(yīng)用程序支持更多用戶,這樣,您必須添加更多服務(wù)器。當(dāng)然,這會(huì)增加業(yè)務(wù)成本,尤其是服務(wù)器成本、運(yùn)輸成本和人工成本。除這些成本上升外,還有一個(gè)技術(shù)問(wèn) 題:用戶可能針對(duì)每個(gè)請(qǐng)求使用不同的服務(wù)器,因此,任何共享資源都必須在所有服務(wù)器之間共享。例如,在 Java 中,靜態(tài)變量和緩存需要在每個(gè)服務(wù)器上的 JVMs 之間共享。這就是整個(gè) web 應(yīng)用程序架構(gòu)中的瓶頸:一個(gè)服務(wù)器能夠處理的并發(fā)連接的最大數(shù)量。
Node 解決這個(gè)問(wèn)題的方法是:更改連接連接到服務(wù)器的方式。每個(gè)連接都創(chuàng)建一個(gè)進(jìn)程,該進(jìn)程不需要配套內(nèi)存塊,而不是為每個(gè)連接生成一個(gè)新的 OS 線程(并向其分配一些配套內(nèi)存)。Node 聲稱它絕不會(huì)死鎖,因?yàn)樗静辉试S使用鎖,它不會(huì)直接阻塞 I/O 調(diào)用。Node 還宣稱,運(yùn)行它的服務(wù)器能支持?jǐn)?shù)萬(wàn)個(gè)并發(fā)連接。事實(shí)上,Node 通過(guò)將整個(gè)系統(tǒng)中的瓶頸從最大連接數(shù)量更改到單個(gè)系統(tǒng)的流量來(lái)改變服務(wù)器面貌。
現(xiàn)在您有了一個(gè)能處理數(shù)萬(wàn)條并發(fā)連接的程序,那么您能通過(guò) Node 實(shí)際構(gòu)建什么呢?如果您有一個(gè) web 應(yīng)用程序需要處理這么多連接,那將是一件很 “恐怖” 的事!那是一種 “如果您有這個(gè)問(wèn)題,那么它根本不是問(wèn)題” 的問(wèn)題。在回答上面的問(wèn)題之前,我們先看看 Node 如何工作以及它被設(shè)計(jì)的如何運(yùn)行。
?
Node 肯定不是什么
沒錯(cuò),Node 是一個(gè)服務(wù)器程序。但是,它肯定不?像 Apache 或 Tomcat。那些服務(wù)器是獨(dú)立服務(wù)器產(chǎn)品,可以立即安裝并部署應(yīng)用程序。通過(guò)這些產(chǎn)品,您可以在一分鐘內(nèi)啟動(dòng)并運(yùn)行一個(gè)服務(wù)器。Node 肯定不是這種產(chǎn)品。Apache 能添加一個(gè) PHP 模塊來(lái)允許開發(fā)人員創(chuàng)建動(dòng)態(tài) web 頁(yè),使用 Tomcat 的程序員能部署 JSPs 來(lái)創(chuàng)建動(dòng)態(tài) web 頁(yè)。Node 肯定不是這種類型。
在 Node 的早期階段(當(dāng)前是 version 0.4.6),它還不是一個(gè) “運(yùn)行就緒” 的服務(wù)器程序,您還不能安裝它,向其中放置文件,擁有一個(gè)功能齊全的 web 服務(wù)器。即使是要實(shí)現(xiàn) web 服務(wù)器在安裝完成后啟動(dòng)并運(yùn)行這個(gè)基本功能,也還需要做大量工作。
?
?
Node 如何工作
Node 本身運(yùn)行 V8 JavaScript。等等,服務(wù)器上的 JavaScript?沒錯(cuò),您沒有看錯(cuò)。服務(wù)器端 JavaScript 是一個(gè)相對(duì)較新的概念,這個(gè)概念是大約兩年前在 developerWorks 上討論 Aptana Jaxer 產(chǎn)品時(shí)提到的(參見?參考資料)。盡管 Jaxer 一直沒有真正流行,但這個(gè)理念本身并不是遙不可及的 — 為何不能在服務(wù)器上使用客戶機(jī)上使用的編程語(yǔ)言?
什么使 V8?V8 JavaScript 引擎是 Google 用于他們的 Chrome 瀏覽器的底層 JavaScript 引擎。很少有人考慮 JavaScript 在客戶機(jī)上實(shí)際做了些什么?實(shí)際上,JavaScript 引擎負(fù)責(zé)解釋并執(zhí)行代碼。使用 V8,Google 創(chuàng)建了一個(gè)以 C++ 編寫的超快解釋器,該解釋器擁有另一個(gè)獨(dú)特特征;您可以下載該引擎并將其嵌入任何?應(yīng)用程序。它不僅限于在一個(gè)瀏覽器中運(yùn)行。因此,Node 實(shí)際上使用 Google 編寫的 V8 JavaScript 引擎并將其重建為在服務(wù)器上使用。太完美了!既然已經(jīng)有一個(gè)不錯(cuò)的解決方案可用,為何還要?jiǎng)?chuàng)建一種新語(yǔ)言呢?
?
它對(duì)什么有好處?
正如您此前所看到的,Node 非常適合以下情況:您預(yù)計(jì)可能有很高的流量,而在響應(yīng)客戶端之前服務(wù)器端邏輯和處理所需不一定是巨大的。Node 表現(xiàn)出眾的典型示例包括:
- RESTful API
提供 RESTful API 的 web 服務(wù)接收幾個(gè)參數(shù),解析它們,組合一個(gè)響應(yīng),并返回一個(gè)響應(yīng)(通常是較少的文本)給用戶。這是適合 Node 的理想情況,因?yàn)槟梢詷?gòu)建它來(lái)處理數(shù)萬(wàn)條連接。它還不需要大量邏輯;它只是從一個(gè)數(shù)據(jù)庫(kù)查找一些值并組合一個(gè)響應(yīng)。由于響應(yīng)是少量文本,入站請(qǐng)求時(shí)少量 文本,因此流量不高,一臺(tái)機(jī)器甚至也可以處理最繁忙的公司的 API 需求。
- Twitter 隊(duì)列
想像一下像 Twitter 這樣的公司,它必須接收 tweets 并將其寫入一個(gè)數(shù)據(jù)庫(kù)。實(shí)際上,每秒幾乎有數(shù)千條 tweets 達(dá)到,數(shù)據(jù)庫(kù)不可能及時(shí)處理高峰時(shí)段需要的寫入數(shù)量。Node 成為這個(gè)問(wèn)題的解決方案的重要一環(huán)。如您所見,Node 能處理數(shù)萬(wàn)條入站 tweets。它能迅速輕松地將它們寫入一個(gè)內(nèi)存排隊(duì)機(jī)制(例如 memcached),另一個(gè)單獨(dú)進(jìn)程可以從那里將它們寫入數(shù)據(jù)庫(kù)。Node 在這里的角色是迅速收集 tweet 并將這個(gè)信息傳遞給另一個(gè)負(fù)責(zé)寫入的進(jìn)程。想象一下另一種設(shè)計(jì) — 一個(gè)常規(guī) PHP 服務(wù)器自己試圖處理對(duì)數(shù)據(jù)庫(kù)的寫入 — 每個(gè) tweet 將在寫入數(shù)據(jù)庫(kù)時(shí)導(dǎo)致一個(gè)短暫的延遲,這是因?yàn)閿?shù)據(jù)庫(kù)調(diào)用正在阻塞通道。由于數(shù)據(jù)庫(kù)延遲,一臺(tái)這樣設(shè)計(jì)的機(jī)器每秒可能只能處理 2000 條入站 tweets。 每秒 100 萬(wàn)條 tweets 需要 500 個(gè)服務(wù)器。相反,Node 能處理每個(gè)連接而不會(huì)阻塞通道,從而能捕獲盡可能多的 tweets。一個(gè)能處理 50,000 條 tweets 的 Node 機(jī)器只需要 20 個(gè)服務(wù)器。
- 映像文件服務(wù)器
一個(gè)擁有大型分布式網(wǎng)站的公司(比如 Facebook 或 Flickr)可能會(huì)決定將所有機(jī)器只用于服務(wù)映像。Node 將是這個(gè)問(wèn)題的一個(gè)不錯(cuò)的解決方案,因?yàn)樵摴灸苁褂盟帉懸粋€(gè)簡(jiǎn)單的文件檢索器,然后處理數(shù)萬(wàn)條連接。Node 將查找映像文件,返回文件或一個(gè) 404 錯(cuò)誤,然后什么也不用做。這種設(shè)置將允許這類分布式網(wǎng)站減少它們服務(wù)映像、.js 和 .css 文件等靜態(tài)文件所需的服務(wù)器數(shù)量。
它對(duì)什么有壞處?
當(dāng)然,在某些情況下,Node 并非理想選擇。下面是 Node 不擅長(zhǎng)的領(lǐng)域:
- 動(dòng)態(tài)創(chuàng)建的頁(yè)
目前,Node 沒有提供一種默認(rèn)方法來(lái)創(chuàng)建動(dòng)態(tài)頁(yè)。例如,使用 JavaServer Pages (JSP) 技術(shù)時(shí),可以創(chuàng)建一個(gè)在?<% for (int i=0; i<20; i++) { } %>?這樣的 JSP 代碼段中包含循環(huán)的 index.jsp 頁(yè)。Node 不支持這類動(dòng)態(tài)的、HTML 驅(qū)動(dòng)的頁(yè)面。同樣,Node 不太適合作為 Apache 和 Tomcat 這樣的網(wǎng)頁(yè)服務(wù)器。因此,如果您想在 Node 中提供這樣一個(gè)服務(wù)器端解決方案,必須自己編寫整個(gè)解決方案。PHP 程序員不想在每次部署 web 應(yīng)用程序時(shí)都編寫一個(gè)針對(duì) Apache 的 PHP 轉(zhuǎn)換器,當(dāng)目前為止,這正是 Node 要求您做的。
- 關(guān)系數(shù)據(jù)庫(kù)重型應(yīng)用程序
Node 的目的是快速、異步和非阻塞。數(shù)據(jù)庫(kù)并不一定分享這些目標(biāo)。它們是同步和阻塞的,因?yàn)樽x寫時(shí)對(duì)數(shù)據(jù)庫(kù)的調(diào)用在結(jié)果生成之前將一直阻塞通道。因此,一個(gè)每個(gè) 請(qǐng)求都需要大量數(shù)據(jù)庫(kù)調(diào)用、大量讀取、大量寫入的 web 應(yīng)用程序非常不適合 Node,這是因?yàn)殛P(guān)系數(shù)據(jù)庫(kù)本身就能抵銷 Node 的眾多優(yōu)勢(shì)。(新的 NoSQL 數(shù)據(jù)庫(kù)更適合 Node,不過(guò)那完全是另一個(gè)主題了。)
?
?? 注:本文參考CSDN?以及 developerWorks作者M(jìn)ike Abernethy的文章整理而來(lái)
轉(zhuǎn)載于:https://www.cnblogs.com/iori_bao/archive/2012/02/07/2341512.html
總結(jié)
以上是生活随笔為你收集整理的Node.Js 学习随笔2的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: C++后继有人——D语言
- 下一篇: delphi Bpl 学习杂记