導讀

本文一文總結軟體架構設計常用概念、原則與思想,包括面向物件六大原則,DID原則,ACID、CAP、BASE理論,中間層思想,快取思想等。

面向物件設計六大原則

一 單一職責原則(SRP):

定義是就一個類而言,應該僅有一個引起他變化的原因。也就是說一個類應該只負責一件事情;

二 開閉原則(OCP):

定義是軟體中的物件(類,模組,函式等)應該對於擴充套件是開放的,但是對於修改是關閉的;當需求發生改變的時候,我們需要對程式碼進行修改,這個時候我們應該儘量去擴充套件原來的程式碼,而不是去修改原來的程式碼,因為這樣可能會引起更多的問題;

三 里氏替換原則(LSP):

所有引用基類的地方必須能夠透明地使用其子類的物件;子類可以去擴充套件父類的功能,但是不能改變父類原有的功能,它包含以下幾層意思: 1.子類可以實現父類的抽象方法,但是不能覆蓋父類的非抽象方法; 2.子類可以增加自己獨有的方法; 3.當子類的方法過載父類的方法時候,方法的形參要比父類的方法的輸入引數更加寬鬆; 4.當子類的方法實現父類的抽象方法時,方法的返回值要比父類更嚴格;

四 依賴倒置原則(DIP):

高層模組不應該依賴底層模組,兩個都應該依賴抽象;抽象不應該依賴細節,細節應該依賴抽象;定義有點繞,說白了,就是要針對介面程式設計,而不是對實現程式設計;(抽象指的是介面或者抽象類,兩者皆不能例項化;而細節就是實現類,也就是實現了介面或者繼承了抽象類的類,它是可以被例項化的;高層模組指的是呼叫端,底層模組是具體的實現類,在java中,依賴倒置原則是指模組間的依賴是通過抽象來發生的,實現類之間不發生直接的依賴關係,其依賴關係是通過介面來實現的,這就是通俗的面向介面程式設計)

五 介面隔離原則(ISP):

客戶端不應該依賴他不需要的介面;

六 迪米特原則(LOD):

一個物件應該對其他物件保持最小的瞭解;

Robert C Martin在21世紀早期將單一職責,開閉原則,里氏替換,介面隔離和依賴倒置5個原則定義為SOLID原則。

DID原則

Design(D)設計20倍的容量;Implement(I)實施3倍的容量;Deploy(D)部署1.5倍的容量。 DID為產品擴充套件提供了經濟,有效,及時的方法。

中間層思想

計算機系統軟體體系結構採用一種層的結構,有人說過一句名言:

Any problem in computer science can be solved by another layer of indirection. (電腦科學領域的任何問題都可以通過增加一個間接的中間層來解決。)

這句話幾乎概括了計算機系統軟體體系結構的設計要點,整個體系結構從上到下都是按照嚴格的層次結構設計的,不僅是計算機系統軟體整個體系是這樣的,體系裡面的每個元件比如OS本身,很多應用程式、軟體系統甚至很多硬體結構都是按照這種層次的結構組織和設計的。 縱觀計算機體系,中間層思想無處不在,比如

  • MVC三層架構
  • 四層/七層網路模型
  • 新增快取層提升系統性能
  • ……

快取思想

世界是相似的,在商業的世界中,有一句經典語錄叫 “現金為王”。在網際網路乃至整個軟體技術世界中,與之對應的一個說法就是 “快取為王”。 縱觀整個系統,快取無處不在。

CPU快取

由於CPU的運算速度要比記憶體讀寫速度快很多,CPU總有等待資料的時候,而快取記憶體則解決了CPU運算速度與記憶體讀寫速度不匹配的矛盾。當CPU呼叫資料時,先從快取中呼叫,從而加快讀取速度。而且,CPU是有多級快取的。

瀏覽器快取

前端頁面快取有兩層含義,一個是頁面自身對某些頁面元素或全部元素進行快取,另一層意思是服務端將靜態頁面或動態頁面的元素進行快取,然後給客戶端使用。這裡的頁面快取指的是頁面自身的快取或者離線應用快取。 HTML5 支援了離線快取和本地儲存,使用這種特性可以很方便的建立頁面應用。

