細談八種架構(gòu)"設(shè)計模式"及其優(yōu)缺點概述

什么是架構(gòu)

我想這個問題,十個人回答得有十一個答案,因為另外的那一個是大家妥協(xié)的結(jié)果。哈哈,我理解,架構(gòu)就是骨架,如下圖所示:

人類的身體的支撐是主要由骨架來承擔的,然后是其上的肌肉、神經(jīng)、皮膚。架構(gòu)對于軟件的重要性不亞于骨架對人類身體的重要性。

什么是設(shè)計模式

單庫單應(yīng)用模式:最簡單的,可能大家都見過
內(nèi)容分發(fā)模式:目前用的比較多
查詢分離模式:對于大并發(fā)的查詢、業(yè)務(wù)
微服務(wù)模式:適用于復(fù)雜的業(yè)務(wù)模式的拆解
多級緩存模式:可以把緩存玩的很好
分庫分表模式:解決單機數(shù)據(jù)庫瓶頸
彈性伸縮模式:解決波峰波谷業(yè)務(wù)流量不均勻的方法之一
多機房模式:解決高可用、高性能的一種方法

單庫單應(yīng)用模式


優(yōu)點:結(jié)構(gòu)簡單、開發(fā)速度快、實現(xiàn)簡單,可用于產(chǎn)品的第一版等有原型驗證需求、用戶少的設(shè)計。 缺點:性能差、基本沒有高可用、擴展性差,不適用于大規(guī)模部署、應(yīng)用等生產(chǎn)環(huán)境。

內(nèi)容分發(fā)模式


上傳的時候,用戶選擇本地機器上的一個圖片進行上傳 程序會把這個圖片上傳到云存儲OSS上,并返回該圖片的一個URL 程序把這個URL字符串存儲在業(yè)務(wù)數(shù)據(jù)庫中,上傳完成。 查看的時候,程序從業(yè)務(wù)數(shù)據(jù)庫得到該圖片的URL 程序通過DNS查詢這個URL的圖片服務(wù)器 智能DNS會解析這個URL,得到與用戶最近的服務(wù)器(或集群)的地址A 然后把服務(wù)器A上的圖片返回給程序 程序顯示該圖片,查看完成。
優(yōu)點:資源下載快、無需過多的開發(fā)與配置,同時也減輕了后端服務(wù)器對資源的存儲壓力,減少帶寬的使用。 缺點:目前來說OSS,CDN的價格還是稍微有些貴(雖然已經(jīng)降價好幾次了),只適用于中小規(guī)模的應(yīng)用,另外由于網(wǎng)絡(luò)傳輸?shù)难舆t、CDN的同步策略等,會有一些一致性、更新慢方面的問題。

查詢分離模式

這種模式主要解決單機數(shù)據(jù)庫壓力過大,從而導(dǎo)致業(yè)務(wù)緩慢甚至超時,查詢響應(yīng)時間變長的問題,也包括需要大量數(shù)據(jù)庫服務(wù)器計算資源的查詢請求。這個可以說是單庫單應(yīng)用模式的升級版本,也是技術(shù)架構(gòu)迭代演進過程中的必經(jīng)之路。這種模式的一般設(shè)計見下圖:

服務(wù)端把一條業(yè)務(wù)數(shù)據(jù)落庫 服務(wù)端異步把該條數(shù)據(jù)發(fā)送到ES ES把該條記錄按照規(guī)則、配置放入自己的索引庫 客戶端查詢的時候,由服務(wù)端把這個請求發(fā)送到ES,得到數(shù)據(jù)后,根據(jù)需求拼裝、組合數(shù)據(jù),返回給客戶端
服務(wù)端把一條業(yè)務(wù)數(shù)據(jù)落庫 數(shù)據(jù)庫同步或異步或半同步把該條數(shù)據(jù)復(fù)制到從庫 服務(wù)端讀數(shù)據(jù)的時候直接去從庫讀相應(yīng)的數(shù)據(jù)
優(yōu)點:減少數(shù)據(jù)庫的壓力,理論上提供無限高的讀性能,間接提高業(yè)務(wù)(寫)的性能,專用的查詢、索引、全文(分詞)解決方案。 缺點:數(shù)據(jù)延遲,數(shù)據(jù)一致性的保證。

微服務(wù)模式

