1. 程式人生 > >nodejs學習總結(二)-nodejs 是什麼

nodejs學習總結(二)-nodejs 是什麼

商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。
作者:FengqiAsia
連結:http://www.zhihu.com/question/19653241/answer/15993549
來源:知乎

要講清楚這個問題,先講講整個Web應用程式架構(包括流量、處理器速度和記憶體速度)中的瓶頸。瓶頸在於伺服器能夠處理的併發連線的最大數量。Node.js解決這個問題的方法是:更改連線到伺服器的方式。每個連線發射一個在Node.js引擎的程序中執行的事件,而不是為每個連線生成一個新的OS執行緒(併為其分配一些配套記憶體)。Node.js不會死鎖,因為它根本不允許使用鎖,它不會直接阻塞 I/O 呼叫。Node.js還宣稱,執行它的伺服器能支援數萬個併發連線。

Node本身執行V8 JavaScript。V8
JavaScript引擎
是Google用於其Chrome瀏覽器的底層JavaScript引擎。Google使用V8建立了一個用C++編寫的超快直譯器,該直譯器擁有另一個獨特特徵:您可以下載該引擎並將其嵌入任何應用程式。V8 JavaScript引擎並不僅限於在一個瀏覽器中執行。因此,Node.js實際上會使用Google編寫的V8 JavaScript引擎,並將其重建為可在伺服器上使用。

Node.js優點:
1、採用事件驅動、非同步程式設計,為網路服務而設計。其實Javascript的匿名函式和閉包特性非常適合事件驅動、非同步程式設計。而且JavaScript也簡單易學,很多前端設計人員可以很快上手做後端設計。
2、Node.js非阻塞模式的IO處理給Node.js帶來在相對低系統資源耗用下的高效能與出眾的負載能力,非常適合用作依賴其它IO資源的中間層服務。3、Node.js輕量高效,可以認為是資料密集型分散式部署環境下的實時應用系統的完美解決方案。Node非常適合如下情況:在響應客戶端之前,您預計可能有很高的流量,但所需的伺服器端邏輯和處理不一定很多。

Node.js缺點:
1、可靠性低
2、單程序,單執行緒,只支援單核CPU,不能充分的利用
多核CPU
伺服器。一旦這個程序崩掉,那麼整個web服務就崩掉了。

不過以上缺點可以可以通過程式碼的健壯性來彌補。目前Node.js的網路伺服器有以下幾種支援多程序的方式:

#1 開啟多個程序,每個程序繫結不同的埠,用反向代理伺服器如 Nginx 做負載均衡,好處是我們可以藉助強大的 Nginx 做一些過濾檢查之類的操作,同時能夠實現比較好的均衡策略,但壞處也是顯而易見——我們引入了一個間接層。
#2 多程序繫結在同一個埠偵聽。在Node.js中,提供了程序間傳送“檔案控制代碼” 的功能,這個功能實在是太有用了(貌似是yahoo 的工程師提交的一個patch) ,不明真相的群眾可以看這裡: Unix socket magic
#3 一個程序負責監聽、接收連線,然後把接收到的連線平均傳送到子程序中去處理。

在Node.js v0.5.10+ 中,內建了cluster 庫,官方宣稱直接支援多程序執行方式。Node.js 官方為了讓API 介面傻瓜化,用了一些比較tricky的方法,程式碼也比較繞。這種多程序的方式,不可避免的要牽涉到程序通訊、程序管理之類的東西。
此外,有兩個Node.js的module:multi-node 和 cluster ,採用的策略和以上介紹的類似,但使用這些module往往有一些缺點:
#1 更新不及時
#2 複雜龐大,往往綁定了很多其他的功能,使用者往往被綁架
#3 遇到問題難以解決

Node表現出眾的典型示例包括:

