對SCGI/Mongrel的作者的訪談(關(guān)于Rails企業(yè)級應(yīng)用、放棄SCGI等的言論) ...
去年5月份翻譯的,溫故而知新。大半年后會發(fā)現(xiàn),Mongrel的目的達(dá)到了。 英文原文出處: http://www.oreillynet.com/ruby/blog/2006/05/post.html 翻譯: alang (http://my.donews.com/alangs ) Zed Shaw 是一個在Ruby世界中聲名鶴起的開發(fā)者,它是Mongrel(一個Ruby的web服務(wù)器)的作者,因快速、穩(wěn)定、安全而出名。在這個訪談中,他討論了Mongrel,Ruby,和他的創(chuàng)建良好代碼的經(jīng)驗。 問:你是怎么來到Ruby世界中的? 答:多年前,我在開發(fā)一個怪異的控制工具--我叫它FastCST時--接觸到Ruby時。我試了一下Ruby,但是不得要領(lǐng),馬上就回到了C語言了。當(dāng) 我讀了Curt Hibbs的文章時,才了解到,Hey,他們在用這個東西在做領(lǐng)域語言(domain specific languages )。從那時起,我就開始開發(fā)一個Ruby版本的FastCST,然后我對這件事厭煩了,因為同時還有其它的幾個Rails項目。 問:許多人都在說,Ruby和Rails不適合做“企業(yè)級應(yīng)用“ ,你怎么看這個問題? 答:在回答這個問題之前,我必須要明確人們所謂“企業(yè)級應(yīng)用”的定義,可以概括為三點: 1、龐大、昂貴 2、可擴(kuò)展性,性能,滿足我的服務(wù)需求 3、法律上有保障的商業(yè)技術(shù)支持,用以掩蓋潛在的失敗。 問:Okay,讓我們一點一點的來談,Ruby和Rails都是免費的,它們怎么得到花費昂貴(的人們)的認(rèn)可? 答:他們的定義,企業(yè)級應(yīng)用意味著你要花費上百萬的money在硬件和軟件上。這么多年來,他們一直在灌輸這個觀點,是因為他們要從中得益。實際上你的解決方案要符合你的真實需求。如果你需要一個龐大的解決方案,是因為你并沒有真正了解你到底需要什么。 Rails在解決這些問題時,并不需要你花費那么多的資金。 問:那么,Rails的可以擴(kuò)展性呢? 答:那些企業(yè)級應(yīng)用中的“擴(kuò)展性”,我都可以用Mongrel來解決。首先,要把可擴(kuò)展性與高性能要區(qū)別開來,同時要回到資源的可以擴(kuò)充性上來。一旦你把這二者區(qū)分開來,你就能得到一個兩者旨顧的正確答案。 Rails的擴(kuò)展性(指的是滿足需求的可擴(kuò)展性),和其它的Web應(yīng)用框架一樣好。Mongerl讓這個工作變得非常簡單,它非??欤贖TTP。如果 你以前用過Tomcat,Resin,WebLogic或者Apache+PHP,那么Mongrel運(yùn)行Rails會達(dá)到同樣的效果。 其實我是承認(rèn)Ruby的效率不高的。Ruby的社區(qū)曾經(jīng)有意的忽略了“高性能”這個房間里的大象,他們必須正視這一點?,F(xiàn)在已經(jīng)有了一些成果,讓ruby 變得快一些。但是還有許多問題要解決。有一個叫YARV的虛擬機(jī)已經(jīng)展示了一些成果,(對Ruby)的加速已經(jīng)可以和java的解決方案(jRuby?) 相提并論了。 Ruby的閃光點不在于它的運(yùn)行速度,而是在于它的開發(fā)速度。我可以證明這一點,我在Mongrel上花了三個月的時間,它已經(jīng)是一個全功能、穩(wěn)定、高效的web應(yīng)用服務(wù)器,可以用它來支撐許多Ruby站點。如果不用Ruby,這個開發(fā)進(jìn)度是不可想像的。 Rails的問題又不同于Ruby,因為Rails自己有著優(yōu)秀的緩存機(jī)制,這在一定程度上彌補(bǔ)了Ruby的“龜速”。Rails用"page caching"、"fragment caching"來加速應(yīng)用。如果你善用這個功能,良好的規(guī)劃你的緩存方案,你可以得到和靜態(tài)頁面一樣的網(wǎng)絡(luò)性能。甚至比Java或者PHP的做得還要 好。 問:那么,商業(yè)化的技術(shù)服務(wù)呢? 答:Rails現(xiàn)在還做得不夠好,但是,情況會越來越好。會有越來越的資金投入到這個(Rails)服務(wù)領(lǐng)域來的,他們會像PHP類似的眾多服務(wù)一樣做得很好的。如果你看看PHP,最開始只有Zend一家在做這個服務(wù),后來有越來越多的大公司加入到服務(wù)的行列中來。 問:在開始做Mongrel之前,你在開發(fā)SCGI,說一說它們之間的相似之處,談?wù)勊麄內(nèi)绾螀f(xié)作,或者不協(xié)作? 答:SCGI (http://www.zedshaw.com/projects/scgi_rails/) 是我的第一次替代FastCGI (http://www.fastcgi.com/)的嘗試。SCGI的目的是高效的支撐純Ruby應(yīng)用,目的已經(jīng)達(dá)到 了。但是,SCGI在多web服務(wù)器中的支持是有限的。并且不是將來開發(fā)的選擇。Lighttpd的支持發(fā)源于對它的mod_fastcgi的突兀的修 改。Apache的SCGI模塊來自于Apache項目之外,并且Apache項目著重聲明過對FastCGI的支持要多過對SCGI的支持。事實證明了 許多人在Apache上使用SCGI都遇到了麻煩,特別在與多個后臺通信時,SCGI看上去不妙。 Mongrel最開始是作為一個SCGI的代理,來試圖解決這個問題。我寫了一個Http的解析器,然后用C寫了一個代理程序來響應(yīng)請求,再轉(zhuǎn)發(fā)給 SCGI。做到一半的時候,我意識到這個解析器寫的是如此的完美,讓我決定跳過中間部分,直接寫用Ruby寫一個web服務(wù)器。大約一天之后, Mongrel誕生了。 我的對SCGI的計劃是,簡化它,只滿足最基本的要求。SCGI里面目前有許多的DRb(分布式Ruby)管理代碼,還有一些其它人使用(濫用)的片斷, 但是,這對那些只是希望使用SCGI來工作的人來說沒有一點用處。為了支持那些目前使用SCGI的用戶,我將移植一些Mongrel的發(fā)明過去,比如 thread模型。要簡化SCGI,讓它回到最初的面目上去。 說了這么多,我想你已經(jīng)明白了我未來的工作主要是Mongrel,我認(rèn)為它是支持Ruby web應(yīng)用的比較power的方法。 如果有任何人對接手SCGI的工作感興趣,我歡迎。它在RubyForge上有個項目主頁,有興趣和有能力的人來吧,我已經(jīng)準(zhǔn)備好了交出它的管理權(quán)。 問:你在Mongrel上的工作是如何影響你在Rails上的工作的?或者相反? 答:在Mongrel中,我必須用到的Rails代碼非常的少,這是為了讓Mongrel與Rails保持比較松散的偶合,這樣當(dāng)他們(Rails)在某個release版中改了什么東西并且讓程序崩潰時,Mongrel不受影響。 當(dāng)我在用Rails上開發(fā)時,我積極的使用Mongrel,并且記下哪些方面要作改進(jìn)。這讓我可以保證Mongrel的實用價值,而不是為了純粹的學(xué)術(shù)目的作的憑空想像。 舉個例子,我在windows平臺上做開發(fā),那簡直是不可思義的痛苦,主要的原因不在于windows本身,而是開發(fā)Rails的人(DHH之流),從來 沒有深入的使用過windows(原話:從來沒有走進(jìn)過windows電腦五英尺)(譯注:DHH等人整天的show他們的Apple筆記本,什么時候想 過windows用戶)。Luis Lavena 做 的許多改進(jìn)讓事情變得好了些。對于我這樣的、還有其它許多貧窮的使用windows的粗人來說(是啊,相對于用Apple電腦的人來說,我也好窮啊。但也 不是粗人吧),我要讓Ruby on Rails更容易使用些。 (深得我心?。≡贛ac平臺上開發(fā)Rails無疑是絕佳的體驗,但,我買不起MacBook?。?問:我知道你在為Rails和Nitro camps上能運(yùn)行Mongrel而努力。目前最大的障礙是什么? 答:最好的事情是讓Mongrel變成框架無關(guān)的。我是唯一的一個能讓Rails與Mongrel協(xié)作的人。Rails核心開發(fā)團(tuán)隊的一些家伙主要是在開 發(fā)時測試Mongrel,但是我自己,Luis Lavena,其他的幾個人,幾乎做了讓Mongrel產(chǎn)品化的全部工作。我和Luis是唯一被期待用Rails來做產(chǎn)品的人。(譯注:說到這里,Zed 好像有些憤憤不平的情緒在里面) Nitro ,camping ,還有IOWA 團(tuán)隊的人,為我做了許多(mongrel適應(yīng))他們平臺上的工作。他們下載Mongrel,閱讀文檔,初期會打擾我,但是大部分時候不要我插手。 我覺得我?guī)椭鶦ampng項目最多,但實際上管理Mongrel的代碼要歸功于Camping。它回饋給我的是一個大文件的上傳/下載補(bǔ)丁,這個補(bǔ)丁放在了0.3.12.5發(fā)行版中。因為他說他是在給ParkPlace 做DVD的上傳/下載時碰到了。(這下對Mongrel做下載類的網(wǎng)站放心了) 問:Mongrel給那些使用它的項目們回報什么了呢? 答:我認(rèn)為有兩件最大的回報,一是安全性增強(qiáng),二是win32平臺的支持。 Mongrel的設(shè)計考慮了大多數(shù)HTTP服務(wù)器碰到過的安全問題,這些問題來自于過于散漫的HTTP協(xié)議手工代碼處理。Mongrel使用了一個生成處 理器(使用了Ragel :http://www.cs.queensu.ca/home/thurston/ragel/),它非常穩(wěn)固、優(yōu)秀,可以阻擋 大量的網(wǎng)絡(luò)攻擊。因為這個保護(hù)是來自于HTTP協(xié)議層的,所以使用Mongrel的任何框架都可以免費的使用它。 在EastMedia/VeriSign項目中,我們遇到了一波來自某“安全公司”的網(wǎng)絡(luò)攻擊。在這里我不想指出這家公司的名字,以免給他們做了免費的廣告。他們在沒有事先通知我們的情況下,對還沒有發(fā)布的機(jī)器,使用了一些掃描軟件。 好在Mongrel在HTTP協(xié)議層阻擋了所有的攻擊企圖,沒有費一點事就把他們踢了出去。但是就在同時,Apache卻讓這次攻擊通過了代理服務(wù)器,一點報警都沒有。 當(dāng)他們進(jìn)行了自動掃描之后,我們知道了有一些在安全公司的手寫代碼攻擊的人,被Mongrel所做的深深吸引住了。 最有趣的部分是,Mongrel所做的全部,是使用了一個基于文法和解析生成器(Ragel)的正確的解析器。其它web服務(wù)器使用人工編寫的HTTP解 析器,被證明是易受攻擊的、難于與真正的HTTP1.1 RFC規(guī)范相比較,維護(hù)起來也是非常痛苦的。使用了Ragel之后讓Mongrel非常的穩(wěn)固,不需要創(chuàng)建特殊的攻擊探測邏輯,也能阻擋這些攻擊。 其它項目從Mongrel身上得到的第二個好處,是Luis Lavena所提供的Win32支持。從Mongrel在Win32平臺上成功之后,我看到了一些說Luis讓其它項目獲得了Win32平臺兼容性的好消 息。有謠言甚至說Luis和它的朋友們?yōu)閃in32用戶打開了Ruby世界的整個大門。我希望對Daniel Berger的win32utils (http://rubyforge.org/projects/win32utils/)項目也有同樣的幫助。 問:在Mongrel背后的一個巨大力量是它速度快、幾乎是純Ruby代碼。你作了哪些優(yōu)化工作?你使用了什么工具? 答:我在優(yōu)化(也包含校驗)C代碼時,使用的主要工具是valgrind (http://valgrind.org/)和kcachegrind (http://kcachegrind.sourceforge.net/cgi-bin/show.cgi)。這兩個都是非常奇妙的免費工具。但是 Ruby在valgrind下運(yùn)行得并不好。后來我轉(zhuǎn)而使用kcachegrind。 性能檢測工具我使用httperf (http://www.hpl.hp.com/research/linux/httperf/)。當(dāng)我在做了一個期待著能有性能提升的改動后,但并沒有改觀時,我就用它重新檢測一下,再做一些其它可能有用的努力。 整個過程都用了比較科學(xué)的方法。因為我從Ruby得到的有關(guān)性能的消息非常少,我只有不斷的測試、評估、調(diào)整,不斷的重復(fù)這個過程,直到確認(rèn)性能指數(shù)真的提高了。使用統(tǒng)計學(xué)測試真正有用的地方在于,確認(rèn)每一次的變動的確有了一些不同,或者至少確保沒有帶來壞處。 我當(dāng)然也使用Ruby的性能庫(profiling library),但我只是在僅有Mongrel運(yùn)行的地方作非常有限的測試。當(dāng)Mongrel和其它的應(yīng)用框架一起運(yùn)行時,這些框架有可能拖慢了 Mongrel的速度,用Ruby的性能庫就得不到任何有用的性能信息。 舉一個例子,在一個簡單的測試中,我用YAML包來返回HTTP請求,我不能使用Ruby的性能庫,因為YAML庫是個豬,所有的性能信息都是YAML 的。Mongrel的信息只有一丁點兒。Rails或者Camping的性能測試也同樣的情況,它們自身的性能數(shù)據(jù)多過Mongrel的。 當(dāng)我對性能非常敏感的時候,我使用R工具 (http://www.r-project.org/)來作有計劃的性能數(shù)據(jù)分析。 問:最近,你做了許多工作比如單元測試,好讓Mongrel穩(wěn)定、安全。你能解釋一下你的方法論,和你使用的工具? 答:我非常贊同OpenBSD團(tuán)隊所宣稱的,安全漏洞來自于一般的缺陷,而不是來自于你在源代碼里面找到的那些特定的“安全漏洞”。這意味著我認(rèn)為我修正了我所能找到的所有安全漏洞,并且積極的對待那些潛在錯誤之后,我會在這個過程中阻止許多漏洞。 在我的所有項目中,我拼命的做到以下幾點: 1、保證代碼近可能的簡單。 2、在發(fā)布我的代碼之前,做Code review,持續(xù)的發(fā)現(xiàn) a、“丟失的斷言”-對于輸入輸出的不正確的假設(shè) b、“丟失的else”-沒有覆蓋到所有的邏輯分支 c、“期待它會中止”-死循環(huán)或者短命循環(huán)錯誤 d、“檢查返回值” e、“預(yù)料之外的異常” f、“簡單、可讀”-用可讀性強(qiáng)的代碼替換奇技淫巧的代碼;對復(fù)雜的代碼寫好文檔以便其它人可以理解 3、盡可能的做單元測試 4、外部的破壞性測試和性能測試。用不正確的輸入讓你的系統(tǒng)崩潰,高負(fù)荷,停止中間流的干擾,隨機(jī)的拆開資源??傊氡M一切辦法搞爛你的系統(tǒng)。 5、用戶可用性評價。我認(rèn)為如果一個系統(tǒng)是易于使用的,安全性問題就會少一些。但是我現(xiàn)在沒有實例來證明我的聲明。 最終的結(jié)果,Mongrel可以在HTTP協(xié)議層阻擋海量的攻擊。這也許不能說明Mongrel是固若金蕩的,但是Mongrel正在朝這條路上走。 問:Mongrel要達(dá)到的下一個目標(biāo)是什么? 答:最近的一個工作是改進(jìn)Mongrel的布署文檔。日前為止還只有一個配置Lighttpd,在各種平臺上群集的文檔。一旦這些文檔完成了,布置Mongrel會更容易。特別是那些已經(jīng)使用了其它應(yīng)用服務(wù)器比如Tomcat的人們。 問:你是如何對待那些Mongrel的反饋和建議的? 答:這些反饋都是非常積極的。最關(guān)心的問題,也是最值得考慮的問題。 許多人都問到了布署問題,我將用良好的文檔來解決。其它人問到了群集的管理,我希望Bradley Taylor(來自RailsMachine.com)將要提交的群集插件能解決這個問題。其它一些人問到了licenses,我會在FAQs中說明。 有一些頑固的問題,是關(guān)于如何處理caching和多個復(fù)雜動態(tài)web站點時的負(fù)載均衡。對于這兩個問題我目前無能為力,我會想些好點子,我希望我的下一個項目能解決“緩存問題”。 問:Mongrel有什么障礙嗎? 答:我得說,Mongrel的最大障礙,是讓它成為一個生產(chǎn)性的平臺。我每天都從社區(qū)中收到許多來信,說一他們認(rèn)為Mongrel是多么的堅如磐石,但就是沒有一點關(guān)于使用Mongerl作巨型productiong布署的消息。我覺得在未來的幾個月里,情況會好起來的。 問:你最喜歡的5個庫或者框架是什么(標(biāo)準(zhǔn)庫中的或者社區(qū)的都行)? 答:我要說說Camping框架。它有著太多的魔力,讓我不得提到它。Mongrel從它身上得到許多代碼和思想。 我使用webgen (http://webgen.rubyforge.org/)來管理Mongrel的網(wǎng)站。它可以非常容易的從一組簡單的wiki格式的頁面中生成靜態(tài)站點。 網(wǎng)絡(luò)性能測試工具,我只選httperf。它是唯一的一個能夠精確的統(tǒng)計分析,打斷整個的request/response鏈,精確的報告socket錯誤,每一個分析項都有精確的定義,容易使用的分析工具。 我也非常的喜歡Lua 語言(http://www.lua.org/),我把它當(dāng)成Ruby的一個輕量級的替代者。它非常快,簡潔,非常容易的就能embed到其它程序中去。有著和Ruby相似的、并不陌生的語法。 問:Ruby,Rails,Mongrel和Zed,它們各自的下一步計劃是什么? 答:關(guān)于Ruby的這得去問Matz,Rails的要去問David。我能說的是,我希望Ruby和Rails將會是什么樣子。 關(guān)于Ruby,我希望看到兩個結(jié)果。第一個是它能簡單的運(yùn)行在valgrind下。讓它穩(wěn)定、保持簡潔還要走很長的路。第二點是集中那些致力提高Ruby效率的人們的分散力量,到Ruby1.9的虛擬機(jī)項目上來。 對于Rails,我希望它能少些臃腫(fat);ActiveRecord能有一個像樣的的連接池系統(tǒng)。 對于“臃腫”,我相信DHH已經(jīng)計劃著把一些事情移到類似Active Web Service的plugins中去。對于ActiveRecode,需要作一些重構(gòu),讓數(shù)據(jù)庫連結(jié)池看上去和Hivernate的一樣。這對那些使用基 于連接計數(shù)license的商用數(shù)據(jù)庫用戶來說尤為重要(按數(shù)據(jù)庫連接數(shù)付license費)。 Mongrel的未來看起非常光明。我將在發(fā)布第一個production版本時,把這個進(jìn)程再推向前一步。像java一樣,我會取個“Mongrel 0.4 Enterprise Edition 1.2”的名字(像Java Enterprise Edition 1.2)。 我的下一個大項目,可能是一個caching proxy服務(wù)器,目的是讓所有的動態(tài)web應(yīng)用性能更好、更快。
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請
點擊舉報 。