如何畫好架構圖:架構思維的三大底層邏輯

圖片

圖片

👉目錄

0?前言

1 宏觀

2?中觀

3 微觀

4 補充

俗話說,一圖勝千言。日常工作中,當我們要表達自己的設計思路的時候,會畫各式各樣的圖。但因為各自知識儲備的差異,思維的差異,不同類型的系統側重的架構設計點也不一樣(C端高并發系統、B端復雜業務系統、大數據離線系統、流式計算系統、機器學習系統、客戶端系統),導致在日常方案表達與溝通中,所畫出來的圖”五花八門“,沒有一個相對標準化、通用的”技術方案溝通語言“,這給溝通帶來歧義,同時也不利于個人的思維提升,不能形成一個體系化的思考方法。?

本文綜合了自己多年的架構設計實踐和業界眾多的軟件工程方法論,總結出一個相對通用的“技術方案溝通語言”。思維即語言,語言即思維,一切不能用“語言”表達的思維,只能說明沒思維。 更詳細介紹,還可以參見作者出版的書籍《軟件架構設計:大型網站技術架構與業務架構融合之道》

關注騰訊云開發者,一手技術干貨提前解鎖👇

00

前言

(1)不同的系統,復雜性往往體現在不同方面,畫圖的側重點不一樣,需要畫的是體現復雜性的那一面。

(2)本方法論考慮了方法論的投入與回報是否匹配問題,糅合了軟件4+1視圖、領域建模 (DDD)、 微服務拆分、UML、ER圖等幾個方法論。

系統的類型

側重點

1. C端大流量、高并發系統

系統架構、高并發、高可用等

2. B端復雜業務系統

領域建模、數據建模、微服務拆分。這里面又分為了2類:類型1: ?自身邏輯不復雜,但上下游的系統特別多、鏈條長;
類型2: ?上下游少(處在鏈條末端),但自身邏輯非常復雜;

3. 基于大數據的各種業務系統

海量數據的處理問題(存儲、轉換、數據一致性保證)

4. 數據分析、算法模型類系統

數據驅動的思路、模型、算法

下面的方法論,比較適合上面的前2類系統,第3類、第4類只在宏觀圖的畫法上有一點適合。

01

宏觀

???1.1?上下文圖

此圖目的:

讓別人明白你的系統的背景(業務背景、系統背景)。

思考方式:

把你的系統當做黑盒,描述2件事情:

  1. 你的系統為誰服務? (這個”誰“,可以是某個用戶,某個角色,也可以是某個系統) - - 你到哪去???

  2. 你的系統依賴誰? - - 你從哪來??

業界參考:

C4模型官網:https://c4model.com/

是否必選:

上下文很簡單的情況下,此圖可以和下面的”系統架構圖“合并成一個。

???1.2 系統架構圖

此圖目的:

(1)明確每個系統的定位與職責邊界,明白某個系統在整個體系中的“位置”在哪。

(2)明白跨團隊的各個系統,或者一個大系統的幾個子系統之間,是怎么串聯起來的。

思考方式:

(1)概要性的描述跨團隊的多個大系統之間的核心交互

(2)概要性的描述一個團隊的一個大系統內的多個子系統之間的核心交互。這2點糅合在一個圖上展示出來。

備注:這里說的系統/子系統,在物理上對應了一個集群(一個微服務的集群,或者一個獨立部署的系統)。

如果只是一個邏輯模塊,和其他代碼塊,部署在同一個進程里面的,不能算是一個”系統“,最好不要出現在此圖中。

是否必選:

簡單的系統,比如就1個單一的微服務,或者單體應用( UI+ 邏輯層 + ?DB),和外界其他系統沒有交互,此圖可以不畫。

???1.3?物理部署

目的:

有了物理部署,才能和上面的系統架構圖對應起來,讓人明白,上面的每個方塊,是一個集群,還是單機版的進程?

是單機版,是否存在高可用問題??

如果是集群,是不是多個系統,部署在同一批機器上?

畫法:

物理部署不一定需要圖,可以是一個表格,對上面的系統架構圖,進行補充。類似如下:

系統 /子系統

機房

機器數

對外提供的網絡協議:http/tcp/udp?

備注

Java微服務1

xx

2臺

http

子系統2

xx

1(單機版)

udp

...

02

中觀

???2.1 是否要嚴格區分領域模型、數據模型(ER圖或者類圖)?

領域模型: DDD 、UML的思想,領域模型通常用UML來畫。

