淺析基礎架構
爲什麼要做架構設計
-
大家都做,所以我也做。
-
所有的系統必須要有架構設計
-
公司要求,系統開發必須要有架構設計的流程
如果是以上的原因,就失去了做架構的意義,是爲了做架構而做架構,可能會浪費人力物力得不償失。那麼做架構的目的是什麼呢?
架構設計的主要目的是爲了解決軟件系統複雜度帶來的問題
系統複雜度的來源
-
高性能
爲了提高性能又從兩個方面可以提升
計算機內部複雜度的關鍵就是操作系統,操作系統和性能最相關的是進程和線程。人們發明出進程,一個進程對應一個任務,會佔用獨立的內存。多個進程之間爲了相互通信所以設計各種通信方式:管道、消息隊列、共享儲存等等。
人們爲了解決單線程會阻塞用戶使用的問題所以發明了多線程,多進程多線程可以使性能更大的提升。
在互聯網時代,有時用戶訪問量會急劇升高。例如 2017 年春節微信紅包收發紅包每秒達到 76 萬個。爲了解決這種問題,單機的性能提升是解決不了問題的,只能通過加大機器的數量來得到提升。
通過集羣的方式提高性能,最常見的兩種方式是任務分配和任務分解。
任務分配:任務分配是指每臺服務器都可以都處理完整的業務任務,由任務分配器分配任務。
任務分解:任務分解是指把複雜的系統拆解成不同的小功能。即不同的業務服務器。
-
集羣複雜度
-
單機複雜度
- 高可用
系統無中斷地執行其功能的能力,代表系統的可用性程度,是進行系統設計時的準則之一。-- 維基百科
硬件會出故障,軟件會出 bug 都會造成中斷現象。那麼如何提高無中斷就是提高高可用的方式。只能通過冗餘來提高高可用。一臺服務器不行就兩臺,兩臺不行就四臺。
由此看來,高性能和高可用都是通過多臺服務器來提高目的,那麼他們之間有什麼區別呢?高性能通過增加機器的目的是擴展提高性能,高可用是通過增加機器的目的冗餘處理單元。
其中高可用的複雜度的來源有兩種:計算高可用和存儲高可用
-
計算高可用: 這裏的 “計算” 指的是業務的邏輯處理。計算有一個特點就是無論在哪臺機器上進行計算,同樣的算法和輸入數據,產出的結果都是一樣的. 這裏的複雜度是在於任務分配器是如何分配服務,是一主多備還是多主多備。
-
存儲高可用:用戶在一臺機器上計算的業務,如果同步到另一臺機器上,這會存在傳輸的問題,所以可能會出現時間差的問題給用戶造成不良的體驗。所以存儲高可用的複雜度不在於如何備份數據,而在於如何減少或者規避數據不一致對業務造成的影響。
- 可擴展
軟件的開發在需求上線後也依然會有需求的變更,所以如果在需求變更的時候以很少的開發量或者不變的情況下去實現功能是最好的結果。那麼可擴展的複雜度在哪裏呢?
-
不能每個設計點都考慮可擴展性。
-
不能完全不考慮可擴展性。
-
所有的預測都存在出錯的可能性。
那麼如何提高系統的可擴展性呢?
-
短期預測:2 年法則,只預測 2 年內的變化,5-10 年的不考慮。
-
應對變化:提煉成變化層和穩定層,把不變的部分獨立封裝成穩定層,把可能變化的部分封裝在變化層。這種方案的核心思想就是隔離變化
- 低成本、安全、規模
-
低成本:低成本往往和高性能高可用是衝突的,首先設定一個成本目標,當設計出架構方案後是否滿足成本,如果不滿足就要調整架構方案。低成本的複雜度在於想要低成本往往需要創新技術。
-
安全:功能安全和架構安全。功能安全更多是和編碼相關和架構關係不大。傳統的架構安全主要依靠防火牆。防火牆的功能雖然強大,但性能一般,而且成本較高。
基於上述原因,互聯網系統的架構安全目前並沒有太好的設計手段來實現,更多地是依靠運營商或者雲服務商強大的帶寬和流量清洗的能力,較少自己來設計和實現。
- 規模:很多企業級的系統,沒有高性能的要求也沒有高可用可擴展的要求,所以系統整體特別大。導致新接手的開發人員不敢動,改不了,看不懂等問題,所以規模的複雜度在於量變引發質變。
架構設計的原則
-
合適原則:一個優秀的架構都是結合企業的人力、成本、條件、業務的條件下做出的最佳的架構方案。資源整合併發揮最大的功效並且可以快速落地。
-
簡單原則:軟件領域的複雜在於結構複雜性和邏輯複雜性。所以在設計軟件架構的時候簡單的方案優於複雜的方案。
-
演化原則:軟件架構類似於大自然的產物,要一步一步演化,讓生物適應環境,逐步變得強大。
以上就是我對於基礎架構的初步理解。
本文章參考:《從 0 開始學架構》-- 李運華 鏈接:https://time.geekbang.org/column/article/6458
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/jxq29OAuTr-UaE5BTcsKWg