Node.js不是銀彈 但它仍然是顆子彈
本文的作者Craig本文的作者 Craig 是一個(gè)住在紐約的自由軟件開(kāi)發(fā)者,他在最近的看到了一篇名為《如果你正在使用Node.js,你就是誤入歧途》的文章,文章對(duì)Node.js橫加指責(zé),Craig對(duì)此表示不滿(mǎn),于是寫(xiě)下了下面的文章:
我真的不知道為什么有人這樣的討厭 Node.js。你也看見(jiàn)了網(wǎng)上有大量關(guān)于 Node.js 的文章和高調(diào)的言論,就好象 Node.js 是解決所有問(wèn)題的良方。不是的。就像現(xiàn)有的很多其它框架和語(yǔ)言一樣,它在某些事情上表現(xiàn)的很優(yōu)良,而在其它事情上卻很差。
Node.js,單從我的理解上講,它的設(shè)計(jì)目標(biāo)是更好的通過(guò)網(wǎng)絡(luò)快速、實(shí)時(shí)的傳輸少量字節(jié)信息。服務(wù)器端事件處理,即時(shí)消息應(yīng)用,實(shí)時(shí)游戲,以及協(xié)作工具,這都是可以使用它的很好的例子。拿Trello做個(gè)例子。Trello 是一個(gè)實(shí)時(shí)協(xié)作應(yīng)用程序,使用 Socket.io 和 Node.js 來(lái)實(shí)現(xiàn)客戶(hù)端之間的實(shí)時(shí)事件傳播和狀態(tài)變換。你可以使用頻繁的探詢(xún)或用ajax長(zhǎng)周期探詢(xún)來(lái)完成相同的事情,但這兩種方法在服務(wù)器端占用了不必要的worker線程,需要處理額外的請(qǐng)求。Node.js 從某方面講,本質(zhì)上正是擅長(zhǎng)做這類(lèi)事情。它的異步事件處理為基礎(chǔ)的架構(gòu)使得接收、處理、發(fā)送實(shí)時(shí)事件消息變得簡(jiǎn)單,容易,而且非常有速度。
可同時(shí),Node.js 不是、不是特別的擅長(zhǎng)做計(jì)算。比如,如果你想做一個(gè)能返回斐波那契數(shù)列(Fibonacci)序列中第n個(gè)數(shù)的API,用 Node.js 必然不是一個(gè)很好的選擇,為什么?所有的原因都在于,人們之所以要使用 Node.js 都是為了一個(gè)避免去等待什么事情。相比等待一個(gè)數(shù)據(jù)庫(kù)返回查詢(xún)結(jié)果,Node.js的做法是觸發(fā)一個(gè)查詢(xún)動(dòng)作,設(shè)置一個(gè)回調(diào)事件。這樣,當(dāng)查詢(xún)?cè)趫?zhí)行時(shí),你的程序可以去做其它事情(比如處理其它請(qǐng)求)。這使得 Node.js 看起來(lái)非常的快,通常不需要使用多個(gè)CPU。然而,在我們的這個(gè)計(jì)算斐波那契數(shù)列的例子中,程序不需要去等待任何事情。這個(gè)API返回結(jié)果的速度直接依賴(lài)于計(jì)算的速度。所以,如果用另外一種計(jì)算能力更強(qiáng)的語(yǔ)言,比如Haskell或Scala,更合適。
所有的這些說(shuō)明了什么觀點(diǎn)?觀點(diǎn)就是,如果一個(gè)框架只是為了解決任務(wù)A而設(shè)計(jì),而你卻抱怨它不能很好的完成任務(wù)B,這是愚蠢而荒謬的。Node.js 在它被設(shè)計(jì)去做的事情上表現(xiàn)的異常優(yōu)秀——所以,就不要去嚷嚷它不擅長(zhǎng)做其它事情了。
原文:http://www.aqee.net/node-js-isnt-a-silver-bullet-but-its-still-a-bullet/
【編輯推薦】
























