【從零開始學架構 架構基礎】四 架構設計的復雜度來源:可擴展性復雜度來源

架構設計的復雜度來源其實就是架構設計要解決的問題,主要有如下幾個:高性能、高可用、可擴展、低成本、安全、規模。復雜度的關鍵,就是新舊技術之間不是完全的替代關系,有交叉,有各自的特點,所以才需要具體問題具體分析,基于各方考慮設計合適的架構,存在合適的架構,不存在最好的架構。這篇主要討論可擴展性問題

復雜度來源

可擴展性是指,系統為了應對將來需求變化而提供的一種擴展能力,當有新的需求出現時,系統不需要或者僅需要少量修改就可以支持,無須整個系統重構或者重建

在軟件設計領域,面向對象思想、設計模式主要被用于解決可擴展性問題。設計具備良好可擴展性的系統,有兩個基本條件:正確預測變化、完美應對變化

預測變化

軟件系統在發布后,還可以不斷地修改和演進。這就意味著不斷有新的需求需要實現。如果新需求能夠少改代碼甚至不改代碼就可以實現。綜合分析,預測變化的復雜性在于:

  1. 不能每個設計點都考慮可擴展性。如果每個點都考慮可擴展性,架構師會不堪重負,架構設計也會異常龐大且最終無法落地
  2. 不能完全不考慮可擴展性。不能完全不做預測,否則可能系統剛上線,馬上來新的需求就需要重構,這同樣意味著前期很多投入的工作量也白費了
  3. 所有的預測都存在出錯的可能性。如果預測的事情出錯,我們期望中的需求遲遲不來,甚至被明確否定,那么基于預測做的架構設計就沒什么作用,投入的工作量也就白費了

針對上邊這些復雜性,有個經驗性的原則:只預測 2 年內的可能變化,不要試圖預測 5 年甚至 10 年后的變化, 變化快的行業,能夠預測 2 年已經足夠了;而變化慢的行業,本身就變化慢,預測本身的意義不大,預測 5 年和預測 2 年的結果是差不多的。所以2 年法則在大部分場景下都是適用的

應對變化

即使預測的比較準了,但是系統設計的時候如何應對變化的擴展性也不是一個簡單的問題,應對變化有兩個方案:

1 提煉出變化層和穩定層

這種方案是:將不變的部分封裝在一個獨立的穩定層,將變化封裝在一個變化層(也叫適配層)。這種方案的核心思想是通過變化層來隔離變化
在這里插入圖片描述
無論是變化層依賴穩定層,還是穩定層依賴變化層都是可以的,需要根據具體業務情況來設計。如果系統需要支持 XML、JSON、ProtocolBuffer 三種接入方式,那么最終的架構就是“形式 1”架構;如果系統需要支持 MySQL、Oracle、DB2 數據庫存儲,那么最終的架構就變成了“形式 2”的架構了
在這里插入圖片描述
這種方案的復雜度在于分層的拆分依據,以及各層的接口如何設計

  1. 明確變化層和穩定層如何拆分:對于哪些屬于變化層,哪些屬于穩定層需要明確
  2. 變化層和穩定層之間的接口如何設計:對于穩定層來說,接口肯定是越穩定越好;但對于變化層來說,在有差異的多個實現方式中找出共同點,并且還要保證當加入新的功能時,原有的接口不需要太大修改

3 提煉出抽象層和實現層

提煉出一個“抽象層”和一個“實現層”,因為抽象層的接口是穩定的不變的,我們可以基于抽象層的接口來實現統一的處理規則,而實現層可以根據具體業務需求定制開發不同的實現細節,所以當加入新的功能時,只要遵循處理規則然后修改實現層,增加新的實現細節就可以了,無須修改抽象層。典型的實踐就是設計模式規則引擎

1 寫 2 抄 3 重構原則

不要一開始就考慮復雜的可擴展性應對方法,而是等到第三次遇到類似的實現的時候再來重構,重構的時候采取隔離或者封裝的方案

  • 1 寫:最開始三方支付選擇了微信錢包對接,此時不需要考慮太多可擴展性,直接快速對照微信支付的 API 對接即可,因為業務是否能做起來還不確定。
  • 2 抄:后來發現業務發展不錯,決定要接入支付寶,此時還是可以不考慮可擴展,直接把原來微信支付接入的代碼拷貝過來,然后對照支付寶的 API,快速修改上線。
  • 3 重構:因為業務發展不錯,為了方便更多用戶,決定接入銀聯云閃付,此時就需要考慮重構,參考設計模式的模板方法和策略模式將支付對接的功能進行封裝。

