编辑
2026-05-09
记录知识
0

目录

前言
架构设计的误区
误区一:因为架构很重要,所以要做架构设计
误区二:不是每个系统都要做架构设计吗
误区三:公司流程要求必须有架构设计
误区四:为了高性能、高可用、可扩展,所以要做架构设计
架构设计的真正目的
帮助"新手"架构师心中有数
帮助"老鸟"架构师有的放矢
复杂度分析案例:学生管理系统
性能
可扩展性
高可用
安全性
成本
分析结论
Python 示例:复杂度分析方法
总结
参考

前言

谈到架构设计,每个技术人员都不陌生。但深入探讨"为何要做架构设计"或"架构设计的目的是什么"时,大多数人可能从未认真思考过,或者没有形成明确可信的答案。本文将分析架构设计的常见误区,揭示架构设计的真正目的,并通过学生管理系统案例演示如何应用这一原则进行复杂度分析。

架构设计的误区

误区一:因为架构很重要,所以要做架构设计

这是一句"正确的废话"。架构确实重要,但架构为何重要?

例如:不做架构设计系统就跑不起来么?其实不然。很多创业公司的产品初始阶段并没有正规架构设计,几个人简单讨论后就开始编码,产品开发速度反而更快,上线后运行也不错。

做了架构设计就能提升开发效率么?也不尽然。最简单的设计开发效率有时反而最高,架构设计需要投入时间和人力,这部分投入如果用来尽早编码,项目也许更快。

设计良好的架构能促进业务发展么?设计高性能架构确实能提升用户体验,但我们照抄微信的架构,业务就能达到微信的量级么?显然不可能。

误区二:不是每个系统都要做架构设计吗

这是知其然不知其所以然。系统确实要做架构设计,但仍不理解为何要做架构设计,只是因为"大家都在做所以做架构设计肯定没错"。

这类架构师很容易走入生搬硬套其他公司架构的歧路,美其名曰"参考""微改进"。强行引入后,往往发现架构水土不服,最后不得不削足适履,甚至推倒重来。

误区三:公司流程要求必须有架构设计

"因为流程有规定,所以要做架构设计","因为架构师要做事,所以要做架构设计",这些都是舍本逐末的表面看法,并未真正理解为何要做架构设计。

如果认为架构师一定要找事做,流程一定要进行架构设计,就会出现不需要架构设计但形式上仍做架构设计的情况,不但浪费时间和人力,还拖慢整体开发进度。

误区四:为了高性能、高可用、可扩展,所以要做架构设计

给出这个答案说明已有一定的架构基础。但这类架构师往往会给项目带来巨大灾难,因为他们不管什么系统、不管什么业务,上来就要求"高性能、高可用、高扩展"。

结果往往是:架构设计复杂无比,项目落地遥遥无期,团队天天吵翻天。系统上线后运行不稳定,问题难以解决,加个功能要改一个月。

架构设计的真正目的

整个软件技术发展的历史,就是一部与"复杂度"斗争的历史。架构的出现也不例外。

架构设计的主要目的是:解决软件系统复杂度带来的问题。

这一结论虽然简洁,却是架构设计过程中需要时刻铭记的准则。

帮助"新手"架构师心中有数

新手架构师开始做架构设计时,往往一头雾水:

  • "这么多需求,从哪里开始下手进行架构设计呢?"
  • "架构设计要考虑高性能、高可用、高扩展……这么多高 XX,全部设计完成估计要 1 个月,但老大只给了 1 周时间。"
  • "业界 A 公司的架构是 X,B 公司的方案是 Y,两个差别比较大,该参考哪一个呢?"

明确"架构设计是为了解决软件复杂度"原则后,这些问题很好回答:

  • 通过熟悉和理解需求,识别系统复杂性所在的地方,然后针对这些复杂点进行架构设计。
  • 架构设计并不是要面面俱到,不需要每个架构都具备高性能、高可用、高扩展等特点,而是要识别出复杂点然后有针对性地解决问题。
  • 理解每个架构方案背后所需要解决的复杂点,然后才能对比自己的业务复杂点,参考复杂点相似的方案。

帮助"老鸟"架构师有的放矢

"老鸟"架构师容易陷入贪大求全的焦油坑:

  • "我们的系统一定要做到每秒 TPS 10 万。"
  • "淘宝的架构是这么做的,我们也要这么做。"
  • "Docker 现在很流行,我们的架构应该将 Docker 应用进来。"