數據模型: ER圖,大家經常畫。

個人看法:嚴格區分這2者,實施起來往往非常難。如果2者不一致,不如不畫。

1、領域模型,大家不知道怎么畫?

2、領域模型到數據模型,如何映射、轉換,太隨意。雖然有教科書教大家轉換,但基本沒人學。

實體:表 = 1 :1的時候,領域模型映射到數據模型沒有歧義,但有很多例外情況:

(1)領域模型中的抽象/繼承,父類/子類,在ER中沒有體現

(2)領域實體之間的N:N關系,ER中需要中間表

(3)多個實體對應1張表

(4)視圖如何體現? 視圖指一種UI呈現,沒有數據存儲,多個數據表的數據按某種規則聚合成一個視圖

(5)領域模型中的策略、規則類的實體,最終映射到一段代碼邏輯,而不是表

所以結論是沒有嚴格區分領域模型,還是數據模型,主要以數據模型為主。

目的:

程序 = 數據結構 + 算法,軟件工程 = ?領域模型/數據模型 + 功能邏輯。

”數據結構“(這里指廣義的數據結構,不是大學教科書上的數據結構),是任何一個軟件的基石,其重要性怎么強調都不過分,系統的性能、復用性、擴展性、維護性、數據一致性等,往往都和“數據結構“密切相關。

對于嚴格遵循DDD的軟件開發,會區分領域模型和數據模型。但目前大部分實踐場景,并沒有對2者做嚴格區分。不管是領域模型,還是數據模型;不管是DB存儲、還是KV緩存/KV存儲、內存存儲,都會有一些共性的問題需要回答:

(1)你的系統有哪些關鍵的”實體“?

(2)這些實體之間的關系,是1:1, 1:N, N:1, N:N? 最終組成的這個網狀關系是什么樣的?

重點:

(1)ER圖和下面的3.2章節的表設計的區別是:3.2章節事無巨細的列每個字段的詳細解釋。這里ER圖是省略了大部分字段,只描述每個表的業務主鍵、外鍵、關鍵state,以及表與表之間的關聯關系。

(2)如果數據是存在KV存儲/KV緩存,同樣需要數據模型。因為kv里面的多個kv之間,可能有復雜的關聯關系。

如果部分數據在KV,部分數據在DB,更需要去很好的描述2者的關聯關系。這還涉及到2邊的數據一致性問題。

???2.2?時序圖

這個日常畫的最多,但也存在問題:

泳道中的每1列,是一個跨團隊的其他人的系統,還是自己系統內部的一個子系統,還是一個邏輯模塊,還是一個用戶?

盡可能在同一個層次上描述問題。

畫法:

直接參考UML。

???2.3?狀態圖

對于有復雜的狀態流轉的系統(對應DB中某個state字段),此圖一定要畫。

畫法:

直接參考UML。

???2.4 并發運行視圖

思考方式:

架構4+1理論中,有一個視圖就是”運行視圖“。主要描述單機的多線程/多進程之間如何通信、如何同步問題。

是否必須:

對于標準化的Java微服務,其微服務框架內部的多進程/多線程模型是固定的,上層開發人員只需要寫業務代碼。

對于這種情況,不需要去寫并發運行視圖,因為是標準化的,大家都一樣!

對于C++里面常見的自己從網絡框架層一直寫到業務層的系統,這個需要重點描述。沒有這個圖,沒辦法表達鎖、阻塞與喚醒、線程安全等各種并發問題。

在一個進程內部(RiskServer進程)內部的多線程模型,不要把多進程和多線程畫一個圖上,除非圖標上有明確區分是1個進程,還是線程。

???2.5?數據流程圖(離線大數據處理系統)

對于離線數據處理系統,數據鏈路可能很長,整個過程可能涉及到tdw/hdfs, ?hbase,絡子任務,java/c++處理,mysql,UI界面。。。

對于這類系統,數據流程圖非常關鍵。

03

微觀

這個大家已經很熟悉,不再展開。

接口文檔;

表設計(字段詳細解釋);

(1)自己的表,在哪個實例,哪個DB上面?

(2)每個表的字段解釋。

后臺任務;

(1)你的系統有多少個后臺任務,調度周期多少?

(2)單機版,還是分布式調度?實現方式:crontab, ?quartz, ?XXL-job,還是其他什么框架?

(3)后臺任務,跟服務,是部署在同一臺機器上面,還是不同?

