天天看點

架構師必須懂的設計原則

KISS設計原則:(Keep It Simple,Stupid)

  • 首選簡單的代碼和體系結構。
  • 避免複雜的抽象。
  • 避免使用魔術代碼和奇特的算法。
  • 避免大的外部依賴性。
  • 減少分布式系統中活動部件的數量。
  • 避免自動決策,這可能會損害群集的可用性,一緻性或性能。

附:另外,還有 KISS編碼原則,參見:https://www.cnblogs.com/yutiansanshou/archive/2012/12/05/2802653.html

YAGNI原則 (You Ain’t Gonna Need It)——适可而止、避免過度設計

在一個軟體項目中,往往80%的時間花費在20%的功能上。

當你準備列出一個項目清單時,試着考慮以下問題:

  • 通過降低抽象的層級,來實作低複雜度
  • 将功能和特性區分開
  • 适度接受非功能性需求
  • 識别耗時的任務,并擺脫它們

功能與特性的差別是什麼?

    功能可以了解為:有哪些“核心能力”,可以滿足核心需求。而特色是“細節上和使用者體驗上的功能”,滿足的是非核心需求。

什麼是非功能性需求?

非功能性的需求并不會描述軟體行為,它們隻會描述一些可以用來判别軟體品質的附加屬性。例如性能、穩定性、可擴充性、可維護性等。

DRY原則 - Don't Repeat Yourself(避免重複)

顧名思義,無需解釋。

三大原則之間的差別與聯系:

  • DRY将項目切分成可控的元件來降低複雜度,而YAGNI是通過減少元件個數來降低複雜度。
  • YAGNI很像KISS原則,因為它也是緻力于建構簡單的方案。然而,KISS是通過盡可能容易的完成某件事情來實作精簡方案;但YAGNI是通過根本就不實作它來達到精簡。

AKF拆分原則(橫向、縱向擴充與拆分)

    AKF,單詞來源于化學領域的礦物質AKF圖解(AKF diagram),其中A代表氧化鋁,K代表氧化鉀,F代表氧化亞鐵。但這裡是引申意義,了解為可擴充立方體,這個立方體中沿着三個坐标軸設定分别為:X、Y、Z。

    X軸擴充即傳統的(橫向擴充,增加執行個體,水準複制、克隆),通過絕對平等地複制服務與資料,以解決容量和可用性的問題。其實就是将微服務運作多個執行個體,做叢集加負載均衡的模式。

    Y軸擴充會将龐大的整體應用拆分為多個服務(縱向擴充,拆分功能、服務)。每個服務實作一組相關的功能,如訂單管理、客戶管理等。在工程上常見的方案是 服務化架構(SOA) 。比如對于一個電子商務平台,我們可以拆分成不同的服務。

    Z軸擴充通常是指基于請求者或使用者獨特的需求,進行系統劃分,并使得劃分出來的子系統是互相隔離但又是完整的。以生産汽車的工廠來舉例:福特公司為了發展在中國的業務,或者利用中國的廉價勞動力,在中國建立一個完整的子工廠,與美國工廠一樣,負責完整的汽車生産。這就是一種 Z 軸擴充。

    Z軸和X軸擴充的差別在于,X軸是單純資源的複制、克隆,而Z軸擴充是基于資料的劃分。以資料庫的擴充為例,X軸是單純增加資料庫節點,Y軸是做讀寫分離,Z軸是分庫分表。

《The Art of Scalability——架構即未來》書中提到的15個架構原則

總結如下:

1、N+1設計:系統中的每個元件都應做到沒有單點故障。

2、復原設計:確定系統可以向前相容,在系統更新時應能有辦法復原到以前釋出過的任何版本;

可以通過釋出系統保留曆史版本,或者代碼中引入動态開關切換機制 (Feature Switch)。

3、開關設計/禁用設計

能夠關閉任何釋出的功能。新功能隐藏在動态開關機制 (Feature Switch) 後面,可以按需一鍵打開,如發現問題随時關閉禁用。

4、監控設計:在設計階段就要考慮監控的手段,而不是在實施完畢之後補充。

例如在需求階段就要考慮關鍵名額監控項,這就是度量驅動開發 (Metrics Driven Development) 的理念。

5、使用成熟的技術:剛開發或開源的技術往往存在很多隐藏的bug,出了問題沒有商業支援可能會是一個災難;

盡量選擇成熟好用的技術。商業組織畢竟不是研究機構,技術要落地實用,成熟的技術一般坑都被踩平了,新技術在完全成熟前一般需要踩坑躺坑,這裡包含:小到成熟功能函數,大到開源或商業的元件、中間件。

6、前瞻性設計:設計時至少要有兩步前瞻性,在擴充性問題發生前考慮好下一步的行動計劃;

架構師的價值就展現在這裡,架構設計對于流量的增長要有提前量。我們一般設計出能支撐短期目标20倍容量的目标系統架構,實作支撐5倍以上容量的架構方案開發,部署2倍容量的系統。

7、非核心則購買:非核心功能若需要占用大量的研發資源才能解決,則考慮購買成熟的産品;

如果不是你最擅長,也提供不了差異化的競争優勢則直接購買。避免凡事都要重造輪子(Not Invented Here),畢竟達成業務目标才是重點。

8、使用商品化硬體:商用硬體能有效降低硬體故障的機率;

9、架構應能水準擴充:系統隻有做到能水準擴充,才能有效避免瓶頸問題;

做到水準擴充而非垂直更新,永遠不要依賴更大、更快的硬體裝置建構核心業務系統。

10-1、資源隔離設計:應避免單一業務占用全部資源;

10-2、隔離故障設計:實作故障隔離設計,通過斷路保護避免故障傳播和交叉影響。

故障隔離包括:1.基礎元件内的節點屏蔽;2.單個系統單個服務降級、流控;3.全局流控降級;4.系統單元化:通過艙壁泳道等機制隔離失敗單元 (Failure Unit),一個單元的失敗不至影響其它單元的正常工作;

11、無狀态設計:服務接口應該做成無狀态的,目前接口的通路不依賴于接口上次通路的狀态。

無狀态系統易于擴充,有狀态系統不易擴充且狀态複雜時更易出錯。

12、異步設計:能異步盡量用異步,隻有當絕對必要或者無法異步時,才使用同步調用。

13、快速疊代:小建構、小釋出和快速試錯

系統應該快速開發小功能子產品,盡快上線進行驗證,早日發現問題大大降低系統傳遞的風險;

14、自動化:如果機器可以做,就不要依賴于人。

機械化任務通過自動化工具處理,可以大大提升效率及可靠性。

15、多活資料中心設計:不要被一個資料中心的解決方案把自己限制住;

若系統需要極高的高可用,且成本和公司規模發展階段允許,應考慮到在多地實施資料中心進行系統多活,至少在一個機房不可用的情況下系統依然可用、資料不丢失。

繼續閱讀