首頁>技術>

無論是在早起的MVC還是當前的微服務系統架構中,系統設計的核心其實都是圍繞著資料來進行的,通過對應資料的讀取方式、資料量和安全性等特點來進行對應的選型,針對不同型別的資料我們通常會為其選擇對應的資料儲存

結合上面架構,針對每個場景我們通常都有N多選擇,在實際的架構中,我們通過對比每個開源軟體核心特性以及我們的業務特徵選擇對應的儲存

在實際的工業環境中結合各種開源軟體,如何設計出一個具有高可用性、高可靠性和擴充套件性的系統,也就變成了我們做為程式設計師核心解決的問題,只有保住了我們業務,才能保證我們不失業,才能保證有錢還房貸

2.資料系統中的可靠性

2.1 大白話可靠性與容錯

容錯通常是指系統應對非預期錯誤或者故障的能力,而錯誤又包含很多方面可以是非預期的資料、過量的負載、其他高延遲元件、底層硬體故障,但通常我們可以分為三類:硬體故障、軟體故障、人為故障,而在最近兩年比較火的一個代表則是Netflix的Chaos Monkey,通過故意的自我破壞來驗證系統的可靠性

2.2 硬體故障的挑戰應對措施

硬體錯誤其實在通常的軟體系統設計中很少涉及,通常在日常的設計中只有在幾個特殊的場景才會關係,比如在資料庫底層的資料儲存的時候,通常會根據容量和安全性的考慮來進行Raid的選擇,在一些網路效能要求特別高的情況下進行網絡卡的bond的選擇,而在其他場景中則比較少見

2.3 軟體錯誤的挑戰與應對措施

軟體錯誤的種類繁多,從依賴的關聯服務到系統底層的硬體和使用的資源,種種因素都可能導致軟體的錯誤執行,而在日常的系統設計中比較常見的軟體錯誤,主要分為三類:異常資料、資源失控和關聯故障

通常在系統設計中,異常的資料和資源的失控都可以通過第三方的手段來進行遮蔽,比如安全防火牆、資源排程器等,而與程式設計師密切相關則就是關聯故障

關聯故障典型分為依賴故障和及聯故障,而在軟體系統開發過程中應對這兩種情況通常主要的三大措施就是:熔斷、限流、降級,通過對故障的服務進行隔離或者對非關鍵業務的降級來保證黃金鍊路的可靠性

2.4 人為故障的挑戰與應對措施

人為故障通常是最複雜的,比如配置錯環境、刪錯資料、RM個系統等等,而通常在人為故障的減少的實踐中,通常會從設計、流程、生產三個方面進行保障,實際上就是對應軟體開發的三個過程:設計、編碼和上線

3.可擴充套件性

3.1 負載的概念以及相關衡量標準

在作業系統中通過負載來判斷當前系統的資源利用率,在業務系統中通過負載來描述當前業務的健康狀況,負載的本身其實就是一組可以共同描述某個系統的核心指標

在作業系統中我們通過CPU、IO、記憶體、網路等核心資源的使用率來衡量當前系統的資源利用率,而在業務系統中通常通過延遲、資料量和業務指標幾個方向去衡量

3.2負載效能與資源

通常面試的時候喜歡問個問題,就是你的業務規模擴大N倍,如何應對,這個問題本質上其實就是考慮系統當前的極限效能,在給定資源下可以負載的業務規模,比如4核8G的機器上我們可以處理1000qps,那如果需要2000qps該如何應對?顯然通過單獨的系統資源倍增的情況下,我們很難得到倍增的效能,就需要根據木桶原理找到最短的那塊板,來提升系統負載能力

3.3 隨機負載

隨機負載指的是在某些特殊情況下隨機會觸發的某些問題,造成當前系統的負載增加,從而影響業務的關鍵指標,但是通常對待隨機負載都是會選擇性容忍,比如通常不會因為丟包問題,而在TCP上再構建一層ACK機制,因為通常應對這種隨機負載投入與收益不成正比

3.4 狀態與擴充套件方向

系統的擴充套件通常需要從系統的資料狀態與擴充套件方向兩個角度來思考,對於無狀態應用,通常我們選擇水平擴充套件,通過增加節點的方式來進行系統的擴充套件,而對於有狀態的系統則選擇垂直擴充套件通常可以減少系統的改造成本, 並且通過綜合考慮資料的訪問模式、讀寫量、儲存量、複雜度和響應時間幾個關鍵角度來決定系統如何進行擴充套件

4.可維護性

4.1 生產環境的可維護性

可維護性主要主要包含兩個方面:運維與設計,可運維性是指系統的運維成本相對較低,減少運維成本,而設計上則首先是簡單性,易於其他程式設計師理解,降低學習成本,最後一個則是演進性,指系統應對業務變更和更新演化的能力

4.2 軟體系統設計的簡單性的

簡單性通常又分為五個大的方面,使用高階語言來遮蔽底層的各種程式設計概念、使用流行的框架降低大家的學習成本,模組之間採用低耦合的設計,針對類級別的抽象設計和重用開源輪子,避免重複設計

5. 嘗試深入思考不做搜尋型程式設計師

在上面的整個系統設計中其核心都是圍繞著資料,根據資料的儲存要求和訪問方式來進行對應的選型,迴歸到本質其實就是常說的資料結構與演算法,結合記憶體和磁碟的Btree來實現磁碟,可定址與可丟失的記憶體hash表來實現redis,倒排索引的Elasticsearch、可順序訪問的訊息佇列等等,嘗試這種思考,讓自己在面對系統設計的時候,可以更加理性一點,而不是人云亦云

嘗試更多的思考問題,閱讀經典書籍,而不在是一直做一個沒有思考的搜尋CRUD程式設計師

最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 10 個可以在平板電腦上使用的 Python 編輯器