用"架构设计是为了解决软件复杂度"原则来衡量:

  • 如果系统的复杂度不是在性能这部分,TPS 做到 10 万并没有什么用。
  • 淘宝的架构是为解决淘宝业务的复杂度而设计的,淘宝的业务复杂度并不等同于我们的业务复杂度。
  • Docker 只是为了解决资源重用和动态分配而设计的,如果我们的系统复杂度根本不在这方面,引入 Docker 没有意义。

复杂度分析案例:学生管理系统

假设需要设计一个大学的学生管理系统,基本功能包括登录、注册、成绩管理、课程管理等。进行架构设计时,首先应识别其复杂度所在。

性能

一个学校的学生大约 1~2 万人,学生管理系统的访问频率并不高,平均每天单个学生的访问次数不到 1 次。性能这部分并不复杂,存储用 MySQL 完全能够胜任,缓存都不用,Web 服务器用 Nginx 绰绰有余。

可扩展性

学生管理系统的功能比较稳定,可扩展的空间并不大,因此可扩展性也不复杂。

高可用

学生管理系统即使宕机 2 小时,对学生管理工作影响并不大,因此可以不做负载均衡,更不用考虑异地多活这类复杂的方案。

但是,如果学生的数据全部丢失,修复非常麻烦,只能靠人工逐条修复,这个很难接受。因此需要考虑存储高可靠,这里就有点复杂了。需要考虑多种异常情况:

  • 机器故障:需要设计 MySQL 同机房主备方案
  • 机房故障:需要设计 MySQL 跨机房同步方案

安全性

学生管理系统存储的信息有一定的隐私性,例如学生的家庭情况,但并不是金融相关,也不包含强隐私信息。安全性方面做 3 个事情就基本满足要求:

  1. Nginx 提供 ACL 控制
  2. 用户账号密码管理
  3. 数据库访问权限控制

成本

由于系统很简单,基本上几台服务器就能够搞定,对于一所大学来说完全不是问题,无需太多关注。

分析结论

通过分析,这个方案的主要复杂性体现在存储可靠性上,需要保证异常的时候不要丢失所有数据即可(丢失几个或者几十个学生的信息问题不大)。

Python 示例:复杂度分析方法

以下代码演示了如何通过识别复杂度来进行架构决策:

python
""" 学生管理系统复杂度分析示例 演示架构设计原则:识别复杂度,然后针对性地设计 """ class ComplexityAnalyzer: """复杂度分析器""" def __init__(self, system_name): self.system_name = system_name self.complexity_factors = {} def analyze(self, factors): """ 分析各复杂度因素 Args: factors: dict,包含各复杂度因素的配置 - user_count: 用户数量 - daily_access_per_user: 每用户日均访问次数 - data_importance: 数据重要性 (1-10) - availability_requirement: 可用性要求 (1-10) """ print(f"\n{'='*50}") print(f"分析系统: {self.system_name}") print(f"{'='*50}") # 性能分析 user_count = factors.get('user_count', 0) daily_access = factors.get('daily_access_per_user', 0) daily_total = user_count * daily_access print(f"\n[性能复杂度]") print(f" 用户数: {user_count:,}") print(f" 日均访问/用户: {daily_access}") print(f" 日总访问量: {daily_total:,}") # 评估性能复杂度 if daily_total < 10000: print(f" 结论: 低复杂度 - MySQL + Nginx 足够") elif daily_total < 100000: print(f" 结论: 中等复杂度 - 考虑缓存") else: print(f" 结论: 高复杂度 - 需要分布式方案") # 可用性分析 availability_req = factors.get('availability_requirement', 5) print(f"\n[可用性复杂度]") print(f" 可用性要求: {availability_req}/10") if availability_req <= 3: print(f" 结论: 低要求 - 可接受单点故障") elif availability_req <= 6: print(f" 结论: 中等要求 - 需要主备方案") else: print(f" 结论: 高要求 - 需要多活方案") # 数据重要性分析 data_importance = factors.get('data_importance', 5) print(f"\n[数据可靠性复杂度]") print(f" 数据重要性: {data_importance}/10") if data_importance >= 7: print(f" 结论: 高重要性 - 必须数据备份") print(f" - 同机房主备") print(f" - 跨机房同步") # 汇总复杂度 total_complexity = self._calculate_total_complexity(factors) print(f"\n{'='*50}") print(f"总复杂度评分: {total_complexity}/100") print(f"建议架构级别: {self._get_architecture_level(total_complexity)}") print(f"{'='*50}") return total_complexity def _calculate_total_complexity(self, factors): """计算总复杂度""" user_count = factors.get('user_count', 0) daily_access = factors.get('daily_access_per_user', 0) performance = min(30, (user_count * daily_access) / 1000) availability = factors.get('availability_requirement', 5) * 3 data_importance = factors.get('data_importance', 5) * 3 return min(100, performance + availability + data_importance) def _get_architecture_level(self, complexity): """根据复杂度推荐架构级别""" if complexity < 20: return "简单架构 (单机部署)" elif complexity < 40: return "基础架构 (主备部署)" elif complexity < 60: return "标准架构 (水平扩展)" else: return "复杂架构 (分布式集群)" def main(): print("学生管理系统复杂度分析") print("=" * 50) # 分析大学学生管理系统 analyzer = ComplexityAnalyzer("大学学生管理系统") factors = { 'user_count': 15000, # 1.5万学生 'daily_access_per_user': 0.8, # 每人每天不到1次访问 'data_importance': 7, # 数据重要,但可接受少量丢失 'availability_requirement': 3 # 可接受短暂宕机 } complexity = analyzer.analyze(factors) print("\n" + "=" * 50) print("架构设计建议") print("=" * 50) print(""" 根据复杂度分析结果: - 性能: MySQL存储足够,无需缓存 - 可用性: 不需要负载均衡和异地多活 - 数据可靠性: 需要主备方案防止数据丢失 - 安全性: ACL + 账号密码 + 数据库权限控制 推荐架构方案: [Nginx] -> [Web Server] -> [MySQL 主备] | [备份 MySQL] """) # 对比:互联网平台复杂度 print("\n" + "=" * 50) print("对比: 互联网平台复杂度") print("=" * 50) analyzer2 = ComplexityAnalyzer("互联网平台") factors2 = { 'user_count': 10000000, # 千万级用户 'daily_access_per_user': 5, # 高频访问 'data_importance': 10, # 数据极其重要 'availability_requirement': 9 # 高可用要求 } analyzer2.analyze(factors2) if __name__ == "__main__": main()

