業(yè)務(wù)驅(qū)動(dòng)技術(shù)的發(fā)展是亙古不變的道理。最開始的時(shí)候,業(yè)務(wù)量少,業(yè)務(wù)復(fù)雜度低,采取的技術(shù)也相對(duì)簡(jiǎn)單,基本滿足用戶對(duì)功能的需求。
隨著 IT 信息化的普及,更多的交易放到了網(wǎng)絡(luò)上,信息量增加和訪問次數(shù)頻繁就是要解決的問題了。
因此,逐漸加入了緩存、集群等技術(shù)手段。同時(shí)對(duì)業(yè)務(wù)的擴(kuò)展性和伸縮性的要求也越來(lái)越高。
高并發(fā)、高可用、可伸縮、可擴(kuò)展、夠安全的軟件架構(gòu)一直是架構(gòu)設(shè)計(jì)追求的目標(biāo)。
今天我們來(lái)看一下架構(gòu)設(shè)計(jì)經(jīng)歷了哪些階段,每個(gè)階段都解決了哪些問題,又引出了哪些新問題。
主要是引起大家的思考,在不同的業(yè)務(wù)發(fā)展階段采取合適技術(shù)手段,用變化擁抱變化是 IT 人追求的目標(biāo)。
應(yīng)用與數(shù)據(jù)一體模式
最早的業(yè)務(wù)應(yīng)用以網(wǎng)站、OA 等為主,訪問的人數(shù)有限,單臺(tái)服務(wù)器就能夠應(yīng)付。
通常,將應(yīng)用程序和數(shù)據(jù)庫(kù)部署到一臺(tái)服務(wù)器上面
在這一階段,我們利用 LAMP(Linux Apache MySQL PHP)技術(shù)就可以迅速搞定,并且這些工具都是開源的。
很長(zhǎng)一段時(shí)間內(nèi),有各種針對(duì)這種應(yīng)用模式的開源代碼可以使用。這種模式基本上沒有高并發(fā)的要求,可用性也很差。
有的服務(wù)器采用托管模式,上面就安裝了不同的業(yè)務(wù)應(yīng)用,一旦服務(wù)器出現(xiàn)問題,所有的應(yīng)用就罷工了。
不過(guò)其開發(fā)和部署成本相對(duì)較低,適合剛剛起步的應(yīng)用服務(wù)。圖 1 就描述了單個(gè)應(yīng)用和數(shù)據(jù)庫(kù)運(yùn)行在單臺(tái)服務(wù)器的模式,我們稱這種模式為應(yīng)用與數(shù)據(jù)一體模式。
應(yīng)用與數(shù)據(jù)分離模式
隨著業(yè)務(wù)的發(fā)展,用戶數(shù)和請(qǐng)求數(shù)逐漸上升,服務(wù)器的性能出現(xiàn)了問題。其中比較簡(jiǎn)單的解決方案就是增加資源,將業(yè)務(wù)應(yīng)用和數(shù)據(jù)存儲(chǔ)分開。
其中,應(yīng)用服務(wù)器需要處理大量的業(yè)務(wù)請(qǐng)求,對(duì) CPU 和內(nèi)存有一定要求;而數(shù)據(jù)庫(kù)服務(wù)器需要對(duì)數(shù)據(jù)進(jìn)行存儲(chǔ)和索引等 IO 操作,對(duì)磁盤的轉(zhuǎn)速和內(nèi)存會(huì)考慮更多。
這樣的分離解決了性能的問題,我們需要擴(kuò)展更多的硬件資源讓其各司其職,使系統(tǒng)可以處理更多的用戶請(qǐng)求。
雖然業(yè)務(wù)上依舊存在耦和,但硬件層面的分離在可用性上比一體式設(shè)計(jì)要好很多。
緩存的加入
隨著信息化系統(tǒng)的發(fā)展和使用互聯(lián)網(wǎng)人數(shù)的增多,業(yè)務(wù)量、用戶量、數(shù)據(jù)量都在增長(zhǎng)。
我們同時(shí)發(fā)現(xiàn),用戶會(huì)對(duì)某些數(shù)據(jù)的請(qǐng)求量特別大,例如新聞、商品信息和熱門消息。
之前這些信息的獲取方式是依靠數(shù)據(jù)庫(kù),因此受到數(shù)據(jù)庫(kù) IO 性能的影響。此時(shí)數(shù)據(jù)庫(kù)成為了整個(gè)系統(tǒng)的瓶頸。
如果再增加服務(wù)器的數(shù)量,恐怕也很難解決,于是緩存技術(shù)就登場(chǎng)了
這里提到的緩存技術(shù)分為客戶端瀏覽器緩存、應(yīng)用服務(wù)器本地緩存和緩存服務(wù)器緩存。
①客戶端瀏覽器緩存:當(dāng)用戶通過(guò)瀏覽器請(qǐng)求服務(wù)器的時(shí)候,會(huì)發(fā)起 HTTP 請(qǐng)求。如果對(duì)每次 HTTP 請(qǐng)求進(jìn)行緩存,那么可以減少應(yīng)用服務(wù)器的壓力。
②應(yīng)用服務(wù)器本地緩存:它使用的是進(jìn)程內(nèi)緩存,又叫托管堆緩存。以 Java 為例,這部分緩存放在 JVM 的托管堆上面,同時(shí)會(huì)受到托管堆回收算法的影響。
由于它運(yùn)行在內(nèi)存中,對(duì)數(shù)據(jù)的響應(yīng)速度很快,通常我們會(huì)把熱點(diǎn)數(shù)據(jù)放在這里。
在進(jìn)程內(nèi)緩存沒有命中的時(shí)候,會(huì)到緩存服務(wù)器中獲取信息,如果還是沒有命中,才會(huì)去數(shù)據(jù)庫(kù)中獲取。
③緩存服務(wù)器緩存:它相對(duì)于應(yīng)用服務(wù)器本地緩存來(lái)說(shuō),就是進(jìn)程外緩存,既可以和應(yīng)用服務(wù)部署在同一服務(wù)器,也可以部署到不同的服務(wù)器。
一般來(lái)說(shuō),為了方便管理和合理利用資源,會(huì)將其部署到專門的緩存服務(wù)器上面。由于緩存會(huì)占用內(nèi)存空間,因此這類服務(wù)器會(huì)配置比較大的內(nèi)存。
圖 3 描述了緩存請(qǐng)求的次序,先訪問客戶端緩存,之后是進(jìn)程內(nèi)的本地緩存,接下來(lái)是緩存服務(wù)器,最后才是數(shù)據(jù)。
如果在任意一層獲取了緩存信息,就不再往下訪問了,否則會(huì)一直按照這個(gè)次序獲取緩存信息,直到數(shù)據(jù)庫(kù)。
用戶請(qǐng)求訪問數(shù)據(jù)的順序?yàn)榭蛻舳藶g覽器緩存→應(yīng)用服務(wù)器本地緩存→緩存服務(wù)器緩存。
如果按照以上次序還沒有命中數(shù)據(jù),才會(huì)訪問數(shù)據(jù)庫(kù)獲取數(shù)據(jù)。加入緩存的設(shè)計(jì),提高了系統(tǒng)的性能。
由于緩存放在內(nèi)存中,而內(nèi)存的讀取速度比磁盤要快得多,能夠很快響應(yīng)用戶請(qǐng)求。
特別針對(duì)一些熱點(diǎn)數(shù)據(jù),優(yōu)勢(shì)尤為明顯。同時(shí),在可用性方面也有明顯的改善。
即使數(shù)據(jù)庫(kù)服務(wù)器出現(xiàn)短時(shí)間的故障,緩存服務(wù)器中保存的熱點(diǎn)或者核心數(shù)據(jù)依舊可以滿足用戶暫時(shí)的訪問。當(dāng)然,后面還會(huì)對(duì)可用性進(jìn)行優(yōu)化。
服務(wù)器集群的加入
經(jīng)過(guò)前面三個(gè)階段的演進(jìn),系統(tǒng)對(duì)用戶的請(qǐng)求量有了很好的支持。實(shí)際上,這都是在解決高性能和可用性的問題,這一核心問題會(huì)一直貫穿整個(gè)系統(tǒng)架構(gòu)的演進(jìn)過(guò)程中。
隨著用戶請(qǐng)求量的增加,另外一個(gè)問題又出現(xiàn)了,那就是并發(fā)。把這兩個(gè)字拆開了來(lái)看:并,理解為“一起并行“,有同時(shí)的意思;發(fā),理解為“發(fā)出調(diào)用”,也就是請(qǐng)求的意思。
合起來(lái)就是多個(gè)用戶同時(shí)請(qǐng)求應(yīng)用服務(wù)器。如果說(shuō)原來(lái)的系統(tǒng)面對(duì)的僅僅只是大數(shù)據(jù)量的話,那么現(xiàn)在就需要面對(duì)多用戶同時(shí)請(qǐng)求。
如果還是按照上一個(gè)階段的架構(gòu)圖推導(dǎo),單個(gè)應(yīng)用服務(wù)器已經(jīng)無(wú)法滿足高并發(fā)的要求了。
此時(shí),服務(wù)器集群就加入戰(zhàn)場(chǎng)了
(編輯:武林網(wǎng))
新聞熱點(diǎn)
疑難解答
圖片精選