04

補充

一個標準化的技術體系會極大的降低文檔編寫復雜度、降低團隊溝通難度:

當我說“接口”的時候,默認是某種標準化的RPC;

當我說“后臺任務”的時候,默認是某種標準化的分布式調度上面的一個任務;

當我說“消息”的時候,默認來自某種標準化的消息中間件;

當我說“DB”的時候,默認來自某種標準化的DB部署;

...

這一系列的”默認“,其產生的效率提升往往會超出預期。

-End-

原創作者|余春龍


感謝你讀到這里,不如關注一下?👇

圖片

📢📢來領開發者專屬福利!點擊下方圖片直達👇

圖片

圖片

你在架構設計中用過哪些好用的工具或方法?歡迎評論留言補充。我們將選取1則優質的評論,送出騰訊云定制文件袋套裝1個(見下圖)。6月18日中午12點開獎。

圖片

圖片

圖片

圖片

圖片

圖片

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

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

相關文章

Spring MVC擴展消息轉換器-->格式化時間信息

Spring MVC 的消息轉換器的作用:在 HTTP 請求/響應與 Java 對象之間進行轉換 可以自行擴展消息轉換器 一、創建對象映射規則 package com.sky.json;import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.Objec…

Elasticsearch 的自動補全以及RestAPI的使用

