深入淺出Node.js(一):什麼是Node.js(下)

Javascript在動態語言中性能較好,有開發人員對Javacript、Python、Ruby等動態語言做了性能分析,發現Javascript的性能要好於其他語言,再加上V8引擎也是同類的佼佼者,所以Node.js的性能也受益其中。

Node.js發展簡史

2009年2月,Ryan Dahl在博客上宣佈準備基於V8創建一個輕量級的Web服務器並提供一套庫。

2009年5月,Ryan Dahl在GitHub上發佈了最初版本的部分Node.js包,隨後幾個月裏,有人開始使用Node.js開發應用。

2009年11月和2010年4月,兩屆JSConf大會都安排了Node.js的講座。

2010年年底,Node.js獲得雲計算服務商Joyent資助,創始人Ryan Dahl加入Joyent全職負責Node.js的發展。

2011年7月,Node.js在微軟的支持下發布Windows版本。

Node.js應用案例

雖然Node.js誕生剛剛兩年多,但是其發展勢頭逐漸趕超Ruby/Rails,我們在這裏列舉了部分企業應用Node.js的案例,聽聽來自客戶的聲音。

在社交網站LinkedIn最新發布的移動應用中,NodeJS是該移動應用的後臺基礎。LinkedIn移動開發主管Kiran Prasad對媒體表示,其整個移動軟件平臺都由NodeJS構建而成:

LinkedIn內部使用了大量的技術,但是在移動服務器這一塊,我們完全基於Node。

(使用它的原因)第一,是因爲其靈活性。第二,如果你瞭解Node,就會發現它最擅長的事情是與其他服務通信。移動應用必須與我們的平臺API和數據庫交互。我們沒有做太多數據分析。相比之前採用的Ruby on Rails技術,開發團隊發現Node在性能方面提高很多。他們在每臺物理機上跑了15個虛擬服務器(15個實例),其中4個實例即可處理雙倍流量。容量評估基於負載測試的結果。

企業社會化服務網站Yammer則利用Node創建了針對其自身平臺的跨域代理服務器,第三方的開發人員可以通過該服務器實現從自身域託管的 Javascript代碼與Yammer平臺API的AJAX通信。Yammer平臺技術主管Jim Patterson對Node的優點和缺點提出了自己的看法:

(優點)因爲Node是基於事件驅動和無阻塞的,所以非常適合處理併發請求,因此構建在Node上的代理服務器相比其他技術實現(如Ruby)的服務器表現要好得多。此外,與Node代理服務器交互的客戶端代碼是由javascript語言編寫的,因此客戶端和服務器端都用同一種語言編寫,這是非常美妙的事情。

(缺點)Node是一個相對新的開源項目,所以不太穩定,它總是一直在變,而且缺少足夠多的第三方庫支持。看起來,就像是Ruby/Rails當年的樣子。

知名項目託管網站GitHub也嘗試了Node應用。該Node應用稱爲NodeLoad,是一個存檔下載服務器(每當你下載某個存儲分支的 tarball或者zip文件時就會用到它)。GitHub之前的存檔下載服務器採用Ruby編寫。在舊系統中,下載存檔的請求會創建一個Resque任務。該任務實際上在存檔服務器上運行一個git archive命令,從某個文件服務器中取出數據。然後,初始的請求分配給你一個小型Ruby Sinatra應用等待該任務。它其實只是在檢查memcache flag是否存在,然後再重定向到最終的下載地址上。舊系統運行大約3個Sinatra實例和3個Resque worker。GitHub的開發人員覺得這是Node應用的好機會。Node基於事件驅動,相比Ruby的阻塞模型,Node能夠更好地處理git存檔。在編寫新下載服務器過程中,開發人員覺得Node非常適合該功能,此外,他們還裏利用了Node庫socket.io來監控下載狀態。

不僅在國外,Node的優點也同樣吸引了國內開發人員的注意,淘寶就實際應用了Node技術:

MyFOX 是一個數據處理中間件,負責從一個MySQL集羣中提取數據、計算並輸出統計結果。用戶提交一段SQL語句,MyFOX根據該SQL命令的語義,生成各個數據庫分片所需要執行的查詢語句,併發送至各個分片,再將結果進行彙總和計算。 MyFOX的特點是CPU密集,無文件IO,並只處理只讀數據。起初MyFOX使用PHP編寫,但遇到許多問題。例如PHP是單線程的,MySQL又需要阻塞查詢,因此很難併發請求數據,後來的解決方案是使用nginx和dirzzle,並基於HTTP協議實現接口,並通過curl_multi_get命 令進行請求。不過MyFOX項目組最終還是決定使用Node.js來實現MyFOX。

選擇Node.js有許多方面的原因,比如考慮了興趣及社區發展,同時也希望可以提高併發能力,榨乾CPU。例如,頻繁地打開和關閉連接會讓大量端口處於等待狀態,當併發數量上去之後,時常會因爲端口不夠用(處於TIME_WAIT狀態)而導致連接失敗。之前往往是通過修改系統設置來減少等待時間以繞開這個錯誤,然而使用連接池便可以很好地解決這個問題。此外,以前MyFOX會在某些緩存失效的情況下出現十分密集的訪問壓力,使用 Node.js便可以共享查詢狀態,讓某些請求“等待片刻”,以便系統重新填充緩存內容。

小結

本文簡要介紹了Node.js的基本知識,包括概念、特點、歷史、案例等等。作爲一個僅僅2歲的平臺,Node.js的發展勢頭有目共睹,越來越多的企業開始關注並嘗試Node.js,前後端開發人員應該瞭解相關的內容。

來自:http://tech.ddvip.com/2012-02/1329293442171950_2.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章