亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

使用 Node.js 的優(yōu)勢和劣勢

Original 2016-11-01 14:52:42 815
abstract:Node.js其實有很多大公司都在用的,比如eBay, Microsoft, 你可以去Node.js官網(wǎng)看看:node.js要想知道更詳細的列表,可以看這里:https://github.com/joyent/node/wiki/Projects,-Applications,-and-Companies-Using-Node再稍微花點時間,搜集一些網(wǎng)上資料回答第一個問題:優(yōu)勢和劣勢。要講清楚這個問

Node.js其實有很多大公司都在用的,比如eBay, Microsoft, 你可以去Node.js官網(wǎng)看看:node.js

要想知道更詳細的列表,可以看這里:https://github.com/joyent/node/wiki/Projects,-Applications,-and-Companies-Using-Node

再稍微花點時間,搜集一些網(wǎng)上資料回答第一個問題:優(yōu)勢和劣勢。
要講清楚這個問題,先講講整個Web應(yīng)用程序架構(gòu)(包括流量、處理器速度和內(nèi)存速度)中的瓶頸。瓶頸在于服務(wù)器能夠處理的并發(fā)連接的最大數(shù)量。Node.js解決這個問題的方法是:更改連接到服務(wù)器的方式。每個連接發(fā)射一個在Node.js引擎的進程中運行的事件,而不是為每個連接生成一個新的OS線程(并為其分配一些配套內(nèi)存)。Node.js不會死鎖,因為它根本不允許使用鎖,它不會直接阻塞 I/O 調(diào)用。Node.js還宣稱,運行它的服務(wù)器能支持數(shù)萬個并發(fā)連接。

Node本身運行V8 JavaScript。V8 JavaScript引擎是Google用于其Chrome瀏覽器的底層JavaScript引擎。Google使用V8創(chuàng)建了一個用C++編寫的超快解釋器,該解釋器擁有另一個獨特特征:您可以下載該引擎并將其嵌入任何應(yīng)用程序。V8 JavaScript引擎并不僅限于在一個瀏覽器中運行。因此,Node.js實際上會使用Google編寫的V8 JavaScript引擎,并將其重建為可在服務(wù)器上使用。

Node.js優(yōu)點:
1、采用事件驅(qū)動、異步編程,為網(wǎng)絡(luò)服務(wù)而設(shè)計。其實Javascript的匿名函數(shù)和閉包特性非常適合事件驅(qū)動、異步編程。而且JavaScript也簡單易學(xué),很多前端設(shè)計人員可以很快上手做后端設(shè)計。
2、Node.js非阻塞模式的IO處理給Node.js帶來在相對低系統(tǒng)資源耗用下的高性能與出眾的負載能力,非常適合用作依賴其它IO資源的中間層服務(wù)。3、Node.js輕量高效,可以認為是數(shù)據(jù)密集型分布式部署環(huán)境下的實時應(yīng)用系統(tǒng)的完美解決方案。Node非常適合如下情況:在響應(yīng)客戶端之前,您預(yù)計可能有很高的流量,但所需的服務(wù)器端邏輯和處理不一定很多。

Node.js缺點:
1、可靠性低
2、單進程,單線程,只支持單核CPU,不能充分的利用多核CPU服務(wù)器。一旦這個進程崩掉,那么整個web服務(wù)就崩掉了。

不過以上缺點可以可以通過代碼的健壯性來彌補。目前Node.js的網(wǎng)絡(luò)服務(wù)器有以下幾種支持多進程的方式:

#1 開啟多個進程,每個進程綁定不同的端口,用反向代理服務(wù)器如 Nginx 做負載均衡,好處是我們可以借助強大的 Nginx 做一些過濾檢查之類的操作,同時能夠?qū)崿F(xiàn)比較好的均衡策略,但壞處也是顯而易見——我們引入了一個間接層。
#2 多進程綁定在同一個端口偵聽。在Node.js中,提供了進程間發(fā)送“文件句柄” 的功能,這個功能實在是太有用了(貌似是yahoo 的工程師提交的一個patch) ,不明真相的群眾可以看這里: Unix socket magic
#3 一個進程負責(zé)監(jiān)聽、接收連接,然后把接收到的連接平均發(fā)送到子進程中去處理。

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


Node表現(xiàn)出眾的典型示例包括:

1、RESTful API
提供RESTful API的Web服務(wù)接收幾個參數(shù),解析它們,組合一個響應(yīng),并返回一個響應(yīng)(通常是較少的文本)給用戶。這是適合Node的理想情況,因為您可以構(gòu)建它來處理數(shù)萬條連接。它仍然不需要大量邏輯;它本質(zhì)上只是從某個數(shù)據(jù)庫中查找一些值并將它們組成一個響應(yīng)。由于響應(yīng)是少量文本,入站請求也是少量的文本,因此流量不高,一臺機器甚至也可以處理最繁忙的公司的API需求。

