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