Ruby on Rails開(kāi)發(fā)的五點(diǎn)建議
Ruby on Rails開(kāi)發(fā)使得程序員的工作變得如此簡(jiǎn)單,以至于很容易讓人誤以為它能解決一切麻煩,從而沒(méi)有給予其后臺(tái)情景足夠的注意。程序員要從一開(kāi)始就把重點(diǎn)放在擴(kuò)展性上,而不是完全依賴于Rails。
51CTO推薦專題:Ruby on Rails開(kāi)發(fā)教程
事實(shí)是,Rails(Java 與Ruby on Rails對(duì)接)只能解決80%的擴(kuò)展工作。而要完成余下20%的Ruby應(yīng)用程序開(kāi)發(fā)則需要考慮下面的五個(gè)注意事項(xiàng):
1.留意你的數(shù)據(jù)庫(kù)
數(shù)據(jù)庫(kù)查詢,尤其是大量的查詢會(huì)造成性能瓶頸。例如,在博客上發(fā)表評(píng)論,如果你不小心的話,ActiveRecord可能會(huì)將每個(gè)評(píng)論都發(fā)出一次查詢。點(diǎn)擊率很高的博客可能會(huì)有數(shù)以百計(jì)的評(píng)論,這意味著每個(gè)頁(yè)面會(huì)要執(zhí)行上百次SQL查詢,顯然這會(huì)降低工作效率。
這類問(wèn)題被稱為“n+1查詢問(wèn)題”,是我們要避免的。請(qǐng)務(wù)必使用合適的“#include”陳述以便獲取查詢中的相關(guān)對(duì)象。此外,要立刻招引上千個(gè)對(duì)象。這樣可以實(shí)現(xiàn)平衡。
Rails消除了數(shù)據(jù)庫(kù)中繁重的工作但卻不是完全消除。Ruby on Rails開(kāi)發(fā)將程序員與SQL隔離開(kāi),但是隨著網(wǎng)站的發(fā)展以及應(yīng)用程序要擴(kuò)大的需求,你肯定希望能夠手動(dòng)優(yōu)化數(shù)據(jù)庫(kù)。要做到這一點(diǎn),需要明白在里面到底發(fā)生了什么。記住在開(kāi)發(fā)模式中記錄登錄情況,確保SQL查詢記錄在了登錄情況中。這樣,當(dāng)數(shù)據(jù)庫(kù)運(yùn)行過(guò)多查詢或者要介入以提高效率的時(shí)候,你就會(huì)及時(shí)獲知。(Ruby能否成為第二個(gè)Java?)
2.解除長(zhǎng)期執(zhí)行的查詢
毫無(wú)疑問(wèn),我們都希望自己開(kāi)發(fā)出的程序能快速運(yùn)行。也就是說(shuō),使用這些程序的人不會(huì)關(guān)心程序的背景。如果用戶發(fā)出調(diào)整個(gè)人資料的圖片,視頻編碼等請(qǐng)求,他們不需要在網(wǎng)絡(luò)請(qǐng)求發(fā)出后等待很久。相反,這些做完以后,發(fā)出一個(gè)請(qǐng)求,要在后臺(tái)等待很久才能返回狀態(tài)更新以及獲得頁(yè)面的更新。
Rails每次都會(huì)發(fā)出一個(gè)請(qǐng)求,如果長(zhǎng)時(shí)間運(yùn)行查詢則會(huì)阻止其他請(qǐng)求的執(zhí)行。盡可能減少網(wǎng)絡(luò)請(qǐng)求的工作,并設(shè)置一個(gè)排隊(duì)機(jī)制,這樣數(shù)據(jù)庫(kù)就不會(huì)超載。這樣可以讓?xiě)?yīng)用程序運(yùn)行得更快且保持前端網(wǎng)絡(luò)服務(wù)器的開(kāi)放狀態(tài)。
類似的觀點(diǎn):許多Ruby on Rails開(kāi)發(fā)的程序都可以處理文件加載和用戶生成的有價(jià)值數(shù)據(jù)。許多這類應(yīng)用程序都將這類數(shù)據(jù)保存在Amazon S3上。在嘗試將視頻上傳到應(yīng)用程序上的同時(shí)處理圖像或上傳視頻到Amazon S3可以完全占用前端服務(wù)器。這意味著用戶的使用速度會(huì)減慢。而是個(gè)網(wǎng)絡(luò)服務(wù)器可以處理許多流量,但是二十個(gè)用戶同時(shí)上傳多個(gè)請(qǐng)求意味著其他人的請(qǐng)求會(huì)超時(shí)或被拒絕。
底線:為提高效率起見(jiàn),千萬(wàn)不要在處理請(qǐng)求的時(shí)候進(jìn)行圖像處理或?qū)⑽募蟼鞯搅硪粋€(gè)服務(wù)器上的操作。相反,應(yīng)該接受上傳,將上傳成功的信息返回給客戶端,然后為其他服務(wù)器處理好后臺(tái)繁重的工作。
3.使用緩沖技巧來(lái)保存應(yīng)用服務(wù)器和數(shù)據(jù)庫(kù)的加載數(shù)據(jù)
任何時(shí)候你都可以緩沖對(duì)于計(jì)算或數(shù)據(jù)庫(kù)的查詢,即便是只有很短的時(shí)間,你也可以擴(kuò)展整個(gè)系統(tǒng)的規(guī)模。你可以通過(guò)數(shù)據(jù)庫(kù)緩沖服務(wù)器控制數(shù)據(jù)庫(kù)服務(wù)器的加載數(shù)據(jù)。數(shù)據(jù)庫(kù)緩沖服務(wù)器可以讓你將查詢或計(jì)算的對(duì)象保存在應(yīng)用服務(wù)器中分布的內(nèi)存中。
總的格局是當(dāng)你獲取或計(jì)算對(duì)象的時(shí)候,可以將其保存數(shù)據(jù)庫(kù)緩沖服務(wù)器中。那么下次你需要對(duì)象的時(shí)候,可以首先檢查數(shù)據(jù)庫(kù)緩沖服務(wù)器,只有當(dāng)它不存在的時(shí)候,你才會(huì)退回到數(shù)據(jù)庫(kù)或重新計(jì)算對(duì)象,然后將其保存在緩存中。
一個(gè)好的程序員要了解各種HTTP協(xié)議的各種緩沖功能。使用這些緩沖功能,就可以削減整個(gè)堆棧的負(fù)荷。
4.監(jiān)視與測(cè)量
監(jiān)視和測(cè)量:服務(wù)器,資源使用,應(yīng)用的性能,頁(yè)面響應(yīng)時(shí)長(zhǎng)。監(jiān)測(cè)的時(shí)候,盡可能地收集信息。如果出現(xiàn)問(wèn)題,你還擁有信息,性能趨勢(shì)和文本。監(jiān)視工具旨在查出性能上的問(wèn)題。
如果沒(méi)有監(jiān)測(cè)和記錄,你就不能查看系統(tǒng)。如果問(wèn)題出現(xiàn)的時(shí)候,你沒(méi)有足夠的數(shù)據(jù)可以依靠,效率就會(huì)減慢。
5.讓方案的執(zhí)行環(huán)境成為產(chǎn)品環(huán)境的復(fù)制品
許多程序員都在本地開(kāi)發(fā)并測(cè)試了應(yīng)用程序,因而過(guò)早部署了產(chǎn)品。隨后他們便會(huì)遇到問(wèn)題,因?yàn)檎鎸?shí)的產(chǎn)品環(huán)境與電腦上的不一樣。
執(zhí)行和質(zhì)量保障環(huán)境越接近部署環(huán)境越好。執(zhí)行環(huán)境不需要很大,但是至少要運(yùn)行相同規(guī)模的軟件。理想情況下,測(cè)試應(yīng)該與產(chǎn)品數(shù)據(jù)的副本一起運(yùn)行,這些數(shù)據(jù)副本要與部署條件類似。這樣做最大的好處是應(yīng)用程序推送到產(chǎn)品前可以捕捉到錯(cuò)誤,從而節(jié)約我們的時(shí)間和精力。
Ruby on Rails開(kāi)發(fā)可以讓我們更快到達(dá)端點(diǎn),讓我們有時(shí)間來(lái)思考如何擴(kuò)大應(yīng)用程序的規(guī)模。學(xué)習(xí)了以上五點(diǎn)以后,很多擴(kuò)展問(wèn)題都可以迎刃而解了。
【編輯推薦】