為何我們要從Node.JS遷移到Ruby on Rails
聲明:這篇文章絕不是一篇討論Node.JS和Ruby on Rails孰優(yōu)孰略的檄文。它描述的只是我們做決策過(guò)程中的一些思考、決策背后的原因。兩種框架都非常優(yōu)秀,都出色的完成了它們的設(shè)計(jì)初衷,這也是為什么我們部分的模塊仍然運(yùn)行在Node.JS上的原因。
我是Node.JS的大粉絲,認(rèn)為這是一項(xiàng)讓人非常興奮的技術(shù),相信它會(huì)變的越來(lái)越流行。我對(duì)這項(xiàng)技術(shù)非常的欣賞——盡管我們最近把Targeter App從Node.JS遷移到了Ruby on Rails。
我們當(dāng)時(shí)使用Node.JS開發(fā)它的原因很簡(jiǎn)單。我有一個(gè)程序包,能很快的將我們的應(yīng)用弄上線(我們花了54小時(shí)做這個(gè)事情),相比起Ruby,我更常使用的是JavaScript。因?yàn)槲覀兊募夹g(shù)架構(gòu)牽涉到MongoDB,我的這些特長(zhǎng)只有在Node.JS環(huán)境里才會(huì)有意義。然而,隨著應(yīng)用規(guī)模的增長(zhǎng),我認(rèn)識(shí)到,選擇Node.JS來(lái)實(shí)現(xiàn)這個(gè)應(yīng)用是個(gè)錯(cuò)誤的選擇。下面讓我來(lái)概述一下其中的原因。
Node.JS很適合做那些有大量短生命期請(qǐng)求的應(yīng)用。對(duì)于傳統(tǒng)的CRUD應(yīng)用,它也很好,但不是非常的理想。在PHP,Ruby,Python語(yǔ)言里都有很成熟、優(yōu)化的很好的框架來(lái)處理這種應(yīng)用。Node.JS里的所有東西都異步執(zhí)行的理念對(duì)于CRUD應(yīng)用來(lái)說(shuō)沒(méi)有任何效果。其它語(yǔ)言里的流行的框架能提供非常好的緩存技術(shù),你所有的需求都能滿足,包括異步執(zhí)行。
Node.JS是一種非常年輕的技術(shù)框架,它的周邊程序庫(kù)都不是很成熟。我說(shuō)這些并沒(méi)有任何對(duì)那些代碼捐贈(zèng)者冒犯的意思,他們很優(yōu)秀,開發(fā)出來(lái)很多優(yōu)秀的程序庫(kù)。然而,大部分程序庫(kù)需要改進(jìn),而Node.JS的這種快速成長(zhǎng)的環(huán)境意味著每一版升級(jí)中都帶有大量的變化;當(dāng)你使用一種前沿技術(shù)時(shí),你十分有必要盡快的緊跟***的版本。這給創(chuàng)業(yè)型的企業(yè)帶來(lái)了很多的麻煩。
另外一個(gè)原因是關(guān)于測(cè)試。Node.JS里的測(cè)試框架還不錯(cuò),但跟Django或RoR平臺(tái)上的相比還是差一些。對(duì)于一個(gè)每天都有大量的代碼提交、并且在一兩天內(nèi)就要發(fā)布的應(yīng)用來(lái)說(shuō),程序不能出問(wèn)題是至關(guān)重要的,否則你為此辛苦的努力變得得不償失。沒(méi)有人愿意花一天的時(shí)間改一些***的bug。
***一點(diǎn),我們需要的是一種能緩存一切的東西,并且要盡快的實(shí)現(xiàn)。盡管我們的應(yīng)用在增長(zhǎng),每秒鐘有上萬(wàn)次的hits,但絕不會(huì)出現(xiàn)很大量的訪問(wèn)請(qǐng)求;這不是一個(gè)聊天程序!主程序最多時(shí)也就達(dá)到1000RPS,這樣的負(fù)載對(duì)于Ruby on Rails和Nginx來(lái)說(shuō)算不了什么。
如果你現(xiàn)在還在讀這篇文章,那你已經(jīng)看到了我所有要說(shuō)的了,你也許非常堅(jiān)持的想知道我們的應(yīng)用什么地方還在使用Node.JS。是這樣的,我們的應(yīng)用由兩部分組成。一是界面,用戶看到的這部分,二是負(fù)責(zé)報(bào)表管理的部分,以及做日志的功能。后者是Node.JS的一個(gè)***使用場(chǎng)景,存在有大量的短周期的請(qǐng)求。這部分的動(dòng)作需要盡快的執(zhí)行完成,甚至要在我們的數(shù)據(jù)推送還沒(méi)有完成之前。這很重要,當(dāng)請(qǐng)求執(zhí)行還未結(jié)束,瀏覽器繼續(xù)等待響應(yīng)結(jié)束,這會(huì)影響用戶使用體驗(yàn)。Node.JS的異步特性救了我們。數(shù)據(jù)要么被存入數(shù)據(jù)庫(kù),要么被處理掉,當(dāng)請(qǐng)求一旦執(zhí)行完成,瀏覽器就可以開始做其它重要的事情了。
英文原文:Why we moved from Node.JS to RoR
本文轉(zhuǎn)自:http://www.aqee.net/why-we-moved-from-Node.JS-to-ror/