什麼是構建乙個可維護和可擴充套件的系統的意義?
在早期,乙個系統的形態,只是滿足使用者和伺服器資源之間的通道,唯一要擴充套件和維護的是系統後面的資源,保證資源的可用和夠用,而系統本身的壓力並不大。
如今,開源元件已經成為構建一些企業系統的基石,伴隨著行業的發展,最佳實踐和圍繞這些系統架構的指導原則也逐漸顯現出來了,在什麼時候該用什麼樣的技術,需要考慮到哪些方面,各路牛人早有撰文總結。
本文簡單回顧一下,我們在設計一些分布式系統的時候需要考慮的一些關鍵因素,我們稱之為分布式系統設計原則。
我們將這些在構建系統需要考慮的因素稱之為分布式架構設計原則,如下圖所示,有六個部分,右邊是我們設計系統要達到的基本要求,包括可用、可靠以及效能,這也是乙個可維護和可擴充套件系統最大的意義
,而左邊是系統設計和開發期間要考慮的三個部分,包括擴充套件性、維護性和成本控制。
我把原則分為倆個大的方面,目標原則 和 實踐原則,
站在使用者和公司的角度,要求我們設計的系統都必須要滿足以下幾個原則,特別是網際網路性質的系統,這三個原則都是非常重要的。
可靠性,系統的可靠性,能夠保證資料分割槽後,資料的一致性和永續性,相同的請求同一時間返回一致的資料,資料更新以後使用者能夠獲取最新的資料,如果是最終一致,或延遲一致要保證資料的永續性;
效能,系統效能,由於使用者和流量的不斷增長,逐漸成為很多公司關注的另乙個焦點,因為雖然做到可用,但系統響應速度也會直接影響使用者的使用和滿意度,如果是**的話,也會影響搜尋引擎的排名,最終影響使用者的粘度和收益。
所以,優化系統的響應速度,降低延遲,提高吞吐量,也是非常關鍵的。
滿足以上目標原則,我們要考慮系統的實現,如何來滿足以上的目標原則,我把他稱為 實現原則,能夠在不同的階段,讓系統都能夠適應需求的變化,並在提高成本的情況下,持續滿足以上幾個目標原則。
擴充套件性,當今但凡談到分布式系統,擴充套件性是首要考慮的乙個方面,google在這方面表現的尤為激進,可以讓系統做到無限擴充套件,例如spanner,用空間換效率,用規模覆蓋演算法的次優選。所以,擴充套件系統的各個部分,幾乎是達到可用性、可靠性和效能要求的主要手段。
擴充套件性涉及系統的方方面面,通常是倆個緯度,scale up 和 scale out,當然,在《the art of scalability》中,提到的scale cube,是從三個不同緯度來擴充套件系統,也是擴充套件的一種方法,稍後單開一篇介紹,這裡就不展開了;
維護性,正所謂,乙個系統配套好的運維工具,能夠千方百計的彌補和設法繞過系統實現上的缺陷,使得系統整體可用性比較高,相反,會讓系統的任何的問題都會毫無掩蓋的暴露給使用者,沒有任何預警資訊,同時也會增加發現問題和排查問題的成本。
因此,在設計和實現乙個系統的時候,如何做到容易維護是另乙個重要的考量,幾乎跟擴充套件性同樣重要,當問題發生,我們如何及時的診斷和了解問題原因,甚至能夠及時的做出行動,影響系統,控制損失,降低故障級別;
(本人多次在這方面吃虧,經歷了血的教訓,開始把運維工具與功能開發提到同樣的重要級別,確保問題能夠及時發現,甚至提前預警)
成本控制,成本當然也是乙個重要的方面,包括開發、維護、培訓和硬體等成本,系統開發完成上線之後,硬體的持續投入會讓成本不斷增加,要讓成本的投入看到效能的成倍增長,同時,根據業務量,伸縮成本的投入,按需開資,不過度設計和過度冗餘,導致資源閒置,浪費。
這些原則作為在分布式系統架構設計的基本決策的原則,並不是絕對真理,在實踐當中,有時候會發生衝突和矛盾,需要做出一些犧牲和平衡,例如,在實踐擴充套件性的時候,會增加維護和開銷成本,甚至會影響可靠性。
不管怎麼說,在設計分布式系統的時候,關注這些原則是非常重要的,即使有時候需要做出一些犧牲和平衡,但,這就是技術,這也是生活。
《scalable web architecture and distributed systems》
《the scale cube》
從構建分布式秒殺系統聊聊分布式鎖
摘要 前言 最近懶成一坨屎,學不動系列一波接一波,大多還都是底層原理相關的。上周末抽時間重讀了周志明大濕的 jvm 高效併發部分,每讀一遍都有不同的感悟。路漫漫,藉此,把前段時間搞著玩的秒殺案例中的分布式鎖深入了解一下。最近懶成一坨屎,學不動系列一波接一波,大多還都是底層原理相關的。上周末抽時間重讀...
構建可觀測的分布式系統
如今的系統正在變得越來越複雜 微服務在網路上是分布式存在的,並且能夠動態擴充套件,這樣會導致各種形式的故障,出現故障的方式是我們無法預料的。如果盲目相信我們能夠構建完美的系統將會形成錯誤的安全感,所以我們需要預先為此做好充分地準備。在可觀測方面進行投資能夠讓我們掌握系統的執行狀況,這些事情是我們以前...
分布式 分布式系統的設計
在計算機領域,當單機效能達到瓶頸時,一般有兩種方式解決效能問題 而分布式系統的設計說白了就是 如何合理將乙個系統拆分成多個子系統部署到不同機器上。講設計方法前,先介紹分布式系統的特性 1 分布性 空間中隨機分布。這些計算機可以分布在不同的機房,不同的城市,甚至不同的國家。2 對等性 分布式系統中的計...