2、Twitter隊列
想像一下像Twitter這樣的公司,它必須接收tweets并將其寫入數(shù)據(jù)庫。實際上,每秒幾乎有數(shù)千條tweet達到,數(shù)據(jù)庫不可能及時處理高峰時段所需的寫入數(shù)量。Node成為這個問題的解決方案的重要一環(huán)。如您所見,Node能處理數(shù)萬條入站tweet。它能快速而又輕松地將它們寫入一個內(nèi)存排隊機制(例如memcached),另一個單獨進程可以從那里將它們寫入數(shù)據(jù)庫。Node在這里的角色是迅速收集tweet,并將這個信息傳遞給另一個負責(zé)寫入的進程。想象一下另一種設(shè)計(常規(guī)PHP服務(wù)器會自己嘗試處理對數(shù)據(jù)庫本身的寫入):每個tweet都會在寫入數(shù)據(jù)庫時導(dǎo)致一個短暫的延遲,因為數(shù)據(jù)庫調(diào)用正在阻塞通道。由于數(shù)據(jù)庫延遲,一臺這樣設(shè)計的機器每秒可能只能處理2000條入站tweet。每秒處理100萬條tweet則需要500個服務(wù)器。相反,Node能處理每個連接而不會阻塞通道,從而能夠捕獲盡可能多的tweets。一個能處理50000條tweet的Node機器僅需20臺服務(wù)器即可。

3、電子游戲統(tǒng)計數(shù)據(jù)
如果您在線玩過《使命召喚》這款游戲,當您查看游戲統(tǒng)計數(shù)據(jù)時,就會立即意識到一個問題:要生成那種級別的統(tǒng)計數(shù)據(jù),必須跟蹤海量信息。這樣,如果有數(shù)百萬玩家同時在線玩游戲,而且他們處于游戲中的不同位置,那么很快就會生成海量信息。Node是這種場景的一種很好的解決方案,因為它能采集游戲生成的數(shù)據(jù),對數(shù)據(jù)進行最少的合并,然后對數(shù)據(jù)進行排隊,以便將它們寫入數(shù)據(jù)庫。使用整個服務(wù)器來跟蹤玩家在游戲中發(fā)射了多少子彈看起來很愚蠢,如果您使用Apache這樣的服務(wù)器,可能會有一些有用的限制;但相反,如果您專門使用一個服務(wù)器來跟蹤一個游戲的所有統(tǒng)計數(shù)據(jù),就像使用運行Node的服務(wù)器所做的那樣,那看起來似乎是一種明智之舉。


總的來說,Node.js的應(yīng)用場景

1) 適合

JSON APIs——構(gòu)建一個Rest/JSON API服務(wù),Node.js可以充分發(fā)揮其非阻塞IO模型以及JavaScript對JSON的功能支持(如JSON.stringfy函數(shù))
單頁面、多Ajax請求應(yīng)用——如Gmail,前端有大量的異步請求,需要服務(wù)后端有極高的響應(yīng)速度
基于Node.js開發(fā)Unix命令行工具——Node.js可以大量生產(chǎn)子進程,并以流的方式輸出,這使得它非常適合做Unix命令行工具
流式數(shù)據(jù)——傳統(tǒng)的Web應(yīng)用,通常會將HTTP請求和響應(yīng)看成是原子事件。而Node.js會充分利用流式數(shù)據(jù)這個特點,構(gòu)建非??岬膽?yīng)用。如實時文件上傳系統(tǒng)transloadit
準實時應(yīng)用系統(tǒng)——如聊天系統(tǒng)、微博系統(tǒng),但Javascript是有垃圾回收機制的,這就意味著,系統(tǒng)的響應(yīng)時間是不平滑的(GC垃圾回收會導(dǎo)致系統(tǒng)這一時刻停止工作)。如果想要構(gòu)建硬實時應(yīng)用系統(tǒng),Erlang是個不錯的選擇


2) 不適合

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

如果系統(tǒng)可以匹配Node.js的適用場景,那么是時候采取具體的措施來說服老板了。


說服自己老板采用Node.js的方式

構(gòu)建一個簡單的原型——花一周時間構(gòu)建系統(tǒng)某一部分的原型是非常值得的,同時也很容易和老板在某一點達成一致,等到系統(tǒng)真的在某一部分應(yīng)用了Node.js,就是打開局面的時候
尋找開發(fā)者——首先JavaScript語言的普及度很高,一般公司都不乏Web前端工程師,而此類工程師的學(xué)習(xí)門檻也非常低。這就意味著Node.js很容易招人,或者公司就隱藏了一些高手
強大的社區(qū)支持——Node.js社區(qū)非?;钴S,吸引很多優(yōu)秀的工程師,這就意味著公司可以很容易從社區(qū)得到免費或者付費的支持
系統(tǒng)性能考慮——JavaScript引擎Google V8,加之原生異步IO模型,使得Node.js在性能的表現(xiàn)非常出色,處理數(shù)以千計的并發(fā)請求非常輕松
專業(yè)公司的支持——使用開源技術(shù)的最大問題是,原作者不承諾對其產(chǎn)品進行技術(shù)支持或者質(zhì)量保證?,F(xiàn)在Node.js已經(jīng)得到Joyent公司的贊助,這就保證了未來Node.js的發(fā)展是可持續(xù)性的


Release Notes

Popular Entries