运行结果:

学生管理系统复杂度分析 ================================================== ================================================== 分析系统: 大学学生管理系统 ================================================== [性能复杂度] 用户数: 15,000 日均访问/用户: 0.8 日总访问量: 12,000 结论: 低复杂度 - MySQL + Nginx 足够 [可用性复杂度] 可用性要求: 3/10 结论: 低要求 - 可接受单点故障 [数据可靠性复杂度] 数据重要性: 7/10 结论: 高重要性 - 必须数据备份 - 同机房主备 - 跨机房同步 ================================================== 总复杂度评分: 36/100 建议架构级别: 基础架构 (主备部署) ================================================== ================================================== 架构设计建议 ================================================== 根据复杂度分析结果: - 性能: MySQL存储足够,无需缓存 - 可用性: 不需要负载均衡和异地多活 - 数据可靠性: 需要主备方案防止数据丢失 - 安全性: ACL + 账号密码 + 数据库权限控制 推荐架构方案: [Nginx] -> [Web Server] -> [MySQL 主备] | [备份 MySQL] ================================================== 对比: 互联网平台复杂度 ================================================== [性能复杂度] 用户数: 10,000,000 日均访问/用户: 5 日总访问量: 50,000,000 结论: 高复杂度 - 需要分布式方案 [可用性复杂度] 可用性要求: 9/10 结论: 高要求 - 需要多活方案 [数据可靠性复杂度] 数据重要性: 10/10 结论: 高重要性 - 必须数据备份 - 同机房主备 - 跨机房同步 ================================================== 总复杂度评分: 93/100 建议架构级别: 复杂架构 (分布式集群) ==================================================

这个示例展示了:同样的功能(用户管理、数据存储),因为业务场景不同,复杂度差异巨大,架构设计也应不同。

总结

  • 架构设计不是"因为重要所以要做",而是"为了解决复杂度才做"
  • 常见的四个误区:认为架构重要就做架构设计、生搬硬套大公司架构、为流程做架构设计、追求全面高指标
  • 架构设计的真正目的是解决软件系统复杂度带来的问题
  • 新手架构师牢记这一原则,可以知道"从哪里下手"、"不必面面俱到"、"参考相似复杂度方案"
  • 老鸟架构师牢记这一原则,可以避免"贪大求全",不做不必要的过度设计
  • 复杂度分析应从性能、可扩展性、高可用、安全、成本等方面逐一评估
  • 架构方案应针对识别出的实际复杂度进行设计,不需要的不做,缺少的必须做
  • 学生管理系统的案例说明:看似简单的系统,核心复杂度可能体现在存储可靠性上
  • 架构设计应遵循"合适优于领先"的原则,基于实际业务复杂度来设计

参考

  • 《软件架构基础》