1、RESTful API
提供RESTful API的
Web服務
接收幾個引數,解析它們,組合一個響應,並返回一個響應(通常是較少的文字)給使用者。這是適合Node的理想情況,因為您可以構建它來處理數萬條連線。它仍然不需要大量邏輯;它本質上只是從某個資料庫中查詢一些值並將它們組成一個響應。由於響應是少量文字,入站請求也是少量的文字,因此流量不高,一臺機器甚至也可以處理最繁忙的公司的API需求。

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

3、電子遊戲統計資料
如果您線上玩過《使命召喚》這款遊戲,當您檢視遊戲統計資料時,就會立即意識到一個問題:要生成那種級別的統計資料,必須跟蹤海量資訊。這樣,如果有數百萬玩家同時線上玩遊戲,而且他們處於遊戲中的不同位置,那麼很快就會生成海量資訊。Node是這種場景的一種很好的解決方案,因為它能採集遊戲生成的資料,對資料進行最少的合併,然後對資料進行排隊,以便將它們寫入資料庫。使用整個伺服器來跟蹤玩家在遊戲中發射了多少子彈看起來很愚蠢,如果您使用Apache這樣的伺服器,可能會有一些有用的限制;但相反,如果您專門使用一個伺服器來跟蹤一個遊戲的所有統計資料,就像使用執行Node的伺服器所做的那樣,那看起來似乎是一種明智之舉。

總的來說,Node.js的應用場景

1) 適合

JSON APIs——構建一個Rest/JSON API服務,Node.js可以充分發揮其非阻塞IO模型以及JavaScript對JSON的功能支援(如JSON.stringfy函式)
單頁面、多Ajax請求應用——如Gmail,前端有大量的非同步請求,需要服務後端有極高的響應速度
基於Node.js開發Unix命令列工具——Node.js可以大量生產子程序,並以流的方式輸出,這使得它非常適合做Unix命令列工具
流式資料——傳統的Web應用,通常會將HTTP請求和響應看成是原子事件。而Node.js會充分利用流式資料這個特點,構建非常酷的應用。如實時檔案上傳系統transloadit
準實時應用系統——如聊天系統、微博系統,但Javascript是有垃圾回收機制的,這就意味著,系統的響應時間是不平滑的(GC垃圾回收會導致系統這一時刻停止工作)。如果想要構建硬實時應用系統,Erlang是個不錯的選擇

2) 不適合

CPU使用率較重、IO使用率較輕的應用——如視訊編碼、人工智慧等,Node.js的優勢無法發揮
簡單Web應用——此類應用的特點是,流量低、物理架構簡單,Node.js無法提供像Ruby的Rails或者Python的Django這樣強大的框架
NoSQL + Node.js——如果僅僅是為了追求時髦,且自己對這兩門技術還未深入理解的情況下,不要冒險將業務系統搭建在這兩個漂亮的名詞上,建議使用MySQL之類的傳統資料庫

如果系統可以匹配Node.js的適用場景,那麼是時候採取具體的措施來說服老闆了。

說服自己老闆採用Node.js的方式

構建一個簡單的原型——花一週時間構建系統某一部分的原型是非常值得的,同時也很容易和老闆在某一點達成一致,等到系統真的在某一部分應用了Node.js,就是開啟局面的時候
尋找開發者——首先JavaScript語言的普及度很高,一般公司都不乏Web前端工程師,而此類工程師的學習門檻也非常低。這就意味著Node.js很容易招人,或者公司就隱藏了一些高手
強大的社群支援——Node.js社群非常活躍,吸引很多優秀的工程師,這就意味著公司可以很容易從社群得到免費或者付費的支援
系統性能考慮——JavaScript引擎Google V8,加之原生非同步IO模型,使得Node.js在效能的表現非常出色,處理數以千計的併發請求非常輕鬆
專業公司的支援——使用開源技術的最大問題是,原作者不承諾對其產品進行技術支援或者質量保證。現在Node.js已經得到Joyent公司的贊助,這就保證了未來Node.js的發展是可持續性的