|
TekPub是一個面向開發(fā)人員的站點(diǎn),致力于為開發(fā)人員提供一系列主題的在線培訓(xùn),主題范圍非常廣泛,從微軟的O/R Mapping框架Microsoft Entity Framework,到如何使用Ruby on Rails技術(shù)編寫自己的日志引擎等內(nèi)容都有涉及。該網(wǎng)站是由前微軟員工Rob Conery與Lounge的老板James Avery創(chuàng)立的。
TekPub是個很有趣的學(xué)習(xí)案例,公司開始時使用ASP.NET MVC框架,之后很快遷移到了Ruby on Rails上。InfoQ與Rob和James探討了這次遷移之旅。
InfoQ:和我們談?wù)凾ekPub吧,對于哪些不熟悉你們的產(chǎn)品的讀者,TekPub意味著什么?
James Avery(簡稱JA):TekPub為程序員提供了高質(zhì)量的技術(shù)視頻演示。我們的目標(biāo)是幫助一些人在幾個小時內(nèi)學(xué)習(xí)一項新技術(shù),主要方式就是觀看一些牛人的演講視頻。他們對演講的技術(shù)非常了解,演講內(nèi)容不僅僅覆蓋基礎(chǔ)知識,還深入到了這些具體技術(shù)在真實項目中的應(yīng)用。與其等幾個月才拿到一本很可能已經(jīng)過時的書,還不如訂閱我們的產(chǎn)品立刻獲得新技術(shù)的提升。我們已經(jīng)完成ASP.NET MVC 2的系列視頻,但目前還沒有與這個主題相關(guān)的書籍。
InfoQ: James Avery和Rob Conery有什么來頭?
JA:除了TekPub之外,我還搞了幾個科技創(chuàng)業(yè)公司。我運(yùn)營了Lounge和Ruby Row廣告網(wǎng)絡(luò),分別關(guān)注.NET和Ruby開發(fā)人員。我還幫助運(yùn)營DotNETKicks公司,一個.NET開發(fā)人員的社區(qū)網(wǎng)站。我最新的關(guān)注點(diǎn)是Adzerk,這是我自己構(gòu)建的Web服務(wù)器,用來有效的運(yùn)行Lounge和Ruby Row,讓其他人來使用。從90年代中期我就開始使用Web,.NET發(fā)布后,我開始轉(zhuǎn)移到微軟的技術(shù)上。最近我一直再用.NET、Ruby on Rails和MongoDB等,還有任何讓我感興趣的技術(shù)。
Rob Conery(簡稱RC):我自1991年以來一直從事軟件行業(yè),做一些數(shù)據(jù)庫,CGI和HTML之類的開發(fā)。從1997年開始使用ASP,從那之后一直堅持使用微軟技術(shù)。2006年我開始為微軟工作,主要職責(zé)是幫助人們學(xué)習(xí)和使用新的ASP.NET MVC框架。2009年我離開了微軟開始做些不同的事情(更多的關(guān)注開源平臺),之后和James Avery一起創(chuàng)辦了Tekpub。
InfoQ:能介紹一下你們剛創(chuàng)業(yè)時TekPub的架構(gòu)嗎?
JA:TekPub的第一個版本是基于Ruby on Rails構(gòu)建的,當(dāng)時Rob花費(fèi)了整整一個周末的時間。之后我們仔細(xì)的進(jìn)行了討論,最終決定放棄這個版本。由于我們都很了解ASP.NET MVC技術(shù),所以決定用ASP.NET MVC來實現(xiàn)TekPub。我相信,當(dāng)開始一項新業(yè)務(wù)時是沒有時間嘗試和學(xué)習(xí)新技術(shù)的。Rob和我過去都寫過Rails應(yīng)用,但真正使用時,我們都覺得ASP.NET MVC比Rails好得多。于是我們放棄了Rails轉(zhuǎn)而使用ASP.NET MVC技術(shù)開發(fā)網(wǎng)站。后來我們?nèi)∠撜军c(diǎn)并重新構(gòu)建它,因為它已經(jīng)變得太復(fù)雜。在我們開始進(jìn)行技術(shù)遷移時,TekPub的版本是3,主要技術(shù)是ASP.NET MVC,C#和MS SQL Server。
InfoQ:從網(wǎng)站使用者的角度你遇到了什么樣的挑戰(zhàn)?從網(wǎng)站管理者的角度呢?
RC:最初,或者說網(wǎng)站運(yùn)營的第一天,我們就遇到了網(wǎng)絡(luò)帶寬的問題。我們在Twitter上宣布網(wǎng)站開張,這直接導(dǎo)致我們的ISP由于帶寬的需求被淘汰。他們毫不夸張的讓工程師“坐在開關(guān)上”來保證網(wǎng)站的正常運(yùn)行,但最終網(wǎng)站還是停了。之后兩小時內(nèi)我把我們所有免費(fèi)的內(nèi)容都放到了亞馬遜的S3上,這對我們幫助非常大。
還有,一小部分人不喜歡Silverlight,不愿意安裝它。我們在Reddit上投放了廣告,人們卻簡單的認(rèn)為我們的網(wǎng)站是微軟資助的一個什么東西——這是和我們的目標(biāo)背離的。對我們來說這是個大問題。
JA:ASP.NET MVC運(yùn)行的很好,Windows架構(gòu)也不錯。事實上我們在這個領(lǐng)域沒碰到什么麻煩。主要的挑戰(zhàn)來自于我們決定使用Silverlight播放流媒體。很多用戶不愿意安裝Silverlight,這給我們帶來很大的困擾。與Rob確認(rèn)后,我們不得不遷移到Flash技術(shù)。遷移到Flash之后還沒有一個人抱怨過。我們希望HTML5很快面世。
InfoQ:架構(gòu)如何應(yīng)對用戶需求?
RC:我們從來沒有遇到底層框架的問題——它處理的很好。這并不是一個負(fù)載非常大的網(wǎng)站(在功能方面),所以我們從沒真正遇到那方面的問題
InfoQ:既然平臺運(yùn)行的非常好,為什么要做架構(gòu)的改變呢?
RC:成本。我們加入了微軟的BizSpark計劃,而且它的確給了我們一個很棒的起點(diǎn),但是隨著項目的發(fā)展,我們發(fā)現(xiàn),3年以后,從我們使用的數(shù)據(jù)庫到開發(fā)環(huán)境,每一件事情都需要付費(fèi)。而且我們很可能需要為Silverlight(使用流媒體)提供一個分離的服務(wù)器,用來播放視頻,這樣就需要再支付一個使用許可的費(fèi)用——此外,為了使視頻流平滑輸出,我們還需要買媒體編碼器。
對于大公司來說,這的確不算什么,但當(dāng)我們坐下來看帳單時——噢,這可是個5位數(shù)啊。最終我們發(fā)現(xiàn),根據(jù)我們現(xiàn)有的業(yè)務(wù)規(guī)模,是無法承擔(dān)這筆費(fèi)用的。
不僅僅如此,James和我都清楚Rails非常好用。我們意識到可以把所有事情都推到云端,只需支付很低的價格就可以獲得很好的流媒體和吞吐量。
JA:正如Rob提到的,成本壓力是其中一個因素,BizSpark是很好,但卻像一個定時炸彈。我覺得比成本更重要的推動因素是每天我們希望使用什么技術(shù)。ASP.NET MVC和.NET技術(shù)在某些領(lǐng)域是有缺陷的,而這些領(lǐng)域的工作對我們非常重要。在.NET上做測試就并不讓人滿意,你不得不大費(fèi)周章才能以正確的方式設(shè)計你的應(yīng)用,處理測試,而且編寫測試本身也不像其他語言那么清晰和有用。另一個問題是部署,雖然有很多種方式可以處理,但確實不如Capistrano好用。
InfoQ:那么現(xiàn)在TekPub平臺是什么樣子的?
RC:我們遷移到Rails 2.3.5,使用了針對MongoDB的MongoMapper技術(shù)。我們做了一個報告設(shè)置,用MySQL來跟蹤反饋使用DataMapper的情況。我們還植入了New Relic RPM,來跟蹤我們的站點(diǎn)和健康情況——所有的這些,平均成本僅僅是我們使用BizSpark的1%。
JA:這解決了我們所有與使用許可有關(guān)的問題,我們每月需要為Amazon EC2平臺上的一個Ubuntu實例支付$80,這是保留實例后的費(fèi)用。Rob和我都很喜歡這種技術(shù),我們使用Cucumber做了大量測試,用Capistrano部署變得非常簡單容易。
InfoQ: 能給我們講講你們的技術(shù)架構(gòu)細(xì)節(jié)嗎?
RC:使用Rails 2.3.5及其對應(yīng)的MongoMapper/MongoDB,使用MySQL 5.2和O/R Mapping工具DataMapper。我們還用了New Relic RPM工具,非常棒。
JA:我們選擇使用Rails 2.3.5和Ruby 1.8.7,通過Passenger運(yùn)行Rails應(yīng)用。在數(shù)據(jù)庫方面,我們通過使用優(yōu)秀的MongoMapper gem訪問MongoDB 1.3.4。我們還通過DataMapper實現(xiàn)MySQL 5.1的數(shù)據(jù)訪問。我們并不使用很多其他的Gem,只是用Pony發(fā)郵件,rpx_now訪問RPX做身份驗證。同時我倆還都是HAML的愛好者,所有的界面都是基于HAML實現(xiàn)的。
InfoQ:你們的EC2怎么配置的?
JA:所有的內(nèi)容都是托管在云端,相當(dāng)于一個比較小的服務(wù)器,也就是一個單獨(dú)的EC2實例(虛擬雙核,2個計算單元,7G內(nèi)存)。在這個實例上運(yùn)行著Ubuntu 9.1(karmic)和Apache。我希望未來有更多的資源,你知道,運(yùn)行在EC2上,想增加資源是非常容易的。
InfoQ:為什么選擇Ruby on Rails?
RC:James和我都知道,插件的世界是非常吸引人的。例如New Relic,簡直是上帝送來的禮物。我不擔(dān)心服務(wù)器掛掉,而且我能看到所有代碼的“瓶頸點(diǎn)”。他們還能跟蹤最高發(fā)生頻率的問題,甚至?xí)岢龈倪M(jìn)意見。
MongoMapper是一個令人難以置信的數(shù)據(jù)工具,而MongoDB本身的速度比閃電還快。Rails的平臺已經(jīng)成熟到了這樣的地步,幾乎難以說服自己*不*使用它。
JA:我們遇到的所有問題(使用許可、測試和部署)都得到了很好的解決。我們還能使用一些變通的辦法,例如寫自己的部署框架等。隨之而來的是我們都很享受與Rails工作,我們喜歡Rails社區(qū),還有很多工具和類庫可用。經(jīng)過遷移之后最棒的地方就是,這一切讓我們變的非常高興。
InfoQ:相對很多傳統(tǒng)數(shù)據(jù)庫例如MySQL或者PostgreSQL,你們?yōu)槭裁催x擇MongoDB?
RC:速度和擴(kuò)展性。使用MongoDB非常簡單——不用擔(dān)心遷移,非常靈活。而且它不可思議的快——這一點(diǎn)對用戶帶來的感受是巨大的。
JA:事實上我們都用了,我們用MongoDB做那些它最擅長的(靈活存儲產(chǎn)品、用戶和訂單等信息),同樣我們也這么使用MySQL,我們用MySQL提供正在發(fā)生的持久事務(wù)日志。
InfoQ:完成了新的設(shè)計和重寫應(yīng)用之后,最直接的好處是什么?
RC: 最直接的——第一件事就是人們發(fā)現(xiàn)網(wǎng)站變快了。他們還注意到一個“更嚴(yán)格”的設(shè)計,誠實的說,確實有些繁瑣,但它讓我們能更多的關(guān)注服務(wù)器端。
不僅僅如此——當(dāng)出現(xiàn)問題時,我們可以在幾秒鐘之內(nèi)消除它。這是由于基于Capistrano的部署是如此簡單。問題的修復(fù)、推出——僅需幾秒。
我們的測試套件使用的非常好——使用Cucumber做一些事情簡直是一種享受,但用ASP.NET MVC就會很困難。例如——使用ASP測試PayPal的支付接口時就會很麻煩。
基于Rails/Cucumber/Webrat,在這樣的框架下要做的就是填空并提交——然后確認(rèn)所有事情都是按照計劃執(zhí)行的。我想我們的用戶會看到很多功能在按照預(yù)期的方式運(yùn)行——這確實很棒。
最直接的好處是我們想做一些變化時,可以快速完成,并且這種響應(yīng)速度直接反應(yīng)到了產(chǎn)品上。在原來基于ASP.NET MVC技術(shù)的網(wǎng)站上,我經(jīng)常會寫些SQL腳本來處理一些復(fù)雜的支持需求,比如改變某人的OpenID,或合并帳戶什么的。但現(xiàn)在我只需花30-60分鐘的時間寫了幾行的Ruby腳本就能完成。
在重寫網(wǎng)站過程中另一個重大的改變之一是如何處理用戶的文件。過去我們從自己的服務(wù)器或運(yùn)行在EC2上的Wowza媒體服務(wù)器上以流的方式處理文件。這兩種方案都可以,但是太貴了,而且在其他國家就運(yùn)行的沒那么好了。這次我們開始重新設(shè)計亞馬遜服務(wù),提供了從云端和云端流來處理私有內(nèi)容的能力。現(xiàn)在我們的全部內(nèi)容都是通過云端處理,并使用了安全簽名的URL,這就意味著世界上任何地方的用戶都可以進(jìn)行高速下載。這也節(jié)省了我們的成本,因為我們只需支付使用帶寬的費(fèi)用,不需要額外的設(shè)備或許可費(fèi)用。
InfoQ: 在你們當(dāng)前的實現(xiàn)中,TDD測試方法包含哪些內(nèi)容,引入模擬對象了嗎?
JA:我們用Cucumber和Pickle實現(xiàn)測試驅(qū)動開發(fā)。這方面Rob應(yīng)該比我更清楚。
RC:沒有進(jìn)行模擬測試,都是BDD(行為驅(qū)動開發(fā))。我痛恨那種拖拉的感覺,就像我需要做“代碼覆蓋率”一樣——事實上我們有個商業(yè)應(yīng)用在運(yùn)行,我更需要確認(rèn)用戶獲得良好的體驗,這對我來說就是BDD。Cucumber扮演了一個真正的重要角色——就像Pickle和Factory Girl做的那樣——它與MongoMapper配合的好極了,對比我在微軟框架下做的和我現(xiàn)在能做的事情,這讓我高興的笑了好幾次。我?guī)缀跬耆诳紤]業(yè)務(wù)——甚至沒有注意到測試方法這回事。
InfoQ: 你們現(xiàn)在的測試方法和以前在微軟使用的方法有什么不同?
RC:100%不同。測試微軟的東西是極其痛苦的,當(dāng)時你很窮,還有三個月錢就花完了,在這種情況下,測試就是變成了一個很難判斷的的東西。不可否認(rèn)——我為我們的第一次修改幾乎寫了一噸的垃圾。如果你沒有客戶,那么你的應(yīng)用系統(tǒng)好不好用就無關(guān)緊要,我真正需要確定的是不出現(xiàn)那些不可預(yù)期的錯誤。所以我進(jìn)行了一些測試,但并沒有得到想要的結(jié)果。我們對PayPal的東西進(jìn)行了大量地測試,這是你必須要做的。當(dāng)開始使用他們的API時,我在他們的沙箱環(huán)境中折騰了整整三天,還是會不斷的出問題。
另一邊呢——感覺是黑夜和白天的對比。現(xiàn)在我們覆蓋了所有的行為類型,我想James甚至抽時間寫了一些。
JA:對微軟產(chǎn)品的測試總是像打一場戰(zhàn)爭,主要是因為C#和靜態(tài)語言對測試的支持不是很好。在.NET上測試時你總是需要在各種循環(huán)中跳來跳去。話雖這么說,.NET的SpecFlow框架看上去還是很樂觀,但我對它能解決.NET的測試方面的所有問題持懷疑態(tài)度。
InfoQ: 在微軟框架上做測試會有多少困難?為什么會這樣?
RC:語言和工具造成的。假如微軟對這一點(diǎn)想的多一些,測試可能會更容易一些。使用RSpec進(jìn)行測試,沒有其他語言比Ruby做得更好了——它讓測試變得非常容易。微軟可以利用DLR實現(xiàn)這些功能……但是他們沒有這么做。因為這不符合“.NET Story”,那么好吧,這是他們的商業(yè)決策,我們這次的遷移也是一樣。
InfoQ: 在這次全面的重新設(shè)計中,你們有什么經(jīng)驗教訓(xùn)嗎?
RC:沒什么——我想James和我都知道,我們到了需要調(diào)整和重寫的那個點(diǎn)。這是我的第三次創(chuàng)業(yè),對James來說應(yīng)該是第五次。開始時我們經(jīng)過很長的時間討論采用什么技術(shù)。我們都同意我們要“跟隨你所知道的,并且去實現(xiàn)它”——于是我們就做了。
我們很幸運(yùn)把握住了這個機(jī)會——然后我們進(jìn)入了這樣一個狀態(tài):“好吧,讓我們開始為之后的3-5年規(guī)劃,進(jìn)入可控的增長模式”——這就是我們現(xiàn)在的狀態(tài)。我們不想做得很大,我們不想引入IT人員或一組開發(fā)人員。我們想自己做而且保持小的規(guī)模——重點(diǎn)放在了我們的創(chuàng)意上。
對于我們這樣的兩個家伙來說,Rails超級簡單,易于維護(hù)。我們有世界上最可靠的支撐(可自動擴(kuò)展的亞馬遜EC2),我們對正在做的事情非常滿意,獲得了很多樂趣。
JA:我想大部分人看到這個故事,會認(rèn)為我們應(yīng)該從開始就使用Rails,事實上我很高興我們沒有那么做。開始創(chuàng)業(yè)時我想我們要相信自己的直覺,哪些是當(dāng)時我們認(rèn)為最好的,我們應(yīng)該關(guān)心所有的業(yè)務(wù)問題,而不是使用什么工具。現(xiàn)在業(yè)務(wù)已經(jīng)正常運(yùn)轉(zhuǎn),在這樣一個堅實的基礎(chǔ)之上,我們就有了很多美妙的時光,釋放內(nèi)心的渴望做一些好玩的事情。平臺移植讓我們享受了很多樂趣。
InfoQ: 你們現(xiàn)在的架構(gòu)有什么缺點(diǎn)嗎?如果今天開始重新做一遍的話,有什么改變嗎?
RC:從我的觀點(diǎn)來看沒什么——我愛現(xiàn)在的一切。對我來說這很不可思議——我在很長一段時間內(nèi)曾是一名微軟員工,并被扣上了這樣一頂帽子……其實這對我們來說并不意味著什么。我非常喜歡硬件成本的可擴(kuò)展性——我想在很長時間之內(nèi)我們不再需要其他的硬件方案了。我們的服務(wù)器非常靈活,完全根據(jù)需求動態(tài)擴(kuò)展。使用微軟技術(shù)你就沒法做到這些(據(jù)我所知),如果你想搞一臺獨(dú)立的機(jī)器,那你就需要支付一大筆款項。
JA:針對現(xiàn)有架構(gòu),我唯一想做的改變就是把MongoDB從我們的單一服務(wù)器上分離出來,同時運(yùn)行兩個MongoDB對我們來說是有意義的,但現(xiàn)在這部分功能被廢棄了,對我們來說更有意義的事就是等MongoDB開發(fā)新的配對策略。但是考慮到額外的兩個虛擬機(jī)的成本,以及我們的業(yè)務(wù)在現(xiàn)有的單一服務(wù)器上運(yùn)行良好,我們暫時還不準(zhǔn)備這么做。
InfoQ: 感謝Rob和James抽時間接受我們的訪談。
關(guān)于TekPub的更多信息,請參考公司網(wǎng)站。
查看英文原文:Architecting TekPub - Moving from ASP.NET MVC to Ruby on Rails
NET技術(shù):重構(gòu)TekPub——從ASP.NET MVC框架遷移到Ruby on Rails,轉(zhuǎn)載需保留來源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。