Elasticsearch 提供了強大的自動補全 (Autocomplete) 功能,以下為一個基礎的自動補全DSL語句 {"suggest": {"my_suggestion": { // 自定義建議器名稱,可按需修改"text": "ap", // 用戶輸入的前綴(如搜索框…

1.4、SDH網狀拓撲

鏈形網星形網樹形網環形網網孔形網 1.鏈形拓撲 結構: 節點像鏈條一樣首尾依次串聯連接。信號從一個節點傳到下一個節點,直至終點。 特點: 簡單經濟: 結構最簡單,成本最低,適用于沿線覆蓋(如鐵…

如何在 ArcGIS 中使用 Microsoft Excel 文件_20250614

如何在 ArcGIS 中使用 Microsoft Excel 文件 軟件版本:win11; ArcGIS10.8; Office2024 1. 確認 ArcGIS 10.8 對 .xlsx 文件的支持 ArcGIS 10.8 支持 .xlsx 文件(Excel 2007 及以上格式),但需要安裝 Microsoft Access Database …

Python----OpenCV(圖像處理——圖像的多種屬性、RGB與BGR色彩空間、HSB、HSV與HSL、ROI區域)

Python----計算機視覺處理(opencv:像素,RGB顏色,圖像的存儲,opencv安裝,代碼展示) Python----計算機視覺處理(Opencv:圖片顏色識別:RGB顏色空間,…

java設計模式[1]之設計模式概覽

文章目錄 設計模式什么是設計模式為什么要學習設計模式設計模式的設計原則設計模式的分類 設計模式 什么是設計模式 設計模式是前人根據經驗的總結,是軟件開發中的最佳實踐,幫助開發者在面對復雜設計問題時提供有效的解決方案。設計模式不僅僅只是一種…

aflplusplus:開源的模糊測試工具!全參數詳細教程!Kali Linux教程!(四)

使用 afl-lto clang LLVM 編譯器 1. -help 顯示可用選項 afl-lto --help 其他選項同上,這里不再展開敘述。 afl-lto 1. -help 顯示可用選項 afl-lto --help 其他選項同上,這里不再展開敘述。 afl-network-client 1. 幫助文檔 afl-network-cl…

區間合并:牛奶

區間合并:牛奶 牛奶 www.acwing.com/problem/content/description/1345/ 本質就是區間合并問題從第一次擠奶才開始計算兩個最長時間 import java.util.*;public class Main {static final int N 5010;static Pair[] pairs new Pair[N];static class Pair imple…

Hive實現值列表橫向展示(非列轉行)

一、場景說明: 當前有各個流程的節點名稱和節點時間。數倉中的表存在的格式為縱向存儲,分別為節點名稱、接收時間 現數據分析過程中需要將每個流程的節點時間橫向展示,如果沒有該節點則置空 這種區別于行轉列和列轉行的操作。(具體可參考博主**

藍橋杯20151 跳石頭

問題描述 小明正在和朋友們玩跳石頭的小游戲,一共有 n 塊石頭按 1 到 n 順序排成一排,第 i 塊石頭上寫有正整數權值 ci? 。 如果某一時刻小明在第 j 塊石頭,那么他可以選擇跳向第 jcj? 塊石頭 (前提 jcj≤n )或者跳…

深度學習——基于卷積神經網絡的MNIST手寫數字識別詳解

文章目錄 引言1. 環境準備和數據加載1.1 下載MNIST數據集1.2 數據可視化 2. 數據預處理3. 設備配置4. 構建卷積神經網絡模型5. 訓練和測試函數5.1 訓練函數5.2 測試函數 6. 模型訓練和評估6.1 初始化損失函數和優化器6.2 訓練過程 7. 關鍵點解析8. 完整代碼9. 總結 引言 手寫數…

Activiti初識

文章目錄 1 工作流介紹1_工作流概念介紹2 工作流系統3 適用行業4 具體應用5 實現方式 2 Activiti介紹1_BPM2 BPM 軟件3 BPMN 3 使用步驟1_部署 activiti2 流程定義3 流程定義部署4 啟動一個流程實例5 用戶查詢待辦任務(Task)6 用戶辦理任務7 流程結束 4 Activiti應用1_Activiti…

CyclicBarrier入門代碼解析

文章目錄 核心思想:組隊出游,人到齊了才出發 🚌最簡單易懂的代碼示例代碼解析運行效果分析CyclicBarrier vs CountDownLatch 的關鍵區別CyclicBarrier在業務系統里面通常有什么常用的應用場景核心應用模式1. 數據并行處理與ETL(最…

Maven 配置中繞過 HTTP 阻斷機制的完整解決方案

Maven 配置中繞過 HTTP 阻斷機制的完整解決方案 一、背景與問題分析 自 Maven 3.8.1 版本起&#xff0c;出于安全考慮&#xff0c;默認禁止了對 HTTP 倉庫的訪問。這一機制通過 <mirror> 配置中的 maven-default-http-blocker 實現&#xff0c;其作用是攔截所有使用 HT…

【大廠機試題解法筆記】恢復數字序列

題目 對于一個連續正整數組成的序列&#xff0c;可以將其拼接成一個字符串&#xff0c;再將字符串里的部分字符打亂順序。如序列8 9 10 11 12,拼接成的字符串為89101112,打亂一部分字符后得到90811211,原來的正整數10就被拆成了0和1。 現給定一個按如上規則得到的打亂字符的字…

MongoDB 事務有哪些限制和注意事項?

MongoDB 的多文檔 ACID 事務雖然強大&#xff0c;但在使用時確實有一些限制和需要特別注意的事項。 以下是主要的限制和注意事項&#xff1a; 1. 性能開銷 (Performance Overhead) 額外協調: 事務需要額外的協調工作&#xff0c;包括跟蹤事務狀態、管理鎖&#xff08;即使是樂…

CTF實戰技巧:獲取初始權限后如何高效查找Flag

CTF實戰技巧&#xff1a;獲取初始權限后如何高效查找Flag 在CTF比賽中&#xff0c;獲得初始訪問權限只是開始&#xff0c;真正的挑戰在于如何在系統中高效定位Flag。本文將分享我在滲透測試中總結的系統化Flag搜索方法&#xff0c;涵蓋Linux和Windows雙平臺。 引言&#xff1a;…

kafka Tool (Offset Explorer)使用SASL Plaintext進行身份驗證

一、前面和不需要認證的情況相同&#xff1a; 1、填寫Properties中的cluster name和版本&#xff0c;以及zk的ip和port 2、Advanced中填寫bootstrap servers 二、和不需要認證時不同的點&#xff1a; 1、Security的Type&#xff0c;不需要認證時選plaintext&#xff0c;需要認…

最小費用最大流算法

最小費用最大流算法 原理 問題:網絡中有源點(起點)和匯點(終點),每條邊有流量上限和單位流量費用。求: 從源點到匯點的最大流量在流量最大的前提下,總費用最小核心思想:在找增廣路時,選擇單位費用之和最小的路徑(使用SPFA找最短路) 實現步驟 建圖:使用鏈式前向…

從匯編的角度揭開C++ this指針的神秘面紗(上)

C中的this指針一直比較神秘。任何類的對象&#xff0c;都有一個this指針&#xff0c;無處不在。那么this指針的本質究竟是什么&#xff1f;this指針什么時候會被用到&#xff1f;今天通過幾段簡單的代碼&#xff0c;來揭秘一下。 要先揭秘this指針&#xff0c;先來說一下函數調…