開始可以寫一些if語句進行分支判斷,后續場景多起來后可以考慮設計模式去實現。

總結一下

結合這篇Blog,其實我感覺主要是如何在過度設計與不可擴展間去權衡。長期預測的代價和變數太多,可能在落地前業務就涼了,不做預測又可能剛開始迭代就發現難以支持。所以2年預測是一個經驗值,如果到了2年業務發展的好了,會倒逼決策層給資源給錢進行架構升級,如果都用不了2年就涼了那5-10年預測就沒意義了;在預測的前提下,我們在方案設計的時候是否可以考慮短、中、長三種方案,短期策略一般考慮的變化少,短視,但迅速,修改小,立竿見影。長期策略一般看重遠期,但成本高很高,也很可能預測不中。綜合成本情況下如果決定采用短期策略,要考慮如果預測的變化發生了,系統修改為長期策略的代價有多大(想在做前),如果可以演化切換那可以,如果成本很高甚至切換不到長期策略,就需要重新思考了;再說重構,重構應該是一個小步快跑的模式,不要一開始就過度抽象的設計去炫技,而是先實現最基本功能,然后逐步隨業務迭代進行變化層隔離。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/38121.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/38121.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/38121.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

新書速覽|Linux C與C++一線開發實踐

《Linux C與C一線開發實踐》 本書內容 Linux C/C編程在Linux應用程序開發中占有重要的地位,掌握這項技術將在就業競爭中立于不敗之地。《Linux C與C一線開發實踐》內容針對初中級讀者,貼近軟件公司一線開發實踐。全書厚達620多頁,知識點豐富…

Java中String和StringBuilder的區別

當然可以,我們可以通過面試問答的形式來探討String和StringBuilder的區別。 面試官:請解釋一下Java中String和StringBuilder的區別。 面試回答: 1. 不可變性(Immutability) String:String對象是不可變的…

微信小程序添加點擊事件

在微信小程序中&#xff0c;給<view>組件添加點擊事件非常直接&#xff0c;你可以使用bindtap屬性來綁定一個事件處理函數。下面是添加點擊事件的基本步驟和示例代碼&#xff1a; 步驟&#xff1a; 在WXML文件中&#xff1a;給需要添加點擊事件的<view>標簽添加bi…

第六周周報

摘要 本周重點跟著網課學習了pytorch框架下張量的各種常用操作API&#xff0c;為后面跑模型做準備&#xff0c;因為看的視頻比較偏向原理&#xff0c;現在對張量有了一個新的認識。其次在時序的研究上&#xff0c;最近我在看圖神經網絡跟時序結合的方向&#xff0c;所以本周學…

Qt自定義類型

概述 在使用Qt創建用戶界面時&#xff0c;特別是那些具有特殊控件和特性的界面時&#xff0c;開發人員有時需要創建新的數據類型&#xff0c;以便與Qt現有的值類型集一起使用或代替它們。 QSize、QColor和QString等標準類型都可以存儲在QVariant對象中&#xff0c;作為基于qo…

51單片機第6步_stdlib.h庫函數

本章重點學習stdlib.h庫函數。 #include <REG51.h> //包含頭文件REG51.h,使能51內部寄存器; #include <stdlib.h> //float atof (char *s1); //參數s1字符串可包含正負號,小數點或E(e)來表示指數部分,如123.456或123e-2; //若首字符是非數據字符,或為正負號…

es6語法復習一

es6語法 1.var 變量提升 2.let 不存在變量提升&#xff0c;只能定義一次 3.const 先定義再使用&#xff0c;定義好來不能修改 4.解構賦值 [a,b,c][1,2,3],{a,b,c}{a:1,b:2,c:3} 5.模版字符串 let aaa; ${a} is ok 6.對象簡化寫法 const school{ name, change, improve(){ cons…

力扣2438.二的冪數組中查詢范圍內的乘積

