如何画好架构图:架构思维的三大底层逻辑

图片

图片

👉目录

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;先来说一下函数调…