單機數(shù)據(jù)庫寫請求量大量增加,導(dǎo)致數(shù)據(jù)庫壓力變大 數(shù)據(jù)庫一旦掛了,那么整個業(yè)務(wù)都掛了 業(yè)務(wù)代碼越來越多,都在一個GIT里,越來越難以維護 代碼腐化嚴重、臭味越來越濃 上線越來越頻繁,經(jīng)常是一個小功能的修改,就要整個大項目要重新編譯 部門越來越多,該哪個部門改動大項目中的哪個東西,撕逼的厲害 其他一些外圍系統(tǒng)直接連接數(shù)據(jù)庫,導(dǎo)致一旦數(shù)據(jù)庫結(jié)構(gòu)發(fā)生變化,所有的相關(guān)系統(tǒng)都要通知,甚至對修改不敏感的系統(tǒng)也要通知 每個應(yīng)用服務(wù)器需要開通所有的權(quán)限、網(wǎng)絡(luò)、FTP、各種各樣的,因為每個服務(wù)器部署的應(yīng)用都是一樣的 作為架構(gòu)師,我已經(jīng)失去了對這個系統(tǒng)的把控......

優(yōu)點:相對高性能,可擴展性強,高可用,適合于中等以上規(guī)模公司架構(gòu)。 缺點:復(fù)雜、度不好把握。指不僅需要一個能在高層把控大方向、大流程、總體技術(shù)的人,還需要能夠針對各個子系統(tǒng)有針對性的開發(fā)。把握不好度或者濫用的話,這個模式適得其反!

多級緩存模式

這個模式可以說是應(yīng)對超高查詢壓力的一種普遍采用的策略,基本的思想就是在所有鏈路的地方,能加緩存就加緩存,如下圖所示:

優(yōu)點:抗住大量讀請求,減少后端壓力。 缺點:數(shù)據(jù)一致性問題較突出,容易發(fā)生雪崩,即:如果客戶端緩存失效、API網(wǎng)關(guān)緩存失效,那么所有的大量請求瞬間壓向后端業(yè)務(wù)系統(tǒng),后果可想而知。

分???庫分表模式


主機:硬件,指一臺物理機,或者虛擬機,有自己的CPU,內(nèi)存,硬盤等。
實例:數(shù)據(jù)庫實例,如一個MySQL服務(wù)進程。一個主機可以有多個實例,不同的實例有不同的進程,監(jiān)聽不同的端口。
庫:指表的集合,如學校庫,可能包含教師表、學生表、食堂表等等,這些表在一個庫中。一個實例中可以有多個庫。庫與庫之間用庫名來區(qū)分。
表:庫中的表,不必多說,不懂的就不用往下看了,不解釋。
主機:這是最主要的也是最重要的點,本質(zhì)上分庫分表是因為計算與存儲資源不夠?qū)е碌模@種資源主要是由物理機,主機提供的,所以在這里分是最基本的,畢竟沒有可用的計算資源,怎么分效果都不是太好的。 實例:實例控制著連接數(shù),同時受OS限制,CPU、內(nèi)存、硬盤、網(wǎng)絡(luò)IO也會受間接影響。會出現(xiàn)熱實例的現(xiàn)象,即:有些實例特別忙,有些實例非常的空閑。一個典型的現(xiàn)象是:由于單表反應(yīng)慢,導(dǎo)致連接池被打滿,所有其他的業(yè)務(wù)都受影響了。這時候,把表分到不同的實例是有一些效果的。 庫:一般是由于單庫中最大單表數(shù)量的限制,才采取分庫。 表:單表壓力過大,索引量大,容量大,單表的鎖。據(jù)以上,把單表水平切分成不同的表。
優(yōu)點:減少數(shù)據(jù)庫單表的壓力。 缺點:事務(wù)保證困難、業(yè)務(wù)邏輯需要做大量改造。

彈性伸縮模式

這種模式主要解決突發(fā)流量的到來,導(dǎo)致無法橫向擴展或者橫向擴展太慢,進而影響業(yè)務(wù),全站崩潰的問題。這個模式是一種相對來說比較高級的技術(shù),也是各個大公司目前都在研究、試用的技術(shù)。截至今日,有這種思想的架構(gòu)師就已經(jīng)是很不錯了,能夠拿到較高薪資,更別提那些已經(jīng)實踐過的,甚至實現(xiàn)了底層系統(tǒng)的那些,所以,你懂得...... 這種模式的一般設(shè)計見下圖:

優(yōu)點:彈性、隨需計算,充分優(yōu)化企業(yè)計算資源。 缺點:應(yīng)用要從架構(gòu)層做到可橫向擴展化改造、依賴的底層配套比較多,對技術(shù)水平、實力、應(yīng)用規(guī)模要求較高。

多機房模式


優(yōu)點:高可用、高性能、異地多活。 缺點:數(shù)據(jù)同步、數(shù)據(jù)一致性、請求路由。
作者:風平浪靜如馬
來源:juejin.cn/post/6844904007438172167
全棧架構(gòu)社區(qū)交流群
「全棧架構(gòu)社區(qū)」建立了讀者架構(gòu)師交流群,大家可以添加小編微信進行加群。歡迎有想法、樂于分享的朋友們一起交流學習。
