1. 什么是架構
我想這個問題,十個人回答得有十一個答案,因為另外的那一個是大家妥協的結果。哈哈,我理解,架構就是骨架,如下圖所示:

人類的身體的支撐是主要由骨架來承擔的,然后是其上的肌肉、神經、皮膚。架構對於軟件的重要性不亞於骨架對人類身體的重要性。
2. 什么是設計模式
這個問題我問過的面試者不下於數十次,回答五花八門,在我看來,模式就是經驗,設計模式就是設計經驗,有了這些經驗,我們就能在特定情況下使用特定的設計、組合設計,這樣可以大大節省我們的設計時間,提高工作效率。
作為一個工作10年以上的老碼農,經歷的系統架構設計也算不少,接下來,我會把工作中用到的一些架構方面的設計模式分享給大家,望大家少走彎路。總體而言,共有八種,分別是:
-
單庫單應用模式:最簡單的,可能大家都見過
-
內容分發模式:目前用的比較多
-
查詢分離模式:對於大並發的查詢、業務
-
微服務模式:適用於復雜的業務模式的拆解
-
多級緩存模式:可以把緩存玩的很好
-
分庫分表模式:解決單機數據庫瓶頸
-
彈性伸縮模式:解決波峰波谷業務流量不均勻的方法之一
-
多機房模式:解決高可用、高性能的一種方法
3. 單庫單應用模式
這是最簡單的一種設計模式,我們的大部分本科畢業設計、一些小的應用,基本上都是這種模式,這種模式的一般設計見下圖:

如上圖所示,這種模式一般只有一個數據庫,一個業務應用層,一個后台管理系統,所有的業務都是用過業務層完成的,所有的數據也都是存儲在一個數據庫中的,好一點會有數據庫的同步。雖然簡單,但是也並不是一無是處。
優點:結構簡單、開發速度快、實現簡單,可用於產品的第一版等有原型驗證需求、用戶少的設計。
缺點:性能差、基本沒有高可用、擴展性差,不適用於大規模部署、應用等生產環境。
4. 內容分發模式
基本上所有的大型的網站都有或多或少的采用這一種設計模式,常見的應用場景是使用CDN技術把網頁、圖片、CSS、JS等這些靜態資源分發到離用戶最近的服務器。這種模式的一般設計見下圖:
如上圖所示,這種模式較單庫單應用模式多了一個CDN、一個雲存儲OSS(七牛、又拍等雷同)。一個典型的應用流程(以用戶上傳、查看圖片需求為例)如下:
-
上傳的時候,用戶選擇本地機器上的一個圖片進行上傳
-
程序會把這個圖片上傳到雲存儲OSS上,並返回該圖片的一個URL
-
程序把這個URL字符串存儲在業務數據庫中,上傳完成。
-
查看的時候,程序從業務數據庫得到該圖片的URL
-
程序通過DNS查詢這個URL的圖片服務器
-
智能DNS會解析這個URL,得到與用戶最近的服務器(或集群)的地址A
-
然后把服務器A上的圖片返回給程序
-
程序顯示該圖片,查看完成。

由上可知,這個模式的關鍵是智能DNS,它能夠解析出離用戶最近的服務器。運行原理大致是:根據請求者的IP得到請求地點B,然后通過計算或者配置得到與B最近或通訊時間最短的服務器C,然后把C的IP地址返回給請求者。這種模式的優缺點如下:
優點:資源下載快、無需過多的開發與配置,同時也減輕了后端服務器對資源的存儲壓力,減少帶寬的使用。
缺點:目前來說OSS,CDN的價格還是稍微有些貴(雖然已經降價好幾次了),只適用於中小規模的應用,另外由於網絡傳輸的延遲、CDN的同步策略等,會有一些一致性、更新慢方面的問題。
