軟件速度很重要。根據(jù)百度等主流搜索引擎的說(shuō)法,您的軟件加載速度越快,您在搜索結(jié)果中獲得的排名就越高,轉(zhuǎn)化率也就越高。這就是成都軟件開(kāi)發(fā)時(shí)關(guān)心軟件速度優(yōu)化的原因。在之前的一篇文章中,我們討論了可衡量您軟件性能的工具,以及通過(guò)優(yōu)化軟件前端來(lái)提高軟件加載速度的提示。在本文中,我們將討論后端優(yōu)化。我們將對(duì)加速軟件的方式進(jìn)行排名,向您展示哪些優(yōu)化對(duì)加載時(shí)間的影響最大。這意味著我們將首先解決常見(jiàn)問(wèn)題,例如未優(yōu)化的查詢,這些問(wèn)題會(huì)降低軟件的性能,并且易于識(shí)別和修復(fù)。我們將通過(guò)討論查詢和數(shù)據(jù)庫(kù)優(yōu)化,緩存,Web托管解決方案以及Content Delivery Network來(lái)跟蹤這些簡(jiǎn)單的修復(fù)程序。
“ N + 1”問(wèn)題減慢了許多應(yīng)用程序的速度。當(dāng)向數(shù)據(jù)庫(kù)中的鏈接字段發(fā)出過(guò)多的查詢而不是發(fā)出一個(gè)包含所有需要檢索的記錄的復(fù)雜SQL查詢時(shí),就會(huì)發(fā)生此問(wèn)題。在京上云的內(nèi)置對(duì)象關(guān)系映射(ORM)工具中,N + 1問(wèn)題通過(guò)急切的加載得以解決。急切加載時(shí),將通過(guò)單個(gè)查詢而不是使用多個(gè)查詢來(lái)請(qǐng)求所有關(guān)聯(lián)的實(shí)體,這會(huì)降低應(yīng)用程序的性能。
此外,我們可以使用Bullet gem減少應(yīng)用程序查詢的數(shù)量。這個(gè)gem跟蹤應(yīng)用程序開(kāi)發(fā)過(guò)程中的查詢,并在需要添加緊急加載以解決N + 1問(wèn)題時(shí)以及在最好不使用緊急加載時(shí)通知開(kāi)發(fā)人員。
未優(yōu)化的數(shù)據(jù)庫(kù)也會(huì)降低您的軟件速度。為了加速數(shù)據(jù)庫(kù),請(qǐng)考慮使用索引并對(duì)數(shù)據(jù)庫(kù)進(jìn)行規(guī)范化和非規(guī)范化。下面,我們將為您提供有關(guān)如何使用關(guān)系數(shù)據(jù)庫(kù)執(zhí)行此操作的示例。
盡管在設(shè)計(jì)關(guān)系數(shù)據(jù)庫(kù)時(shí)規(guī)范化是理所當(dāng)然的事,但一些開(kāi)發(fā)人員有時(shí)還是忽略了此過(guò)程。
數(shù)據(jù)庫(kù)設(shè)計(jì)(包括表和列的結(jié)構(gòu)以及它們之間的關(guān)系)涉及正常形式的概念,旨在優(yōu)化數(shù)據(jù)庫(kù)的結(jié)構(gòu)。正常形式表示應(yīng)用于數(shù)據(jù)庫(kù)的線性規(guī)則集,這些規(guī)則用于數(shù)據(jù)庫(kù)規(guī)范化。數(shù)據(jù)庫(kù)規(guī)范化的目的是減少和消除冗余數(shù)據(jù),并確保相關(guān)的數(shù)據(jù)依賴性,以避免在數(shù)據(jù)庫(kù)字段中插入,更新或刪除數(shù)據(jù)時(shí)出現(xiàn)問(wèn)題。
總而言之,規(guī)范化可以幫助您減少數(shù)據(jù)庫(kù)占用的空間,并有效地組織數(shù)據(jù)以提高數(shù)據(jù)庫(kù)性能。
減慢查詢速度的一個(gè)常見(jiàn)問(wèn)題是根本沒(méi)有使用或使用不正確的索引。數(shù)據(jù)庫(kù)中的索引與書(shū)中的索引具有相同的功能:每個(gè)索引元素都包含所需對(duì)象的名稱以及顯示其位置的標(biāo)識(shí)符。為數(shù)據(jù)庫(kù)列創(chuàng)建索引,因此查詢無(wú)需遍歷所有列即可搜索匹配的數(shù)據(jù)。而是,數(shù)據(jù)庫(kù)僅搜索索引。但是,請(qǐng)記住,索引可能會(huì)降低數(shù)據(jù)庫(kù)的速度。盡管索引加快了數(shù)據(jù)返回的速度,但它們減慢了數(shù)據(jù)的插入,更新和刪除的速度。
非規(guī)范化是對(duì)規(guī)范化數(shù)據(jù)庫(kù)的蓄意修改,因此它不符合規(guī)范形式。非規(guī)范化的主要目標(biāo)是通過(guò)向現(xiàn)有表中添加多余的數(shù)據(jù)(例如額外的表或?qū)傩裕﹣?lái)減少選擇查詢所需的時(shí)間,以使數(shù)據(jù)更易于訪問(wèn)。
數(shù)據(jù)庫(kù)非規(guī)范化可以幫助您解決以下問(wèn)題:
1、大量的表聯(lián)接
我們經(jīng)常需要將查詢中的大量表連接到規(guī)范化數(shù)據(jù)庫(kù)。盡管表聯(lián)接是一項(xiàng)資源密集型操作,但此類(lèi)查詢會(huì)消耗服務(wù)器資源,并且需要花費(fèi)一些時(shí)間來(lái)執(zhí)行。為了加快這些查詢的速度,請(qǐng)考慮通過(guò)對(duì)其中一個(gè)表添加一個(gè)額外的字段來(lái)進(jìn)行非規(guī)范化。
2、計(jì)算值
通常,執(zhí)行復(fù)雜計(jì)算的查詢會(huì)降低數(shù)據(jù)庫(kù)的性能。如果您的數(shù)據(jù)庫(kù)定期執(zhí)行復(fù)雜的計(jì)算,則有必要在表中添加其他列以容納經(jīng)常使用且難以計(jì)算的數(shù)據(jù)。創(chuàng)建包含預(yù)先計(jì)算的值的列可以節(jié)省查詢執(zhí)行期間的大量時(shí)間。但是,它還需要及時(shí)更新此列中的數(shù)據(jù)。
3、長(zhǎng)田
如果數(shù)據(jù)庫(kù)包含包含長(zhǎng)字段(例如Blob和Long)的大表,則可以通過(guò)將長(zhǎng)字段移到單獨(dú)的表來(lái)加快查詢處理。
緩存是將數(shù)據(jù)存儲(chǔ)在緩存中并重新加載的過(guò)程,因此不會(huì)為每個(gè)用戶一遍又一遍地呈現(xiàn)軟件。緩存使用戶可以在短時(shí)間內(nèi)處理大量數(shù)據(jù),同時(shí)使用最少的服務(wù)器資源。
可以在客戶端和服務(wù)器端實(shí)現(xiàn)緩存。在上一篇文章中,我們討論了客戶端緩存(也稱為瀏覽器緩存),其中包括圖像,HTTP標(biāo)頭,軟件等的緩存。在本文中,我們將更詳細(xì)地討論服務(wù)器端緩存。
服務(wù)器端緩存是對(duì)存儲(chǔ)在服務(wù)器上的數(shù)據(jù)進(jìn)行緩存;客戶的瀏覽器無(wú)法使用此數(shù)據(jù)。盡管這些是常用的緩存機(jī)制,但是每個(gè)框架或CMS都有其自己的即用型緩存實(shí)現(xiàn),用于緩存整個(gè)軟件,軟件片段和數(shù)據(jù)庫(kù)查詢。
京上云中的SQL緩存會(huì)緩存選擇查詢的結(jié)果。在京上云遇到相同的查詢請(qǐng)求的情況下,它將返回緩存的結(jié)果,而不是再次查詢數(shù)據(jù)庫(kù)。換句話說(shuō),當(dāng)重復(fù)查詢發(fā)送到數(shù)據(jù)庫(kù)時(shí),實(shí)際上并沒(méi)有到達(dá)數(shù)據(jù)庫(kù)。第一次返回查詢時(shí),結(jié)果存儲(chǔ)在查詢緩存(內(nèi)存)中,第二次返回查詢時(shí),直接從內(nèi)存中檢索它。但是請(qǐng)記住,查詢緩存僅是臨時(shí)存儲(chǔ)的,這就是為什么您應(yīng)該選擇低級(jí)緩存來(lái)長(zhǎng)期存儲(chǔ)查詢結(jié)果的原因。
片段緩存是最普遍的緩存類(lèi)型。使用片段緩存時(shí),將緩存單獨(dú)的頁(yè)面塊。頁(yè)面塊的緩存對(duì)于動(dòng)態(tài)Web應(yīng)用程序很有用,因?yàn)樗鼈兊膬?nèi)容通常會(huì)更新,并且緩存的結(jié)果可能很快變得無(wú)關(guān)緊要。此外,復(fù)雜的Web應(yīng)用程序通常包含許多塊和組件。因此,對(duì)軟件塊的任何更改都將需要重新呈現(xiàn)整個(gè)頁(yè)面并再次存儲(chǔ)該頁(yè)面,這會(huì)使整個(gè)軟件的緩存效率低下。這就是為什么緩存單獨(dú)的片段是提高軟件性能的首選方法的原因。
頁(yè)面緩存是京上云早期版本中的默認(rèn)選項(xiàng),但已從京上云4中刪除。現(xiàn)在,可以使用actionpack-page_caching gem來(lái)實(shí)現(xiàn)頁(yè)面緩存。京上云中的頁(yè)面緩存是一種有效的緩存類(lèi)型,它完全在Web服務(wù)器上完成,而無(wú)需遍歷京上云堆棧。這意味著Web服務(wù)器無(wú)需向京上云應(yīng)用程序發(fā)送請(qǐng)求即可返回緩存的靜態(tài)內(nèi)容。實(shí)際上,這意味著軟件幾乎是即時(shí)傳輸?shù)模@使其成為緩存內(nèi)容的最快方法之一。
但是請(qǐng)記住,頁(yè)面緩存不適用于具有頻繁更新的內(nèi)容(如新聞源)的應(yīng)用程序,因?yàn)樵谶@種情況下,緩存的查詢結(jié)果將返回用戶以前見(jiàn)過(guò)的內(nèi)容。
此外,在具有用于身份驗(yàn)證或錯(cuò)誤消息生成操作的軟件上,頁(yè)面緩存不可用。但是,您可以實(shí)現(xiàn)操作緩存,這與頁(yè)面緩存類(lèi)似。區(qū)別在于動(dòng)作緩存命中了京上云堆棧,因此它在提供緩存之前運(yùn)行所謂的“動(dòng)作之前”。您可以使用actionpack-action_caching gem啟用操作緩存。
緩存可以提高您的軟件速度。首先,它減少了數(shù)據(jù)庫(kù)加載時(shí)間,因?yàn)橐淮伟l(fā)現(xiàn)的結(jié)果可能會(huì)重復(fù)使用。其次,緩存可以減少應(yīng)用程序服務(wù)器的加載時(shí)間,因?yàn)橐淮尉彺娴能浖梢远啻蝹鬏斀o用戶。最后,緩存可以提高服務(wù)器處理用戶請(qǐng)求的速度,因?yàn)槟梢粤⒓磳⒕彺娴牟樵兘Y(jié)果返回給用戶,而不必查詢數(shù)據(jù)庫(kù)和呈現(xiàn)數(shù)據(jù)。
Web托管公司擁有服務(wù)器?存儲(chǔ)和運(yùn)行Web應(yīng)用程序,數(shù)據(jù)庫(kù)和軟件的計(jì)算機(jī)。此外,Web主機(jī)還提供諸如備份和服務(wù)器管理之類(lèi)的服務(wù)。您的軟件速度直接取決于您所依賴的虛擬主機(jī)服務(wù),并且虛擬主機(jī)具有不同的容量和可伸縮性選項(xiàng)。最常見(jiàn)的Web托管類(lèi)型包括共享Web托管,虛擬專(zhuān)用服務(wù)器(VPS),云托管和專(zhuān)用托管。
盡管共享的虛擬主機(jī)是最便宜和最受歡迎的解決方案,但我們不會(huì)在本文中考慮它,因?yàn)樗鼪](méi)有提供足夠的功能來(lái)確保穩(wěn)定的軟件和一致的速度。相反,我們將專(zhuān)注于VPS,云和專(zhuān)用托管,并解釋為什么您可能會(huì)選擇其中一個(gè)。
虛擬專(zhuān)用服務(wù)器是極其便宜的共享Web托管程序包和昂貴的專(zhuān)用托管之間的黃金分割。VPS提供商為每個(gè)客戶端提供了一個(gè)個(gè)人虛擬服務(wù)器,它比共享主機(jī)更具可配置性和可擴(kuò)展性,因?yàn)槟呐渲貌粫?huì)影響其他客戶端(與共享主機(jī)一樣)。
同樣,VPS價(jià)格是可以承受的,盡管如果您的軟件擴(kuò)展并需要其他服務(wù),它們的價(jià)格可能會(huì)上漲。VPS是平均流量軟件的最佳解決方案。由于其可擴(kuò)展性,虛擬專(zhuān)用服務(wù)器也非常適合希望在特定時(shí)期內(nèi)流量激增的電子商務(wù)軟件。Amazon Web Services(AWS)和DigitalOcean是常見(jiàn)的云計(jì)算服務(wù)的示例,它們?yōu)樵诰€業(yè)務(wù)提供托管,存儲(chǔ),計(jì)算和其他解決方案。
您可能會(huì)質(zhì)疑VPS和云托管之間是否有任何區(qū)別,因?yàn)閮烧呔谠苹A(chǔ)架構(gòu)。但是,它們是不同的:通過(guò)云托管,計(jì)算資源可以分布在多個(gè)服務(wù)器上。這使云托管具有高度可擴(kuò)展性-您可以根據(jù)應(yīng)用程序面臨的負(fù)載來(lái)增加或減少應(yīng)用程序的計(jì)算資源。許多云托管提供商都提供自動(dòng)擴(kuò)展功能,這意味著在流量激增的情況下,平臺(tái)會(huì)自動(dòng)為您的應(yīng)用分配更多資源。此外,云托管是可靠的-計(jì)算資源位于多個(gè)物理服務(wù)器上,因此,如果其中一個(gè)發(fā)生故障,您的應(yīng)用程序?qū)⒗^續(xù)運(yùn)行。
定價(jià)是云托管的另一個(gè)優(yōu)勢(shì)。由于計(jì)算資源是靈活的,因此使用云托管時(shí),您只需為使用的資源付費(fèi)。供應(yīng)商提供月費(fèi)和小時(shí)費(fèi),并為您的應(yīng)用程序可能使用的其他資源收費(fèi)。因此,借助云托管,您無(wú)需為軟件不需要的資源付費(fèi)。不利的一面是,如果您的軟件出現(xiàn)長(zhǎng)時(shí)間的流量高峰,您最終可能會(huì)收到巨額賬單。
對(duì)于運(yùn)行流量無(wú)法預(yù)測(cè)的中小型企業(yè)(這對(duì)于電子商務(wù)軟件是常見(jiàn)的),云托管是一個(gè)不錯(cuò)的選擇。提供商可以提供針對(duì)特定類(lèi)型的應(yīng)用程序量身定制的云托管計(jì)劃。例如,如果您需要托管在Magento平臺(tái)上運(yùn)行的電子商務(wù)軟件,則可以選擇Magento虛擬主機(jī),它將幫助您更好地管理應(yīng)用程序并提高其性能。
專(zhuān)用托管為您提供了專(zhuān)用服務(wù)器-僅屬于您的物理服務(wù)器。這是一個(gè)昂貴的解決方案。首先,您需要支付租用服務(wù)器的費(fèi)用(通常,價(jià)格起價(jià)為每月150美元)。其次,您需要系統(tǒng)管理員來(lái)維護(hù)和管理服務(wù)器。但是,通過(guò)專(zhuān)用主機(jī),您將獲得所有屬于您的資源和力量。此外,您可以基本上自定義所有內(nèi)容,從操作系統(tǒng)到內(nèi)存類(lèi)型。對(duì)于那些對(duì)穩(wěn)定性和速度至關(guān)重要的企業(yè)級(jí)軟件和高流量軟件,建議使用專(zhuān)用托管。
那么,您應(yīng)該選擇哪種Web托管軟件包?答案很簡(jiǎn)單:考慮您的業(yè)務(wù)需求。
對(duì)于需要高度可擴(kuò)展,靈活和可靠的平臺(tái)來(lái)托管其應(yīng)用程序的企業(yè),云托管是一個(gè)絕佳的選擇。同時(shí),與VPS或?qū)S猛泄芟啾龋仆泄芴峁┑墓芾砗团渲脵C(jī)會(huì)更少。
VPS是軟件訪問(wèn)者數(shù)量眾多的中小型企業(yè)的最佳解決方案。例如,流行的網(wǎng)絡(luò)托管服務(wù)提供商Hostgator提供了VPS計(jì)劃,使您每天可以處理9,000至35,000個(gè)訪問(wèn)者,這使VPS成為專(zhuān)用托管的真正競(jìng)爭(zhēng)對(duì)手。除了提供必要的計(jì)算資源(內(nèi)存,存儲(chǔ),處理)基線以保持軟件的全面穩(wěn)定運(yùn)行之外,您還可以隨時(shí)間添加任意數(shù)量的其他資源,以隨著業(yè)務(wù)的增長(zhǎng)而擴(kuò)展托管。此功能在季節(jié)性流量激增期間非常有用,當(dāng)您的軟件被大量訪客訪問(wèn)時(shí)。
VPS和專(zhuān)用托管每個(gè)月可以處理超過(guò)一百萬(wàn)的訪問(wèn)者,這就是為什么僅在需要更大靈活性來(lái)調(diào)整托管環(huán)境并需要員工維護(hù)自己的服務(wù)器的情況下,專(zhuān)用托管才是合理的。
內(nèi)容交付網(wǎng)絡(luò)(CDN)是世界各地的分布式代理服務(wù)器的系統(tǒng)。這些服務(wù)器也稱為“邊緣服務(wù)器”:它們的功能是緩存靜態(tài)內(nèi)容,例如圖像,Javascript和CSS文件(某些CDN,例如Akamai也緩存動(dòng)態(tài)內(nèi)容)。
軟件的頁(yè)面加載速度取決于其服務(wù)器的位置:服務(wù)器離用戶越近,頁(yè)面加載速度就越快。CDN背后的主要思想是提供有利的地理位置,使最終用戶可以更快地下載內(nèi)容。通過(guò)使用CDN服務(wù),您可以解決以下問(wèn)題:
CDN的存在點(diǎn)(POP)均勻分布,以使用戶能夠更快地檢索所請(qǐng)求的內(nèi)容。例如,如果來(lái)自日本的訪問(wèn)者試圖從位于美國(guó)的服務(wù)器檢索內(nèi)容,則CDN將通過(guò)提供來(lái)自位于日本的服務(wù)器(盡可能接近最終用戶)的數(shù)據(jù)來(lái)減少等待時(shí)間。
您的軟件越受歡迎,就會(huì)有更多的人嘗試訪問(wèn)它。為了確保軟件的快速頁(yè)面加載,您需要在多個(gè)位置提供服務(wù)器。但是,處理和操作服務(wù)器(尤其是在各個(gè)位置)非常昂貴。許多企業(yè)主認(rèn)為,使用CDN提供程序比建立和維護(hù)自己的服務(wù)器系統(tǒng)便宜得多,也更方便。
CDN的優(yōu)點(diǎn)之一是提高了穩(wěn)定性。如果一臺(tái)服務(wù)器出現(xiàn)故障,用戶的請(qǐng)求將自動(dòng)重定向到最近的可用服務(wù)器,因此用戶甚至不會(huì)注意到延遲。
所有企業(yè)都試圖獲得盡可能多的流量。但是,由黑色星期五之類(lèi)的假期引起的流量激增(突然的流量激增)或僅是成功的營(yíng)銷(xiāo)策略都可能導(dǎo)致不良的軟件速度,甚至導(dǎo)致錯(cuò)誤。單個(gè)服務(wù)器可能會(huì)由于流量高峰而關(guān)閉,但是傳統(tǒng)的CDN(例如Akamai,Amazon CloudFront和KeyCDN)可以通過(guò)分配負(fù)載來(lái)緩解此問(wèn)題。
軟件加載速度對(duì)于吸引和留住客戶很重要。通常,成都軟件開(kāi)發(fā)區(qū)分前端和后端技術(shù)來(lái)提高您的軟件速度。后端或軟件的服務(wù)器部分對(duì)最終用戶不可見(jiàn),但是對(duì)于軟件的速度而言,這至關(guān)重要。上面討論的某些技術(shù)甚至可以由非技術(shù)人員實(shí)施,盡管其中一些需要具有深厚技術(shù)背景的專(zhuān)家。但是,為提高軟件速度所做的一切努力都是值得的。
文章均為京上云專(zhuān)業(yè)成都軟件開(kāi)發(fā)公司,專(zhuān)注于成都軟件開(kāi)發(fā)服務(wù)原創(chuàng),轉(zhuǎn)載請(qǐng)注明來(lái)自http://hyd365.cn/news/4179.html