分层的执念:别扭的架构设计

张开发
2026/4/17 3:58:15 15 分钟阅读

分享文章

分层的执念:别扭的架构设计
引言一个熟悉的困境我们总是看到这样的场景技术大会上演讲者的PPT里展示着一张漂亮的层次图——方框整齐堆叠箭头清晰标注自上而下层次分明。观众席上我们暗自点头“这才是正规的软件架构图。”于是当我们自己开始做软件架构设计时一种不自觉的念头就冒了出来“我的架构文档里也应该有一张这样的层次图。”我们打开绘图工具画好三个方框分别标上“展示层”、“业务层”、“数据层”。然后我们停下来了。因为我们发现那些我们真正花心思设计的、自认为体现架构价值的核心元素——为什么就是塞不进这三个方框我们设计了事件驱动机制订单创建后需要异步通知库存、支付、物流——这个“异步消息”应该放在哪一层我们引入了缓存层来抗高并发Redis在展示层、业务层还是数据层好像都不完全是。我们做了微服务拆分订单服务、用户服务、商品服务各自独立——它们都是“业务层”吗那业务层里这几十个服务之间的调用关系又该怎么画我们对接了外部支付网关、第三方登录、消息推送平台——这些外部依赖放在哪一层都不对劲。我们设计的重点偏偏没有层次关系。这种别扭的感觉相信每一位认真做过架构设计的技术人都经历过。一、痛点层次图与真实架构设计的不匹配为什么会有这种“塞不进去”的感觉因为层次图和真实架构设计的关注点从根本上就不在一个维度上。层次图的本质一种静态的“包含/分解”关系层次图的核心语义只有一个谁包含谁谁更宏观谁更具体。“展示层”包含“用户界面组件”“业务层”包含“订单管理模块”“数据层”包含“MySQL数据库”它是一棵树。所有元素按照“宏观→具体”的单一维度组织。真实架构设计的重点多种复杂关系而我们真正花心思设计的架构核心问题是什么组件之间如何通信订单服务调用库存服务是HTTP还是RPC同步还是异步部署边界在哪里哪些模块可以独立部署哪些必须放在一起外部依赖如何管理支付网关、消息推送、第三方认证……这些边界在哪里数据流向是怎样的用户请求从入口到数据库经过哪些处理节点这些问题本质上是图——节点之间有调用、依赖、数据流、部署关系——而不是树。当我们试图把一张“图”塞进一个“树”结构时那种“别扭”的感觉恰恰是模型不匹配的信号。二、错位我们以为的“正规”其实是“模板”为什么层次图会如此流行以至于我们把它当成“正规”架构图的代名词历史原因经典三层架构的惯性二十多年前经典的“展示层-业务层-数据层”三层架构几乎是企业级应用的标准模板。在那个单体应用为主、业务逻辑相对简单的时代层次图确实够用。但今天的软件架构已经发生了翻天覆地的变化微服务、事件驱动、云原生、Serverless……架构的复杂度已经从“纵向分层”转向了“横向协作”。传播效应PPT文化的自我强化技术大会的PPT、咨询公司的方案、培训教材的示例……这些传播渠道偏爱层次图。因为它看起来简洁、整齐、容易理解。但这种“简洁”是有代价的它隐藏了真正的复杂性。当层次图被用作沟通工具时观众觉得“看懂了”但真要落地开发时才发现关键信息全部缺失。认知陷阱熟悉≠正确我们很容易把“经常看到”等同于“应该使用”。层次图的频繁出现让我们产生了一种错觉不用层次图架构就不够“正规”。这种错觉导致了一个普遍的问题为了用层次图而用层次图而不是因为层次图适合描述当前架构。三、后果用错工具的代价当层次图被用于它不适合的场景时代价是真实而昂贵的。代价一架构沟通的“虚假共识”一张漂亮的层次图所有评审者都觉得“看懂了”。但到了实际开发前端以为业务层会暴露RESTful API后端以为前端会通过消息队列通信运维以为数据层包含缓存表面上达成共识实际上各说各话。这种“虚假共识”比没有共识更危险——因为它不会在早期暴露问题而是在编码阶段才爆发。代价二关键架构决策的“信息黑洞”层次图无法表达通信协议、部署边界、外部依赖。但这些恰恰是架构设计中最需要被显式记录和沟通的决策。当这些信息没有被架构图承载时它们就散落在口口相传、代码注释或者根本不存在。架构图变成了“走过场的文档”而不是“可执行的蓝图”。代价三架构演进的可视化困难当系统需要演进时层次图几乎无法帮助分析影响面。要把一个模块从单体中拆分为独立微服务——层次图能告诉你什么什么都不能。要在业务层和数据层之间引入缓存——层次图的“三层结构”瞬间被打破。层次图描绘的是一个静态的、理想化的世界而真实的架构演进是动态的、充满权衡的。四、出路选择匹配问题的工具一个简单的判断标准当你准备画架构图时问自己一个问题“我设计的重点是有层次关系还是没有层次关系”如果有例如功能分解、组织架构、代码包结构→ 用层次图它是合适的工具。如果没有绝大多数软件架构设计场景微服务调用、事件驱动、外部集成→不要用层次图选择能够表达交互、边界、协议的语言。C4模型为“没有层次关系”的场景而生C4模型Context、Container、Component、Code正是为解决这个问题而设计的。它不强迫你把所有元素塞进“三层”的框子里。相反它提供四种视角每一种都精准对应架构设计的核心关注点上下文图回答“系统与谁交互”——外部依赖、用户、边界容器图回答“系统由哪些部署单元构成如何通信”——微服务、数据库、消息队列、通信协议组件图回答“容器内部如何组织”——包、模块、接口代码图回答“关键代码结构如何”——类、继承、实现C4的每一层都在回答你真正关心的架构问题。它不会让你有“塞不进去”的别扭感因为它的模型就是为你的问题设计的。五、结语从“漂亮模板”到“有效沟通”我们并不是要彻底否定层次图。在展示功能分解、组织架构、代码包结构时它仍然是简洁有效的工具。但我们必须清醒地认识到层次图的流行更多是历史惯性和PPT文化的产物而不是因为它能有效描述现代软件架构。下一次当你打开绘图工具准备画那张“正规”的层次图时请先停下来想一想我要表达的重点是有层次关系吗如果重点不是层次关系我为什么还在用层次图跳出层次图的误区不是抛弃一个工具而是选择更匹配问题的工具。软件架构可视化的终极目的不是画出漂亮的图而是实现有效的沟通。当一张图让你觉得“重点元素塞不进去”时不是你的设计有问题而是你选择了错误的工具。真正的“正规”是使用正确的工具解决正确的问题。而不是盲从于PPT里的漂亮模板。

更多文章