力扣2438.二的冪數組中查詢范圍內的乘積 lowbit求所有2的冪 accumulate函數(begin,end,start,way)求和/積的方式求積并取模 const int N 1e9 7;class Solution {public:int lowbit(int x){return x & -x;}vector<int> productQueries(int n, vector<vector&l…

[NSSCTF]-Reverse:[SWPUCTF 2021 新生賽]easyapp(安卓逆向,異或)

無殼 把后綴名改為zip&#xff0c;找到apk 查看jadx 這里調用了MainActivity的lambda$onCreate$0$MainActivity&#xff0c;然后又調用了Encoder進行異或。 exp&#xff1a; result棿棢棢棲棥棷棊棐棁棚棨棨棵棢棌 key987654321 flag for i in range(len(result)):flagchr(…

HarmonyOS開發:應用完整性校驗

簡介 為了確保應用的完整性和來源可靠&#xff0c;OpenHarmony需要對應用進行簽名和驗簽。 應用開發階段&#xff1a; 開發者完成開發并生成安裝包后&#xff0c;需要開發者對安裝包進行簽名&#xff0c;以證明安裝包發布到設備的過程中沒有被篡改。OpenHarmony的應用完整性校…

Foxit Reader與PDF交互性:探索高級功能

引言 PDF&#xff08;Portable Document Format&#xff09;文件格式以其跨平臺的一致性和豐富的多媒體支持而廣受歡迎。Foxit Reader作為一款功能全面的PDF閱讀器&#xff0c;不僅提供了基本的查看和導航功能&#xff0c;還支持PDF文件中的多種交互式元素。本文將深入探討Fox…

SQL Server中 MERGE 語句

在 SQL Server 中,MERGE 語句用于根據兩個表之間的條件來插入、更新或刪除記錄。它通常用于同步兩個表的數據,其中一個表是源表(包含要插入或更新的數據),另一個是目標表(數據要插入或更新的表)。 1、本文內容 語法參數備注觸發器的實現權限有關索引的最佳做法MERGE 的…

探索sklearn的貝葉斯奧秘:樸素貝葉斯分類器全解析

&#x1f680; 探索sklearn的貝葉斯奧秘&#xff1a;樸素貝葉斯分類器全解析 樸素貝葉斯分類器是一類基于貝葉斯定理的簡單概率分類器&#xff0c;它們在文本分類、垃圾郵件識別等領域表現出色。在Python的sklearn庫中&#xff0c;樸素貝葉斯分類器以其實現簡單和效率高效而受…

關于響應式編程的理解與SpringCloudGateway的理解

關于響應式編程的理解與SpringCloudGateway的理解 一. 響應式編程與函數式編程的區別二. 響應式編程中常用的組件2.1 RxJava定義2.2 Rxjava基本概念2.3 RxJava 用法 三 SpringcloudGateway四 常見的四種限流規則 一. 響應式編程與函數式編程的區別 總的來說&#xff0c;響應式編…

qt中的枚舉值-QMetaEnum

QMetaEnum 測試代碼hcpp 講解 測試代碼 h #include <QMainWindow> #include <QDebug>QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACEclass MainWindow : public QMainWindow {Q_OBJECTpublic:MainWindow(QWidget *parent nullptr);~M…

GPIO和PIN

文章目錄 1 GPIO和Pin1.1 GPIO和Pin基礎概念1.2 GPIO輸入模式1.3 GPIO輸出模式1.4 GPIO的HAL庫1.4.1 一些HAL庫表示1.4.2 HAL庫常用GPIO函數1.4.3 GPIO點亮led燈程序例子 1 GPIO和Pin 1.1 GPIO和Pin基礎概念 ? 單片機有很多的引腳&#xff0c;為了操控每一個引腳&#xff0c…

grpc學習golang版( 四、多服務示例 )

系列文章目錄 第一章 grpc基本概念與安裝 第二章 grpc入門示例 第三章 proto文件數據類型 第四章 多服務示例 第五章 多proto文件示例 第六章 服務器流式傳輸 第七章 客戶端流式傳輸 第八章 雙向流示例 文章目錄 一、前言二、定義proto文件三、編寫server服務端四、編寫Client客…

MySQL之可擴展性(九)

可擴展性 直接連接 2.修改應用的配置 還有一個分發負載的辦法是重新配置應用。例如&#xff0c;你可以配置多個機器來分擔生成大報表操作的負載。每臺機器可以配置成連接到不同的MySQL備庫&#xff0c;并為第N個用戶或網站生成報表。 這樣的系統很容易實現&#xff0c;但如果…

使用Python自動化收集和處理視頻資源的教程

在這篇教程中&#xff0c;我們將介紹如何利用Python腳本自動化收集和處理視頻資源。這篇文章將幫助您掌握基本的網絡自動化技術&#xff0c;并使用相關庫進行視頻資源的獲取和保存。以下是具體的實現步驟和代碼示例。 環境準備 在開始之前&#xff0c;請確保您的工作環境中已…

數據庫基礎教程

數據庫基礎教程 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01;在本文中&#xff0c;我們將深入探討數據庫的基礎知識和操作&#xff0c;幫助您建立起扎實的數據…