網路中的快取

  • CDN快取
  • 反向代理快取

服務端快取

  • 記憶體級快取
  • 分散式快取

資料庫快取

拿mysql來說。mysql使用查詢緩衝機制。將select語句和結果存在緩衝區。下次遇到相同select就直接從緩衝區拿資料。

ACID(酸)

ACID,指資料庫事務正確執行的四個基本要素的縮寫。資料庫必須同時滿足ACID支援強一致性,ACID指如下內容:

A:原子性(Atomicity)

原子性是指事務是一個不可分割的工作單位,事務中的操作要麼都發生,要麼都不發生。

C:一致性(Consistency)

事務前後資料的完整性必須保持一致。

I:隔離性(Isolation)

事務的隔離性是多個使用者併發訪問資料庫時,資料庫為每一個使用者開啟的事務,不能被其他事務的操作資料所幹擾,多個併發事務之間要相互隔離。

D:永續性(Durability)

永續性是指一個事務一旦被提交,它對資料庫中資料的改變就是永久性的,接下來即使資料庫發生故障也不應該對其有任何影響

CAP(帽子原理)

CAP原則又稱CAP定理,指的是在一個分散式系統中,CAP三個要素最多隻能同時實現兩點,不可能三者兼顧。 CAP分別是指

C:一致性(Consistency)

所有節點在同一時間的資料完全一致,這裡的一致性指的是強一致性

A:可用性(Availability)

對於一個可用性的分散式系統,每一個非故障的節點必須對每一個請求作出響應。通常我們用幾個9來描述可用性,比如5個9的可用性意思為可用水平是99.999%,即全年停機時間不超過 (1-0.99999)36524*60 = 5.256 min。

P:分割槽容錯性(Partition tolerance)

分割槽容錯性指分散式系統在遇到某節點或網路分割槽故障的時候,仍然能夠對外提供滿足一致性和可用性的服務。比如現在的分散式系統中有某一個或者幾個機器宕掉了,其他剩下的機器還能夠正常運轉滿足系統需求。

BASE(鹼)

eBay的架構師Dan Pritchett源於對大規模分散式系統的實踐總結,在ACM上發表文章提出BASE理論,BASE理論是對CAP理論的延伸,核心思想是即使無法做到強一致性(Strong Consistency,CAP的一致性就是強一致性),但應用可以採用適合的方式達到最終一致性(Eventual Consitency)。

BA:基本可用(Basically Available)

基本可用是指分散式系統在出現故障的時候,允許損失部分可用性,即保證核心可用。 電商大促時,為了應對訪問量激增,部分使用者可能會被引導到降級頁面,服務層也可能只提供降級服務。這就是損失部分可用性的體現。

S:軟狀態(Soft state)

軟狀態是指允許系統存在中間狀態,而該中間狀態不會影響系統整體可用性。分散式儲存中一般一份資料至少會有三個副本,允許不同節點間副本同步的延時就是軟狀態的體現。mysql replication的非同步複製也是一種體現。

E:最終一致(Eventually consistent)

最終一致性是指系統中的所有資料副本經過一定時間後,最終能夠達到一致的狀態。弱一致性和強一致性相反,最終一致性是弱一致性的一種特殊情況。

酸鹼平衡理論

ACID是傳統資料庫常用的設計理念,追求強一致性模型。BASE支援的是大型分散式系統,提出通過犧牲強一致性獲得高可用性。 ACID和BASE代表了兩種截然相反的設計哲學,基於根據ACID與BASE提出了酸鹼平衡理論,即在不同場景下,分別使用ACID與BASE解決分散式一致性問題。

感謝閱讀,原創不易,如有啟發,點個贊吧!這將是我寫作的最強動力!本文不同步釋出於不止於技術的技術公眾號 Nauyus ,主要分享一些程式語言,架構設計,思維認知類文章, 2019年12月起開啟周更模式,歡迎關注,共同學習成長!