工程师绘图:用电商案例讲清选图、规范与 AI 协作
写了多年代码、做过不少技术方案,画图却未必形成了固定的方法。
我们知道什么时候应该写接口、建表、补测试,却不一定知道什么时候该画上下文图,什么时候该画时序图。结果是,所有内容都被塞进一张“架构图”:前端、订单服务、数据库、机房、线程池、优惠券规则混在一起;箭头有时表示调用,有时表示数据流,有时只是表示“这两个东西有关”。
这样的图看起来很完整,评审时却仍然需要作者逐一解释。更重要的是,它可能掩盖真正的设计问题:价格归谁管理?支付超时究竟是失败,还是尚未知道结果?订单取消之后,迟到的支付成功通知该怎么处理?
工程图的价值,在于让读者看清各部分的职责、协作关系,以及出错后如何处理。
本文以电商下单与支付为贯穿案例,介绍 24 类工程图和方案视图。其中,重点展开六类高频视图:边界、结构、时序、状态、数据和补偿,分别回答谁负责、系统如何组成、操作如何推进、状态如何变化、事实如何保存,以及失败如何恢复。
其他视图保留简要介绍,帮助你在部署、迁移、安全评审和事故复盘等场景中按需选择。首次阅读可以重点关注这六类视图,其余内容作为速查资料。这是本文围绕交易案例安排的阅读重点,不是标准规定的完整分类,也不是所有系统都必须交齐的绘图清单。
读完之后,希望你能解决三个实际问题:
- 这份方案需要画哪些图,每张图要回答什么问题?
- 怎样让不同图中的名称、职责、状态和关系保持一致?
- 怎样借助 AI Agent 生成、检查和修改图,同时保留可维护的源文件?
不要先问用什么工具,先问这张图要回答什么
面对“介绍一下订单系统”这样的任务,工程师很容易立即打开画布。但这句话至少包含五个不同问题。
| 要回答的问题 | 合适的视图 | 不应该混进去的内容 |
|---|---|---|
| 谁使用系统,系统与外界怎样协作? | 用例图、系统上下文图 | 内部 DAO、索引、Pod 副本 |
| 谁拥有业务事实和规则? | DDD 上下文映射图 | 用部署节点代替业务边界 |
| 软件由什么构成,职责如何分配? | 容器图、组件图、依赖图 | 一次请求的完整时间顺序 |
| 一次操作如何推进,失败后怎么办? | 时序图、状态机、补偿图 | 全站所有服务和全部数据库 |
| 系统如何部署、观测、迁移和恢复? | 部署图、网络图、可观测性图、迁移图 | 未说明环境的抽象“高可用” |
C4 的 Context、Container、Component、Code 是不同尺度的结构视图,不是要求每个项目必须交齐的四张图。官方也强调只使用有价值的层次;很多团队先做好系统上下文和容器视图即可。[1]
arc42 则把静态构建块、运行时和部署等内容分开组织。这个划分对技术方案很有帮助:结构图解释“有什么”,运行时视图解释“如何协作”,部署视图解释“在哪里运行”。不要指望一张图同时回答所有问题。[2]
这里还需要区分几组经常混用的概念。
| 层次 | 例子 | 解决的问题 |
|---|---|---|
| 图类型 / 视图 | 时序图、状态机、部署图 | 选择表达哪个问题 |
| 建模方法 / 记法 | UML、BPMN、C4、DDD Context Map | 定义元素与关系的语义 |
| 文本描述语言 | PlantUML、Mermaid、Structurizr DSL | 把模型写成可维护文本 |
| 绘图工具 / 引擎 | draw.io、Excalidraw、渲染器 | 创建、布局、展示和编辑 |
| Agent Skill | Diagram Design、Excalidraw Skill | 指导 Agent 选图、布局和检查 |
| 工具调用接口 | CLI、MCP、REST API | 让 Agent 调用绘图工具 |
这些层次可以组合使用。例如,时序图是图类型,UML 是记法,PlantUML 是一种描述和渲染方式;Agent 可以按 Skill 中的方法编写 PlantUML,再调用渲染器出图。选型时要同时考虑表达是否准确、修改是否方便,以及源文件能否长期维护,而不只是“这个工具能不能画出来”。
图类型速查:24 类图的使用场景
下面按本文的五组主题整理 24 类图和方案视图。加粗的图类型是六类高频视图对应的重点小节;“六类”是六组表达问题,不是只画六张图。例如,边界需要区分系统外部关系和内部业务职责,数据需要区分领域对象和持久化结构。组件图作为结构视图的进一步展开,其余视图按场景查阅。
| 分类 | 图类型 | 使用场景 |
|---|---|---|
| 业务与边界 | 用例图 | 需求澄清时,确认买家、商家、客服各自通过系统完成什么目标 |
| 业务与边界 | 流程图 / 活动图 | 梳理业务步骤与条件分支,例如报价不满足、库存不足、支付结果未知时如何处理 |
| 业务与边界 | 泳道图 / BPMN | 设计跨角色、跨系统流程,明确退款审核、渠道处理等步骤由谁负责、如何交接 |
| 业务与边界 | 事件风暴 | 业务建模工作坊中,共同发现命令、事件和规则,例如订单关闭后何时释放库存 |
| 业务与边界 | 系统上下文图 | 方案介绍或新人入门时,说明平台服务谁、依赖哪些外部系统,以及系统边界在哪里 |
| 业务与边界 | DDD 上下文映射图 | 划分业务模型和团队职责,明确商品、营销、计价、订单之间的上下游关系与契约 |
| 结构与数据 | 容器图 | 评审整体软件结构,说明前端、BFF、业务应用和存储的职责及通信方式 |
| 结构与数据 | 组件图 | 设计一个应用的内部结构,例如计价入口、规则引擎、金额分配器和仓储如何分工 |
| 结构与数据 | 领域模型 / 类图 | 讨论业务对象、聚合和约束,例如订单行、报价快照和金额值对象之间的关系 |
| 结构与数据 | ER / Schema | 设计持久化模型,讨论订单表、订单行、快照的键、字段和数量关系 |
| 行为与一致性 | 时序图 | 评审一次具体操作的交互顺序、同步与异步调用、超时及异常分支 |
| 行为与一致性 | 状态机 | 定义订单、支付或退款的生命周期,明确允许的转换、触发事件和冲突处理 |
| 行为与一致性 | 事件拓扑 | 设计事件发布与消费链路,说明 Outbox、Topic、消费组、重试和死信处理 |
| 行为与一致性 | Saga / 补偿图 | 设计跨服务事务,明确预留库存、锁券、保存订单失败后如何查询、补偿和恢复 |
| 行为与一致性 | 数据流 / 血缘图 | 设计数据加工链路,说明商品数据如何通过 CDC、清洗进入搜索索引和分析仓库 |
| 运行与演进 | 部署图 | 上线与高可用评审时,说明应用实例、基础设施、可用区和故障域的分布 |
| 运行与演进 | 网络拓扑 | 设计连通性与隔离,说明公网入口、子网、路由、安全组和数据库访问路径 |
| 运行与演进 | 安全 DFD / 信任边界 | 做威胁建模,识别支付通知等外部输入跨越哪些边界、需要哪些验证与控制 |
| 运行与演进 | 可观测性图 | 设计故障发现与排查链路,说明日志、指标、trace 如何采集、关联和触发告警 |
| 运行与演进 | 迁移 / 灰度 / 回滚图 | 拆库或系统替换时,说明回填、增量同步、读写切换、校验门槛和回滚条件 |
| 治理与决策 | 依赖图 / 包图 | 代码架构评审或重构时,检查模块分层、源码依赖方向、循环依赖和边界违规 |
| 治理与决策 | 故障时间线 | 事故复盘时,按时间整理发布、异常、告警、处置和恢复,并对应证据 |
| 治理与决策 | 甘特图 | 制订改造计划,展示任务持续时间、前后依赖和验收里程碑 |
| 治理与决策 | 决策矩阵 | 比较候选方案,例如编排式与事件协同式 Saga 的责任、耦合和恢复成本 |
先统一名称、边界和箭头含义
本文的电商案例
下面的图均为假设设计与教学范例,不是某个真实生产系统的逆向结果,也不是完整实现规格。配图可以点击打开 SVG 原图,便于查看较密集的标签;文末提供图源入口。
案例包含买家、商家、客服,内部的商品、价格、营销、用户、计价、订单、库存、支付、履约和售后上下文,以及外部支付渠道和物流平台。每张图只展开与当前问题有关的部分。
整个案例遵守几个约定:
- 计价读取带版本号的商品、价格和优惠信息,生成报价,并记录金额如何分摊;订单接受报价后保存成交快照。
- 订单、支付、退款、库存预留各自拥有生命周期,不混成一个巨型状态机。
- 跨服务没有一个天然共享的 ACID 事务,预留、锁券和失败恢复需要显式设计。
- 请求超时可能只是没有及时收到响应,不能直接认定操作失败。
- 已取消订单不因迟到支付通知直接复活,必须进入核对和补偿流程。
这些约定用于让不同视图相互对照,不意味着所有电商都应采用同样的服务拆分。业务上下文可以在模块化单体中实现;把计价认定为核心域,也取决于它是否承载当前业务的竞争优势。
为避免每换一张图就换一套含义,后文统一使用以下约定:
| 约定 | 本文含义 | 跨图核对点 |
|---|---|---|
| 名称与层级 | 订单上下文是业务模型边界;订单应用是运行时应用;订单实例是其部署副本 | 上下文、容器和部署视图不能把三者混成同一种节点 |
| 创单标识 | idempotencyKey 在同一买家、同一创单操作范围内标识一次业务意图;重试复用它,订单应用将它关联到处理结果与 orderId |
结果未知时用同一幂等键查询;本例不另设 requestId 作为业务查询键,日志请求 ID 不能直接替代它 |
| 关联标识 | quoteId 标识报价,reservationId 标识库存预留,paymentId 标识支付单,eventId 标识通知事件 |
事件去重还要结合业务状态和支付事实,不能只依赖消息 ID |
| 事件与动作 | OrderCreated 在订单落库后发布;库存消费者关联已有预留与订单,不再次扣减可售库存 |
创单前预留与创单后消费不是两次库存扣减;预留过期的冲突仍需核对和恢复 |
| 金额与状态 | 报价金额是提议,order_amount 是接受报价后的成交金额,实付金额来自支付事实 |
本例假设单币种、一次足额支付;待支付不等于已经实付,已取消订单不因迟到成功复活 |
每张图都要能独立读懂
C4 的记法建议包括标题、图例、元素类型与职责,以及有明确方向和含义的关系。容器间关系还应写清通信技术。可以把这些要求当作团队绘图规范的起点。[3]
| 项目 | 推荐约定 | 电商例子 |
|---|---|---|
| 标题 | 业务 / 系统 + 场景 + 视图类型 | 订单创建与支付确认:关键时序 |
| 范围 | 明确现状或目标,以及环境与版本 | To-be;生产环境;对应设计稿版本 |
| 节点 | 名称、类型、职责;按视图补充技术或状态 | 计价应用:生成可解释报价 |
| 连线 | 明确关系、方向,以及动作或传递的数据 | 读取价格表版本;发布 OrderCreated |
| 图例 | 解释颜色、线型、形状和缩写 | 虚线表示异步事件,不表示“可选” |
| 证据 | 区分已确认、推断和待确认 | 接口契约支持;尚未确认回调重试 |
| 维护 | 记录责任人、图源位置和更新时机 | 修改支付事件定义时同步更新图 |
线型不能全局一刀切。普通架构示意可以约定实线表示主连接、虚线表示事件,但 UML 的依赖、实现、返回消息等关系已有自己的记法;BPMN 也有顺序流和消息流。团队约定不应覆盖这些标准语义。
图变得拥挤时,可以先让主图只保留关键节点,把内部细节拆成子图。是否需要拆分,取决于读者能否快速找到主要关系,而不是节点数量有没有达到某个固定上限。
后文的容器图作为带标题、范围、职责和图例的样板;其他图是针对单个问题的局部示意。把局部图单独放入评审材料时,应补齐原本由正文提供的范围和假设。
业务与边界:先把“做什么”和“谁负责”画清楚
用例图:谁通过系统完成什么目标
用例图适合需求澄清。它关注角色与功能目标,不描述执行顺序。PlantUML 可以用 actor、usecase 和系统边界表达这些关系。[4]
图中买家提交订单、申请退款,商家确认发货,客服审核售后。角色关联不是“先浏览再下单”的步骤箭头。这个 Mermaid 范例不是完整的 UML 用例图形记法;另附一个 PlantUML 最小用例示例。讨论支付回调或数据库事务时,应转到时序图。
流程图 / 活动图:规则在哪里分叉
流程图强调动作与判断。这个例子要表达的是:报价与库存条件不满足时不能生成订单;支付结果有成功、失败、未知三种语义,未知结果需要查询和对账。
画这种图时,判断分支要写清条件,拒绝路径要有终点。用户拒付、网络断开和渠道结果未知,需要采取的后续动作不同,不应都合并到一个“支付失败”节点中。
泳道图 / BPMN:跨角色交接是否清楚
泳道图用于明确跨角色交接:买家申请退款,售后验证资格并审核,支付系统处理退款。上图是分组流程示意,并非严格 BPMN;正式 BPMN 还需遵循任务、事件、网关、池、泳道及不同流类型的记法。[5]
人工流程尤其要补上:谁可以批准、拒绝后如何反馈、等待多久、超时由谁处理。这些通常比图标是否标准更早暴露问题。
事件风暴:发现业务事实与规则
EventStorming 是探索复杂业务领域的协作工作坊方法,而不是消息队列拓扑模板。[6]
图中,“提交订单”是希望执行的命令,“订单已创建”是已经发生的事件,“启动支付期限”是后续策略。标签本身要说明类型,不只靠颜色区分。讨论时继续追问:“订单已关闭”是否意味着库存已经释放,还是还需要异步处理?
AI 可以整理清单,但不能替代订单、支付、运营等真实业务参与者确认,推演不等于团队共识。
系统上下文图:系统在外部世界中的位置
C4 的系统上下文视图把电商平台看成一个整体,外围是人和外部软件系统。它适合在方案开头确认本次讨论的系统边界:买家、商家和客服是使用者,支付渠道与物流平台是外部依赖,而订单、计价等内部实现暂不展开。
读图时先沿买家到平台的关系确认用户目标,再沿平台与支付渠道之间的双向关系区分“发起支付”和“接收结果”。即使渠道属于另一家公司,它的返回结果仍会影响平台内的订单处理,因此不能只画单向的“调用支付”。
这张图能促成一个具体判断:支付渠道负责确认扣款事实,平台负责决定订单能否接受该结果。后面的时序图要解释通知如何进入,状态图要解释订单已取消时怎么办;系统上下文图本身不承担这两种细节。
这一层不需要 Redis、订单表或 Pod。若把这些对象一起画进去,读者就无法判断哪些是平台内部实现,哪些是真正的外部依赖。
DDD 上下文映射图:模型与规则的边界
Context Map 描述限界上下文及其关系。上下游方向表达模型或契约的影响,不应直接从 HTTP 调用方向推导;反腐层 ACL 用于把外部模型转译成内部语言。[7]
在本例中,计价使用商品分类、价格表版本、营销规则和会员信息生成报价;订单接收报价及其分摊明细,保存成交依据。
这张图回答的不是“调用经过几个服务”,而是:
- 谁拥有业务事实?
- 谁负责价格组合、舍入和分摊,保证金额计算规则成立?
- 谁接受报价并承担成交承诺?
- 契约变化由哪一方影响另一方?
U / D 是相对某条关系的角色,不是一个上下文永久的全局身份。计价相对价格上下文是下游,相对订单又可以是上游。
边界评审可以沿“报价能否直接成为成交事实”追问:计价给出候选金额和分摊证据,订单负责接受报价并保存快照。如果订单总是在展示或支付时重新读取最新价格,就没有守住成交事实的边界。这个判断应同时落到数据视图的快照和时序视图的报价校验步骤,而不是只在上下文图上增加一个“计价”方框。
系统上下文图回答“平台与外界如何协作”,这里回答“平台内部哪些业务模型通过什么契约协作”。不要把这两个不同尺度的“上下文”当作同一张图。
更多领域建模背景可结合 领域驱动设计:从方法论到电商计价实践 阅读。图中只需保留本次讨论所需的边界和关系,详细规则放在正文或配套模型里。
结构与数据:把逻辑分解和持久化模型分开
容器图:应用与存储如何协作
C4 中的 Container 是应用或数据存储,不等于 Docker 容器。容器视图说明职责分配、技术选择与通信方式;副本、故障域与切换策略属于部署视图。[8]
这张样板图限定了“下单与支付”的目标设计范围,省略履约、营销和外部渠道细节;节点说明类型、技术与职责,关系说明通信方式和动作,图例解释形状与线型。图中既保留订单应用创建支付意图的关系,也保留买家经 BFF 确认支付的入口,两者不是同一个动作。
容器表示运行时应用或数据存储边界,不要求独占主机或 Docker 容器。若订单、计价只是同一应用内的模块,应放到组件或模块视图中,而不是仅按业务名称画成独立应用。具体副本和故障域仍由部署图说明。[8]
评审时沿关系检查三件事:请求入口在哪里,谁可以改变业务状态,谁拥有数据写入权。这里支付应用只写支付库,通过通知让订单应用处理订单状态;如果支付应用还直接写订单库,就应明确画出来并解释这个例外。
后面的时序图是这张结构图的局部展开:为便于阅读省略 BFF 等转发层,但关键服务关系不能凭空变化。库存预留、支付意图和结果通知都应能在两张图中找到对应位置。
组件图:一个应用内部怎么分配职责
组件图进一步展开计价应用的内部职责:入口适配请求协议,应用组件组织处理步骤,事实解析器读取带版本号的输入,规则引擎组合价格与优惠,金额分配器处理舍入与分摊,仓储保存计算结果及其依据。
这一层用于评审职责与依赖,不是列出所有类。如果每个 DTO、Mapper、工具函数都拥有一个方框,结构就会被实现细节淹没。
先写清一句话职责,再决定是否值得成为图上的节点。一个只有包名、没有职责的方框,很难支撑设计评审。
它与容器图的对应点是“计价应用”这个边界;只有需要继续讨论内部职责时才展开,不必为其他每个应用复制一张组件图。
领域模型 / 类图:对象与不变量
领域模型关注业务概念和约束。订单作为聚合根包含订单行与成交证据,金额带有币种,操作用 acceptQuote()、confirmPayment() 等业务意图命名。
组合关系和数量约束描述的是业务模型,并不等于声明数据库外键。类图也不应该只是 getX()、setX() 的目录。它需要帮助读者回答:哪个对象负责保证哪些业务规则,哪些修改必须一起完成?
订单、支付账本和退款不一定在一个聚合里。把它们都画成 Order 的组成部分,可能掩盖实际跨边界的一致性问题。
以 acceptQuote() 为例,本例要求报价被接受后,订单保存成交依据,并保证订单行分摊金额之和等于订单成交金额、币种一致。类图中的组合关系只标出这些对象由谁管理;规则本身仍需在方法契约或相邻说明中写清。confirmPayment() 则要同时检查金额和当前订单状态,不能把它实现为无条件设置 status。
因此,领域模型要与状态图核对“哪些操作合法”,与 ER 图核对“保证规则所需的事实是否留存”。它不是表结构的另一种画法。
ER / Schema:持久化什么,如何约束
同样是订单,ER 视图关注的是数据键、基数、字段和存储关系。Mermaid 支持 ER 图,可以把这类定义作为文本维护。[9]
这个简化 Schema 表达:订单包含至少一个订单行,并保存一个报价快照。order_amount 与币种记录成交金额,订单行保存分摊金额;它们不是待支付订单已经收款的证明。实付金额及渠道交易事实由支付侧记录,通知核对通过后再推进订单状态。buyer_id 和 sku_id 是业务标识,不默认声明跨服务数据库外键。
评审这张图时,可以拿一笔历史订单检验:商品调价或营销规则升级后,是否仍能解释当时的成交金额?若只有 quote_id 而没有可恢复的快照内容,就需要确认报价侧是否永久保留该版本;本例选择由订单保存成交证据,避免依赖实时价格。
不能从这张图推出表已经可以上线。物理设计还需补充金额精度、索引、幂等唯一约束、状态并发控制与快照结构。订单、订单行和快照的写入,以及用于发布 OrderCreated 的 Outbox 记录,应在本例的本地事务中一起提交;简化 ER 图只展开业务表,Outbox 见后文事件拓扑。
类图和 ER 图可以映射,但并非一一对应。一个值对象可能展开成多个列,一个聚合也可能持久化到多张表。
行为与一致性:正常路径只是开始
时序图:时间顺序和交互语义
这张图把一次具体操作展开为:订单提交、报价校验、库存预留、订单保存、支付意图创建、买家确认支付与结果通知。图中省略 BFF、计价查询和支付渠道内部交互,直接突出订单、库存和支付的协作;无优惠券的主路径不展开锁券,带券路径由 Saga 图补充。
读图时区分两个动作:订单应用请求创建支付意图,并不代表已经扣款;买家确认支付后,支付侧仍需核实渠道结果。创建支付意图失败时,已保存的待支付订单也不能被当成“创单未发生”,应按订单标识查询并幂等恢复支付入口。
支付通知到达后,不是直接执行“更新为已支付”,而是按当前状态分支:订单可接受且金额币种匹配时原子推进;订单已取消时保留取消状态,并可靠记录核对和补偿任务。重复通知不应再次启动履约或创建同一笔退款。图中的实线箭头表示请求,虚线箭头表示响应;异步事件投递则在事件拓扑中单独表达。
这张图可以用来提出明确的评审问题:通知去重与状态更新是否原子完成?调用超时后查哪个业务标识?失败恢复由谁持续推动?支付结果未知时先查询渠道并对账,不直接宣告失败;预留成功但订单保存失败时转到补偿视图。每个分支的状态结果还应与下一节的转换规则表一致。
状态机:一个实体允许怎样变化
状态机描述一个实体的生命周期,而不是整个购买流程。每次状态转换都应说明触发事件、允许转换的条件,以及转换时执行的动作。
本例禁止已取消订单因迟到支付成功通知直接回到已支付。实际处理可能要求发起退款、对账或人工核实,取决于已发生的外部事实。
建议同时维护一张转换规则表:
| 当前状态 | 事件 | 转换条件 | 结果 | 重复 / 冲突处理 |
|---|---|---|---|---|
| 待支付 | 支付成功已确认 | 订单仍可接受,金额币种一致 | 已支付 | 同一确认幂等 |
| 待支付 | 取消 / 到期 | 尚未完成支付确认 | 已取消 | 与支付确认竞争原子状态更新 |
| 已取消 | 迟到支付成功 | 核对渠道成功事实 | 保持已取消,进入补偿 | 不复活订单 |
| 已支付 | 重复支付通知 | 同一支付事实 | 保持已支付 | 去重;不重复启动履约 |
例如,支付确认和超时取消都读到了“待支付”,不能因此都认为自己可以成功更新。应以当前状态或版本为条件完成原子转换,失败的一方重新读取状态并走对应分支。状态机表达的是允许的结果,转换规则表则明确并发时仍须遵守的条件。
“已取消”是订单生命周期的终态,不意味着所有后续工作已经结束。迟到支付核对、退款和人工恢复可以在独立任务或支付、退款状态机中继续推进。若时序图画出了 Cancelled → Paid,即使它看起来更短,也违反了本例已经确认的规则。
订单、支付和退款分别维护自己的状态机,再用时序图解释它们如何协作。这样可以避免把多个生命周期组合成一个难以维护的巨型状态机,也更容易明确每种状态由谁管理。
事件拓扑:可靠发布和消费,而不只是一个 MQ
Transactional Outbox 将业务更新和待发事件写入同一本地事务,再由 Relay 投递。Relay 可能重复发布,因此消费者仍然需要幂等。[10]
本图用于检查事件名、Topic、消费组与失败去向。库存消费者根据 OrderCreated 中的 orderId、reservationId 关联已有预留,不再次扣减库存;预留过期的冲突进入核对恢复。实线表示本地写入或读取,虚线表示事件投递。
orderId 作为消息键不自动保证跨分区、跨 Topic 的处理顺序。图外还需约定重试、幂等存储、保留期、死信责任和积压恢复;消息队列本身不是 exactly-once 承诺。
Saga / 补偿图:失败如何收敛
Saga 由多个本地事务组成,通过显式补偿应对跨服务失败。补偿不是数据库事务的自动回滚。[11]
这张图展开带优惠券的创单路径:库存预留成功后锁券,再保存订单。锁券确定失败时释放库存;订单保存确定失败时依次解锁优惠券、释放库存;结果未知时先用同一 idempotencyKey 查询订单处理结果。图聚焦预留成功之后,预留自身的失败与未知处理见下表。
这里最重要的判断是:查询暂未找到订单,不等于订单最终不会创建成功。 请求可能仍在执行,或查询读到了滞后副本。本例只有确认创单处理已终止、且不会再提交订单时才进入释放流程;否则继续核对或转人工,不把“没查到”直接改写成“确定失败”。
| 操作 | 确定失败 | 结果未知 | 补偿与恢复责任 |
|---|---|---|---|
| 预留库存 | 终止创单,不继续锁券 | 按 reservationId 查询预留事实,未确认前不继续 |
订单侧流程协调者跟踪;已成功但不再创单的预留需幂等释放 |
| 锁定优惠券 | 释放已成功的库存预留 | 按稳定的锁券业务标识查询,不重复创建另一把锁 | 协调者记录恢复任务,营销侧提供幂等查询与解锁 |
| 保存订单 | 确认不会再提交后,解锁券并释放库存 | 按同一创单幂等键查询;仍未知则保留核对任务 | 已提交则恢复待支付流程,不能再按“创单失败”释放 |
| 解锁券、释放库存 | 补偿失败不是创单重新成功 | 查询对应资源状态,再决定重试 | 协调者持久化各步骤进度,幂等重试;无法自动收敛时告警并人工接管 |
图中的顺序补偿只是本例的简化选择。若解锁券阻塞是否仍可先释放库存,应由业务约束决定,并分别记录进度;不能让一个“重试”节点掩盖两个资源的不同恢复状态。
如果前一步已经产生外部扣款,补偿可能是新建一笔退款,而不是抹掉扣款事实。业务历史和审计证据应保留。
这也把补偿图与其他视图连起来:时序提供失败发生的位置,状态决定是否还能继续交易,数据记录已经发生的事实,补偿只处理那些已成功但不再需要的业务效果。
数据流 / 血缘图:数据怎样产生和加工
数据流图说明数据如何产生、转换并进入索引或报表,箭头不是方法调用的时间顺序。这里搜索索引是异步更新的查询副本;展示的价格或库存可能滞后,下单仍需向相应业务系统核实。
评审时补充数据新鲜度、删除传播、版本去重与回放策略。一条 CDC 箭头只说明有数据传递,不能证明副本在任何时刻都正确。
运行与演进:把上线之后的问题画出来
部署图:实例与故障域
C4 部署视图把软件实例映射到指定环境的基础设施节点,节点可以嵌套,也可以包含入口等基础设施。[12]
部署图用于上线与高可用评审:容器图中的一个“订单应用”,在这里展开成两个 AZ 内的实例。这只是生产部署假设,不是可用性承诺。
关键问题是主节点失效时谁切换、副本不可用时能否继续写入、客户端如何重连,以及是否丢失已确认数据。共同依赖和故障演练也要检查,不能仅凭两个 AZ 判断高可用。
网络拓扑:连通性与网络隔离
网络拓扑解释公网与私网区域、入口出口和允许的路径。本例仅允许应用安全组访问 MySQL 与 Redis,数据库没有公网入口。
网络许可不等于应用授权,能够连接数据库不代表可以读写所有表,TLS 也不能替代业务校验。DNS、NAT、路由和管理入口按需补充,不把每条网络连接都解释成业务调用。
安全 DFD / 信任边界:不可信输入在哪里进入
威胁建模需要理解系统、数据流、信任边界与资产,并把威胁和控制措施联系起来。OWASP 的威胁建模指南可以作为检查框架。[13]
支付渠道通知通过 HTTPS 进入系统,仍然是需要验证的输入。图中强调验签、重放检测、商户与订单核对、金额币种检查,以及幂等账本更新。
这是信任边界的简化示意,不是完整威胁清单。真实方案还要逐项记录攻击面、威胁、缓解措施和残余风险,例如密钥泄露、伪造通知、日志暴露和管理员越权。
可观测性图:故障怎么被发现与关联
OpenTelemetry 将 traces、metrics、logs 等作为不同遥测信号。画观测链路时,业务请求和遥测输出应分开表达。[14]
本图用于讨论故障发现与排查:实线是请求或后续处理,虚线是遥测流;订单与支付传播关联上下文,数据经 Collector 进入查询和告警链路。
除了采集,还需说明谁响应支付未知积压、订单确认延迟或预留未释放等业务异常。orderId 可用于日志与 trace 关联,不宜无控制地用作指标标签;基数、采样和敏感字段都需治理。
迁移 / 灰度 / 回滚图:何时切换读写,失败后怎么退回
迁移图不能只有“旧库 → 新库”一条箭头,还要说明每个阶段以哪个库为准,满足什么条件才能推进,何时切换读写,以及还能不能退回旧库。
本例先只向旧库写入,回填历史数据,并通过 CDC 同步增量;校验通过后,逐步把读请求切到新库;最后停止旧库写入,确认数据追平,再把写请求切到新库。新库开始接收写入后,旧库不再天然拥有完整数据。要切回旧库,必须先解决反向同步和一致性校验等问题。
补充视图:代码治理、事故、计划与决策
依赖图 / 包图:源码依赖能否支撑边界
这张图的箭头表示编译或源码依赖,不是一次请求的执行顺序。基础设施实现领域端口,因此可以在源码上依赖领域层;运行时调用仍可能经过该适配器。
如果要确认“没有循环依赖”或“领域层不依赖 ORM”,需要检查实际 import、构建依赖或模块关系。图上的设计要求,不能替代对代码的检查。
故障时间线:先还原事实,再讨论原因
这是一份假设事故,时间采用 UTC+8。时间线排列发布、异常、告警、回滚和恢复,帮助团队对齐事实。
时间先后并不自动证明因果。发布发生在异常前,不意味着发布必然是根因。复盘时应给关键节点附日志、指标、trace 或操作记录,对时钟误差和证据缺口作说明。
甘特图:任务依赖与交付里程碑
甘特图(Gantt)表达任务安排、持续时间和前后依赖,不描述系统运行过程。图中的日期只是示例计划,不代表实际工期承诺。
还需定义“影子读验证完成”等里程碑的验收标准。Diagram Design 的目录包含 timeline、Gantt、架构与数据可视化,适合作为表达方式参考,不是方案的必画清单。[15]
决策矩阵:同一组维度比较方案
上图只是候选方向的示意。真正的属性比较,使用表格通常比方框图更清楚。
| 维度 | 编排式 Saga | 事件协同式 Saga |
|---|---|---|
| 流程责任 | 编排器显式管理步骤与状态 | 分散在参与者和策略中 |
| 全局排查 | 可围绕流程实例追踪 | 需要跨消费者关联 |
| 耦合方式 | 编排器依赖参与者契约 | 参与者依赖事件与策略 |
| 主要复杂度 | 流程中心增长与恢复治理 | 隐式链路、循环触发与全局理解 |
| 采用前提 | 需要集中查看流程并统一推动恢复 | 各参与方职责清楚、事件治理成熟 |
这是定性比较,不是性能测试或固定结论,也不应凭空给属性打分。选择之后,用架构决策记录(ADR)留下约束、理由、收益与代价、接受的风险、验证指标和重新评估条件。
工具怎么选:讨论、维护和发布各有侧重
不同工具解决不同成本
| 工具 | 适合什么 | 建议保留的源文件 | 主要取舍 |
|---|---|---|---|
| PlantUML | UML、复杂时序、状态、活动、包与部署 | .puml |
语义表达明确;需要语法和布局经验 |
| Mermaid | Markdown 中的流程、时序、类、状态、ER 与计划 | .mmd |
易集成;需核对文档平台支持的版本 |
| Structurizr | 同一架构模型生成多种 C4 视图 | DSL / 模型 | 降低多视图漂移;有建模治理成本 |
| draw.io | 正式可编辑架构、云组件、网络与业务流程 | .drawio |
图形生态丰富;XML 差异不一定容易审查 |
| Excalidraw | 白板讨论、业务边界、可拖拽方案图 | .excalidraw |
修改灵活;图例和关系含义需要自行约定 |
| Diagram Design | 文章、演示、发布级图 | HTML + 内嵌 SVG | 展示质量强;不等同于结构化架构模型 |
| D2 | 文本化服务结构、分组和依赖 | .d2 |
声明式布局;不是严格 UML / BPMN 的替代品 |
draw.io 推荐使用 .drawio 保存原生图,也支持在 SVG、PNG 等格式中嵌入图数据。因此,不能简单地说“SVG/PNG 一定不可编辑”:能否还原为原生图形,取决于导出时有没有嵌入图数据。[16]
Structurizr DSL 将模型与视图分开:先定义系统、应用和关系,再从同一模型生成不同的 C4 视图。对于长期维护多张架构图的团队,这有助于减少重复定义和人工同步。[17]
D2 也是文本描述和渲染工具,可用于结构示意;不必为了每种新图都更换整个工具栈。[18]
我的建议是从一个小组合开始:
- 一种文本图工具:PlantUML 或 Mermaid,承担高频工程图。
- 一种共同编辑画布:Excalidraw 或 draw.io。
- 一种发布方式:需要品牌化展示时,再使用 Diagram Design。
如果主要写 Markdown 方案,Mermaid 往往降低集成成本;如果复杂 UML 与时序是日常工作,PlantUML 更值得投入。先根据团队维护方式选择,不要根据支持类型数量排名。
你真正要保存的是什么
建议同时验收“图能不能展示”和“以后能不能修改”。本文把持续维护、用于生成展示图的文件称为图源:
1 | 图源:记录业务关系、状态或原生图形元素 |
.mmd、.puml 和 DSL 便于通过文本差异审查变更;.drawio 和 .excalidraw 保留可拖拽的原生图形。HTML/SVG 也可以修改代码,但坐标和路径的变化,未必能直接告诉评审者“新增了一条支付补偿关系”。
不要假设 Mermaid → Excalidraw → SVG → draw.io 可以无损往返。导入可能重新布局、退化成图像,或失去某些关系语义。跨工具转换后需要再次验收。
本文的范例使用 SVG 保证浏览器展示,同时保留同名 Mermaid 图源。正式 UML 用例另附 PlantUML 源;泳道与安全边界等图已明确标为简化语义示意。
三个参考项目的定位
PlantUML 帮助定义与渲染图语法;Diagram Design 指导 Agent 做发布级布局;Cole 的 Excalidraw Diagram Skill 则指导 Agent 生成场景 JSON,并通过渲染检查布局。[19]
Cole 的 references 中,元素模板负责矩形、文本、箭头等组合,schema 负责场景文件格式。它们是绘图实现参考,不是新的架构图语义标准。[20] [21]
这三者可以配合使用,但没有必要把同一张图维护成三份源文件。先决定今后主要通过文本修改,还是在画布上拖拽修改,再选择对应的图源;其他格式作为导出结果即可。
AI Agent 绘图:从生成初稿到持续维护
先区分生成图片和生成工程图
工程绘图的验收重点,是关系表达准确、文字清晰、后续可修改。按这个目标,可以把 AI 辅助绘图分成三条路线:
| 路线 | Agent 主要做什么 | 适用场景 | 建议保留什么 |
|---|---|---|---|
| 生成图描述文本 | 编写 Mermaid、PlantUML、D2 或 DSL,再调用渲染器 | 时序、状态、ER、结构与依赖 | 文本图源与渲染结果 |
| 生成或操作原生场景 | 编写图形元素,或调用工具修改节点和连线 | 白板讨论、业务边界、自由布局 | .excalidraw / .drawio 与导出图 |
| 生成展示图片 | 根据描述或参考图生成位图 | 配图、概念插画、视觉草稿 | 原图及生成说明 |
这是按维护方式做的实践分类,不是工具之间的能力排名。比如,一张支付时序图需要频繁修改异常分支,我会优先用文本图源;一张 DDD 战略设计图需要与同事一起拖拽调整边界,我会优先用原生画布。博客或演示则从图源导出 SVG / PNG,不再单独维护第二套关系。
可以使用哪些 GitHub 绘图 Skill 和工具
下面从此前调研中整理出 18 个工程绘图及相关架构分析项目,说明各自解决什么问题。这些项目并不都是 Skill,也不都采用允许商业使用的开源许可:有的提供绘图方法和生成脚本,有的提供画布运行时,有的侧重架构分析或通过 MCP 操作图。项目名旁的引用编号对应文末的 GitHub 入口;Nereid 的使用限制单独标明。
| GitHub 项目 | 类型 | 主要作用 | 主要输出 | 电商方案中的用法 |
|---|---|---|---|---|
yctimlin/mcp_excalidraw [22] |
Skill + CLI + MCP + REST + 本地画布 | 创建、查询、修改图形元素;对齐、分组;读取场景和截图;导入导出与保存快照 | .excalidraw、.excalidraw.md、SVG、PNG |
画 DDD 业务边界,评审后只调整计价与订单之间的关系,保留可编辑图源 |
coleam00/excalidraw-diagram-skill [19] |
生成与设计 Skill | 从描述组织视觉结构,使用元素模板和配色规范生成场景 JSON,再通过 Playwright 渲染检查 | .excalidraw,PNG 检查图 |
把下单链路整理成结构清晰的方案图,检查分组、标签和箭头布局 |
excalidraw/excalidraw-mcp [23] |
官方 MCP App | 在支持 MCP Apps 的客户端中流式展示图形,控制视口,并提供交互式全屏编辑 | 对话内的 Excalidraw 交互视图 | 在方案讨论中快速画出订单、支付与库存的关系,并继续编辑 |
axtonliu/axton-obsidian-visual-skills [24] |
面向 Obsidian 的 Skill 集合 | 将笔记转成 Excalidraw、Mermaid 或 Obsidian Canvas;按目标格式组织可视化内容 | .excalidraw、Obsidian 插件 Markdown、Mermaid、.canvas |
把商品、营销、计价的知识笔记整理成概念关系图 |
jgraph/drawio-mcp [25] |
官方 MCP + 绘图 Skill / 插件 | 在对话或 draw.io 编辑器中打开图;插件生成原生文件,并可调用本地 Desktop CLI 导出 | .drawio;插件可导出 PNG、SVG、PDF |
画需要在 draw.io 中继续编辑的部署、网络或正式架构图 |
robonuggets/excalidraw-skill [26] |
配合 MCP 使用的设计 Skill | 指导 Agent 使用分区、语义配色、箭头绑定、字号层级和布局检查;通过截图反复修正 | 借助配套工具输出 .excalidraw、PNG、SVG |
已有本地画布,希望让订单、支付、履约分区更清晰、布局更一致 |
robtaylor/excalidraw-diagrams [27] |
Skill + Python 生成器 | 提供通用图、流程图和架构图构建器,程序化创建节点和连线,保存原生场景 | .excalidraw,可在编辑器中导出图片 |
用脚本批量生成相似的订单处理流程或服务结构示意 |
cathrynlavery/diagram-design [15] |
发布与视觉设计 Skill | 选择图类型,统一品牌配色、字体和版式,将结构整理成适合文章或演示的图 | 自包含 HTML + SVG,可导出 SVG / PNG | 将已经确认的计价架构或迁移方案整理成博客配图 |
tt-a1i/archify [28] |
交互式技术图 Skill | 根据描述或仓库证据生成架构、流程、时序、数据流和生命周期图,支持浏览器内探索关系 | 结构化 JSON 图源、自包含 HTML + SVG,支持图片导出 | 给新同事展示电商服务关系,搜索节点并聚焦某条请求或数据路径 |
Agents365-ai/drawio-skill [29] |
架构建模与绘图 Skill + CLI,可选 MCP | 从代码、Terraform、Kubernetes、SQL、API Schema 提取结构,生成原生图;支持增量同步、多视图和架构规则检查 | .drawio;可导出 SVG、PNG、PDF、HTML、PPTX 等 |
从订单服务部署配置生成架构图,变更后保留人工布局并同步节点关系 |
bybit-exchange/svg-diagram [30] |
纯 SVG 绘图 Skill + 校验器 | 规定坐标、间距、字体、语义配色和连线规范,直接编写 SVG,并检查文本溢出、重叠等问题 | 独立 SVG | 为计价文章生成轻量配图,通过源文件差异审查标签和关系变更 |
imxv/Pretty-mermaid-skills [31] |
Mermaid 美化与渲染 Skill | 将已有 Mermaid 源码按主题渲染,支持流程、时序、状态、类、ER、XY 图和批量导出 | SVG、PNG、ASCII / Unicode | 保留支付时序 .mmd,统一方案中的图形主题并导出展示图 |
aetox-skills/senior-architect-agent [32] |
架构分析与评审 Skill | 先检查现有系统证据,再梳理模块、依赖、数据流、边界问题、技术债和待确认项 | 架构说明、模块与流程文档、Mermaid 图、风险清单 | 先分析计价服务的实际代码,再画模块关系,说明哪些连接已确认、哪些是推断 |
vijayjoshi24/ea-agent-skills [33] |
企业架构 Skill 集合 | 包含 C4 图、业务能力地图、ADR、技术债扫描和架构评审等技能 | 交互式 SVG、能力地图、ADR、评审报告;部分技能输出治理清单 | 梳理商品、交易、履约能力及改造缺口,并为服务拆分记录决策 |
Ztsdut/ml-architecture-diagram-skill [34] |
ML 专用 Skill + 架构 IR + 渲染器 | 从模型代码或规格恢复计算路径,组织层、张量和分支,生成可编辑的模型结构图 | YAML / JSON 图源、SVG、.drawio、PPTX、PNG、PDF |
展示推荐、排序或多模态商品模型;不用于替代订单微服务架构图 |
lcapossio/hdldiagZero [35] |
HDL / RTL / SoC 专用 Skill + 渲染器 | 从硬件描述整理模块、时钟域、总线与跨时钟域连接,生成并校验方框图 | JSON 规格、SVG | 通常不用于普通电商后端;涉及硬件加速器或芯片设计时再考虑 |
naorsabag/openhop [36] |
代码流程讲解 Skill + CLI + 本地交互界面 | 将代码中的请求、数据或状态流程整理成 YAML,支持逐步播放、暂停和展开子流程 | YAML 图源、交互式流程页面 | 逐步讲解提交订单后如何预留库存、确认支付和触发履约 |
bnomei/nereid [37] |
Mermaid 终端工作台 + MCP;非商业源码可见许可 | 在终端查看和编辑图,持久化会话,并通过 MCP 查询或修改图结构 | .mmd、文本预览、会话元数据 |
可作为终端协作候选;公司内部业务使用须先取得许可,不列为默认推荐 |
表中的能力来自项目文档;电商用法是本文给出的应用示例,不是这些项目已经提供的电商模板,也不是横向性能测试。
本案例可以先按图源缩小选择:时序、状态和 ER 沿用 Mermaid;需要拖拽讨论边界时使用原生画布;发布时从图源导出展示图。后文只展开 mcp_excalidraw 的最小操作,其他项目按表中场景查阅,不必为了六类视图分别安装六套工具。
几个容易混淆的地方,需要单独说明:
robonuggets/excalidraw-skill 依赖 yctimlin/mcp_excalidraw,补充的是设计与检查规则,不是另一套独立画布。[26]
robtaylor/excalidraw-diagrams 的基础生成器使用 Python 标准库,但渲染、导出与可选集成仍可能需要额外环境。[27]
官方 Excalidraw MCP 支持交互编辑,并非只能一次生成;draw.io 官方 Skill / 插件可以不配置 MCP,直接生成原生图,本地图片导出依赖 Desktop CLI。[23] [25]
Axton 明确标为实验性原型;Archify 可结合仓库证据,但输出不自动等于完整、准确的依赖分析,两者都需验收。[24] [28]
Agents365 的提取与同步工具不是 jgraph 官方集成;两者的导出与转换均受环境和版本限制,不能视为无损往返。[29] [25]
svg-diagram 的校验器仍需 Node.js,“零依赖”指不额外安装 Node 包。Pretty Mermaid 也依赖本地 Node.js 渲染;美化不等于核实业务关系。[30] [31]
架构分析不能替代团队确认 DDD 边界;ML、HDL 的模型与符号有专门含义,不直接加入常规电商方案工具栈。
Nereid 在本次调研时采用 Source-Available Noncommercial License,商业、产品和内部业务使用需另行书面许可。本表仅保留调研记录,不将其列为企业默认推荐,采用前应重新核对 LICENSE。[37]
安装第三方技能前,应阅读 SKILL.md、脚本与许可证,确认依赖、文件写入和网络访问行为。本清单是项目文档核验后的能力摘要,不代表这些项目已在你的环境中逐一安装或测试,也不构成“全部安装”的建议。
工作原理:Agent 操作的是元素,不是像素
以 mcp_excalidraw 为例,可以把各部分的职责理解为:[22]
1 | 工程师提供问题、资料与约束 |
Skill 告诉 Agent 如何选图、安排布局、连接箭头和检查结果;CLI、MCP 和 REST 是三种操作入口;Canvas Server 保存运行中的场景,网页让人查看和继续编辑。没有配置 MCP 的编程 Agent,也可以通过 CLI 完成绘图。
场景中记录了矩形、文字、箭头的 ID、坐标、尺寸、颜色和连接关系。因此,Agent 可以只移动一个节点,或只修改一条连线,不必重新生成整张图片。
需要注意,工具的输入格式与原生 Excalidraw 文件格式不是一回事。下面的 text、startElementId 和 endElementId 是该项目 CLI 提供的便捷字段,工具会把它们转换成原生的文本元素和箭头绑定;不能把这几个对象直接当作完整的 .excalidraw 文件。原始 REST 请求的字段结构也不同,接入时要查对应接口文档。[22]
1 | [ |
这个小例子只表示应用之间的关系,不是完整的下单时序。库存预留失败、订单保存失败等处理,仍应在相应行为图中展开。
从安装到交付:一个最小操作示例
下面按调研时核验的 mcp-excalidraw-server 2.1.2 编写,要求 Node.js 20 或更新版本。示例固定版本是为了便于复现,不表示以后始终推荐这个版本;升级后应重新核对命令和输出。[22]
先安装项目级 Skill,并启动画布:
1 | npx -y mcp-excalidraw-server@2.1.2 install-skill --dir .agents/skills |
Skill 会放到 .agents/skills/excalidraw-skill/。实际安装根目录要与 Agent 的技能发现规则一致;如果需要 Codex 用户级安装,可以改用 install-skill --target codex。安装命令会替换目标目录中的旧技能,升级前不要把自己的定制文件只保存在该目录中。[22]
画布默认地址是 http://127.0.0.1:3000,可以在浏览器中观察绘图过程。若端口已有其他服务,先确认占用情况并另行配置端口,不要直接停止未知服务。开始操作前,也应先用 describe 查看画布内容,避免覆盖别人的图。
假设上面的 JSON 已保存为 elements.json,创建元素、检查结果并导出:
1 | mkdir -p diagrams |
这是一个面向独立示例画布的操作模板。实际复用时要检查节点 ID 是否已存在,输出路径是否会覆盖已有文件,并在最后一次修改后重新检查最终渲染结果。
该版本的普通截图和 SVG / PNG 导出可以在服务端无浏览器渲染:Excalidraw 的 exportToSvg 负责生成 SVG,jsdom 提供所需的 DOM 环境,resvg 将 SVG 转成 PNG。render 可以直接读取已保存的场景,不需要启动画布服务;Mermaid 转换和视口控制仍需要打开画布页面。内置字体主要覆盖拉丁文字,中文渲染依赖运行机器上的字体,所以“无需浏览器”不等于“中文在所有环境下都一样”。[22]
生成、观察、修正:把两种验收分开
Agent 的绘图流程可以组织成一个循环:
1 | 提取事实 → 创建节点与连线 |
在这个流程中,describe 帮助 Agent 找到节点、标签和连接关系,截图帮助它检查文字与布局。但检查和修正需要 Agent 实际执行,不能把“提供截图工具”写成“工具自动保证没有重叠”。[22]
| 验收层面 | 检查什么 | 电商例子 |
|---|---|---|
| 视觉检查 | 中文是否完整,文字是否截断,节点是否重叠,箭头是否穿过标签 | “库存预留”是否被节点遮挡 |
| 语义检查 | 职责是否正确,箭头含义是否一致,异常路径是否完整,是否有资料依据 | 预留成功但订单保存失败,谁负责释放库存 |
前一类问题可以通过渲染与布局调整解决;后一类必须结合业务规则和实现证据判断。再整齐的支付状态图,也不能替代对重复通知、迟到成功和补偿失败的设计。
先生成事实表,再生成图
“帮我画一个电商架构”给模型留下了过多自由。它可能补出推荐服务、库存中心、Kafka 和 Redis,却没有说明这些组件是否存在。
更可靠的流程是:
- 确认读者、场景、范围、现状 / 目标和图层级。
- 从需求、代码、接口、DDL、部署配置与 trace 提取事实。
- 对关系标注证据,并区分推断和未知。
- 定义权威数据源、不变量、状态和失败语义。
- 生成合适的图源并执行渲染。
- 检查布局,再检查跨图一致性。
- 人工确认后纳入版本管理。
| 图中事实 | 可参考的证据 | 证据不能自动证明什么 |
|---|---|---|
| 模块依赖 | import、构建配置、依赖分析 | 实际运行时完整路径 |
| 接口关系 | OpenAPI、客户端代码、服务契约 | 请求一定发生或没有超时 |
| 数据模型 | DDL、迁移文件、持久化代码 | 所有业务不变量都由数据库保证 |
| 部署结构 | IaC、工作负载与环境配置 | 实际容灾恢复能力 |
| 运行路径 | 日志与 trace | 未采样路径不存在 |
自动生成的图应附一张关系与来源的对应表,说明每条关键关系依据哪份资料。现状图要有实现证据;目标图要标明设计意图,不能让读者误以为已经落地。
以本文的目标设计为例,先把三个输入约定交给 Agent:订单保存成交快照;只有符合条件的待支付订单才接受支付成功;已取消订单收到迟到成功时进入核对与补偿。由此形成的事实表可以是:
| 编号 | 元素 / 关系与含义 | 来源与确定程度 | 对应视图 |
|---|---|---|---|
| F1 | 订单应用保存 order_amount、币种、订单行和成交快照 |
本文“电商案例”的教学假设,不是实现证据 | 边界、结构、数据 |
| F2 | 支付确认须检查订单可接受性及金额币种,再原子推进 | 本文“状态机”的转换规则,作为目标设计约束 | 时序、状态 |
| F3 | 已取消订单收到迟到成功后仍保持取消,记录核对与补偿任务 | 本文案例约定,作为目标设计约束 | 时序、状态、补偿 |
| Q1 | 退款接口是否幂等、补偿任务是否持久化、谁响应失败告警 | 待确认;需要接口、存储设计和责任人资料 | 补偿、数据、可观测性 |
这张表不把模型的推演伪装成现状。F1–F3 可以用于生成目标图,Q1 必须保留为缺口;不能因为画出了“退款重试”,就声称当前系统已经具备可靠恢复能力。对于真实系统,把这里的章节依据替换成实际资料的位置和版本。
一份可以复用的提示词
1 | 你是我的方案建模助手。 |
提示词中的异常集合来自本电商案例,不是模型应为所有系统自动套用的模板。换成搜索、结算或仓储系统时,应换成相应的不变量与失败条件。
增量修改,避免每轮重新生成
假设初稿只画了“支付成功 → 已支付”,人工评审对照 F3 后发现漏掉了订单已取消的情况。此时无需重画整套架构,可以给出一次有边界的修改请求:
1 | 保留已确认的节点 ID、位置和关系。 |
修改后的验收不能只看“多了一条箭头”:
| 核对位置 | 本轮应看到的变化或保持项 |
|---|---|
| 时序 | 支付成功通知之后按订单状态分支,已取消路径不触发履约 |
| 状态 | 保留取消终态,不新增 Cancelled → Paid;将核对与补偿标为后续处理 |
| 数据依据 | 用成交快照核对金额币种,保留支付事实;不能用最新报价覆盖历史金额 |
| 补偿与缺口 | 记录任务及幂等恢复要求,保留 Q1,未确认前不宣称已实现自动退款 |
| 未受影响的图 | 边界与结构没有变化,不为凑齐六类而重新生成 |
前文的时序分支、取消状态注释和补偿说明就是这轮修改应相互对照的结果。这样,读者验收的是业务规则如何落实到图中,而不只是画布是否整齐。
这种方式有助于保留手工调整,但仍需检查 Agent 有没有误改其他节点或连线。多人使用同一画布时,要约定谁正在修改哪张图,避免互相覆盖;结构修改前先导出场景,再保存快照。
mcp_excalidraw 默认将画布状态保存在内存中,服务重启后不能依赖它恢复图。配置 EXCALIDRAW_DATA_DIR 可以启用本地持久化,恢复场景、图片资源和命名快照;未开启持久化时,服务内的快照也不能代替磁盘文件。正式交付仍应导出 .excalidraw,而不是把运行中的画布当作唯一备份。[22]
对于代码仓库,我建议把可编辑源文件、展示图和简短说明放在一起:
1 | diagrams/ |
README 记录图的用途、现状或目标版本、资料依据、待确认问题、负责人和更新时机。评审时既看渲染结果,也看“新增了哪些节点或关系”的变更说明;不能只审查场景 JSON 中的坐标差异。
如果图要进入 Obsidian,则按插件格式导出 .excalidraw.md。该项目支持根据文件扩展名导出这种格式,它与普通 Markdown 中嵌入一张 PNG 不同,仍然保留可编辑场景。[22]
本地绘图不等于端到端数据留在本地
官方 draw.io MCP 文档区分了托管 MCP、自托管和本地插件的数据路径:托管 MCP 会接收图数据,本地插件可以本地保存与导出。文档也提醒,远程大模型是独立的数据处理环节。[25]
mcp_excalidraw 的核心绘图运行在本地,但画布网页会加载 CDN 字体,share 命令会上传加密场景并生成分享链接;服务默认只监听回环地址,API 本身没有内置认证,不应直接暴露到公网。[22]
因此,处理敏感生产图时,要分别检查模型、MCP、渲染器、字体资源、日志、持久化目录和分享出口。公司源码、客户信息、密钥与真实生产日志应遵循组织的数据分类要求。画布运行在 localhost,只说明画布服务的位置,不代表整个流程没有外部数据传输。
从下一份方案开始,把规范变成习惯
不建议第一次就制定几十页标准。先选一份真实方案,建立一个最小图集,再从评审反馈里补规则。
| 方案场景 | 建议的最小组合 | 何时追加 |
|---|---|---|
| 普通 API / 功能改造 | 范围图 + 关键时序 + 受影响数据或状态 | 跨团队时补边界;规则复杂时补活动图 |
| 下单 / 支付 / 退款 | 边界 + 结构 + 时序 + 状态 + 数据 + 补偿(跨服务时) | 事件拓扑、回调安全及观测按风险追加 |
| 系统拆分 / 拆库 | 边界 + 依赖 + 目标结构 + 迁移回滚 | 补契约兼容、故障域与验证指标 |
| 高可用 / 基础设施 | 部署 + 网络 + 失败恢复路径 | 补容量、RPO/RTO 与演练证据 |
| 事故复盘 | 时间线 + 故障链路 + 受影响状态 | 补根因证据与改进验收 |
对本文的下单与支付案例,可以优先掌握六类高频视图:边界、结构、时序、状态、数据和补偿。它们分别说明责任、组成、协作、合法变化、业务事实和失败恢复,不要求每次交齐六张图。
部署、网络、安全、可观测性与迁移等视图根据方案风险追加;在基础设施或迁移方案中,它们也可能成为主视图。重点与简述是本文的阅读安排,不是图类型的重要性排名。
交付前,用下面的清单自查:
- 图是否回答了一个明确问题,而不是展示“所有东西”?
- 名称、层级、范围与现状 / 目标是否清楚?
- 节点负责什么、关键数据由谁管理,是否清楚?
- 箭头是否有单一含义,图例能否独立解释?
- 正常、失败、未知和补偿路径是否有去向?
- 时序、状态、数据和架构视图是否互相矛盾?
- 事实、推断与假设是否区分,有没有来源?
- 图是否可读,图源能否找到,变更由谁维护?
代码评审可以继续结合 工程评审清单:架构、设计、代码与上线检查,核对实现是否遵守图中已经确认的边界与规则。
本文的 24 个电商范例 SVG 与同名 .mmd 图源位于站内 /diagrams/07-engineering-diagrams-ai-workflow/,可从 系统上下文图源、支付时序图源、迁移图源 开始复用。图源是示例,不是可直接用于生产的完整规格。
最终要形成的不是一种固定画风,而是一套工作习惯:按问题选图,统一名称和关系,保留资料依据,并随方案变更更新图源。 AI 可以帮助起草、渲染和修改;工程师仍要确认图表达的设计是否正确、风险是否可以接受。
参考资料
以下官方文档与项目资料的访问日期为 2026-10-10,补充核验日期在对应条目中另行标注。文中的电商图、最小图集和提示词为本文构造的实践示例,不是来源提供的生产架构。
- Simon Brown,C4 model,Diagrams。
- arc42,Building Block View;并参阅 Runtime View 与 Deployment View。
- Simon Brown,C4 model,Notation。
- PlantUML 项目,Supported UML and Non-UML Diagrams 与 Use Case Diagram。
- Object Management Group,Business Process Model and Notation 2.0.2。
- Alberto Brandolini / EventStorming,EventStorming。
- Context Mapper,Context Map。
- Simon Brown,C4 model,Container Diagram;Container 的运行时边界(后者补充核验于 2026-10-12)。
- Mermaid 项目,About Mermaid。
- Chris Richardson,Transactional Outbox。
- Chris Richardson,Saga。
- Simon Brown,C4 model,Deployment Diagram。
- OWASP Foundation,Threat Modeling Cheat Sheet。
- OpenTelemetry 项目,Signals。
- Cathryn Lavery,Diagram Design。
- draw.io,Save a Diagram in Various Formats。
- Structurizr,DSL。
- D2 项目,D2 Tour。
- coleam00,Excalidraw Diagram Skill。
- Excalidraw Diagram Skill,Element Templates。
- Excalidraw Diagram Skill,JSON Schema Reference。
- yctimlin,Excalidraw MCP Server, CLI and Agent Skill。
- Excalidraw,Excalidraw MCP App Server。
- Axton Liu,Obsidian Visual Skills Pack。
- draw.io / JGraph,Official draw.io MCP Server。
- robonuggets,Excalidraw Skill for Claude Code。配套 MCP 依赖、视觉规则、截图检查与导出流程。
- Rob Taylor,Excalidraw Diagrams。Python 图形构建器、原生图源生成及使用要求。
- tt-a1i,Archify;Skill 定义。技术图类型、结构化图源、交互式 HTML 与仓库证据工作流。
- Agents365-ai,drawio-skill。代码 / IaC / Schema 提取、原生图源、增量同步与导出能力。
- Bybit,svg-diagram。纯 SVG 绘图规范与 Node.js 校验器。
- imxv,Pretty Mermaid。Mermaid 主题、批量渲染及 SVG / PNG / 文本导出。
- aetox-skills,senior-architect-agent。现有系统检查、证据映射、架构评估与 Mermaid 文档。
- Vijay Joshi,EA Agent Skills。C4、能力地图、ADR、技术债与架构评审技能。
- Ztsdut,ML Architecture Diagram Skill。模型计算路径、架构 IR 与可编辑科学图输出。
- Leonardo Capossio,hdldiagZero。硬件模块、时钟域、总线图与 SVG 几何校验。
- Naor Sabag,OpenHop。YAML 流程规格、代码讲解 Skill 与逐步交互演示。
- bnomei,Nereid。Mermaid 终端工作台、MCP 与会话持久化;采用非商业源码可见许可,使用限制见仓库 LICENSE。