系统交互序列图:一套能真正画清楚业务调用链的理解框架

作者:用户提供草稿 整理时间:2026-03-30 10:57:36 CST 来源:用户提供长文草稿 主题:把序列图重新理解为“一次具体请求的动态轨迹”,并给出判断场景、筛选角色、组织主链路与补充异常分支的一套实用方法。 配图:本文补充了 2 张结构化插图,用于可视化“序列图真正回答的问题”与“可复用的六步提问法”。

核心结论

序列图不是在画“系统里有哪些组件”,而是在画:

一次具体请求,是怎样按时间顺序在不同角色之间流转并完成的。

它回答的核心问题只有一个:

谁在什么时刻,调用了谁,做了什么,最后怎么返回。

所以,序列图的本质不是“静态结构展示”,而是“动态交互展开”。

如果把架构图理解为“地图”,那么序列图更像是:

一段请求在系统中的行走轨迹。

序列图最容易画偏的根源,不是不会画,而是没先想清楚“这张图到底在回答什么问题”

很多人画序列图时,一上来就堆组件、连箭头,最后图越画越乱。 根本原因通常不是工具不会,而是没有先限定场景。

序列图一次只应该讲清楚一个具体场景,例如:

  • 用户登录
  • 查询客户信息
  • 提交订单
  • 支付回调
  • 调用大模型生成报告
  • 审批流程发起

一张图里如果同时混入“登录、注册、找回密码”,或者“查询、修改、同步、回调”,就很容易失控。

序列图最重要的第一步,不是画,而是先用一句话定义:

这张图到底在描述哪一次交互。

理解序列图,先抓住两个维度:横向看角色,纵向看时间

序列图之所以比流程图更适合表达系统调用,是因为它天然把两件事同时展开了:

横向:有哪些参与者

也就是这次交互里,真正参与调用的对象是谁。 常见包括:

  • 用户
  • 前端
  • API 网关
  • 认证服务
  • 业务服务
  • Redis
  • MySQL
  • MQ
  • ESB
  • 第三方系统
  • 文件服务

纵向:时间是如何推进的

从上到下,就是事件发生的先后顺序。

所以读序列图时可以始终用一句话去理解:

左边看谁参与,下面看谁先谁后。

序列图里最核心的,不是符号本身,而是“调用关系”与“分支条件”

初学时不需要记太多 UML 术语,先抓住最常用的几个元素就够了。

参与者

图顶端一列一个,表示本次交互里的角色。

消息箭头

表示谁调用了谁。 箭头方向非常关键:

谁发起调用,箭头就从谁指向谁。

返回结果

表示调用结束后结果返回。很多工具里会用虚线表示。 但不是每个返回都必须画,通常只画关键返回。

激活条

表示某个参与者正在处理任务。 这是增强可读性的手段,不是初学阶段的重点。

条件分支、循环、异常

这是序列图真正开始接近现实系统的地方。 现实系统很少是一路直线跑到底,往往包含:

  • 缓存命中 / 未命中
  • Token 有效 / 无效
  • 数据存在 / 不存在
  • 库存充足 / 不足
  • 成功 / 失败
  • 超时 / 重试

没有这些分支,图就容易显得过于理想化。

判断一张序列图有没有画对,关键不在“全不全”,而在“准不准”

很多人以为图里画得越多越专业,其实恰恰相反。

好的序列图不是“把所有组件都画进去”,而是:

只保留这次交互真正需要的角色。

例如用户查询一个业务数据,真正重要的可能是:

  • 前端
  • 网关
  • 认证服务
  • 业务服务
  • Redis
  • MySQL
  • 外部系统

而不是把 Nacos、K8s、Prometheus、日志平台、CI/CD 都强行塞进来。

序列图的价值不在于“系统全景”,而在于:

这次请求是如何真实运行的。

一张可用的序列图,通常都可以还原成一段很清晰的文字叙述

如果你没法先把流程说清楚,图大概率也画不清楚。

一个很实用的方法是: 在画图之前,先把场景写成 5 到 8 句话。

例如“用户查询客户报告”:

  1. 用户在前端点击查询
  2. 前端向网关发请求
  3. 网关先做认证校验
  4. 认证通过后把请求转给报告服务
  5. 报告服务先查 Redis
  6. 未命中则查 MySQL
  7. 必要时调用文件服务补充信息
  8. 结果回写缓存并返回前端

只要这几句话顺了,图基本就能顺着画出来。

所以真正稳妥的顺序永远是:

先写文字,再画箭头。

企业系统里的序列图,最常见的套路其实非常固定

很多业务场景虽然名字不同,但调用骨架非常相似。 常见模式大概就是这几层:

入口层

  • 用户
  • 前端
  • API 网关

控制层

  • 认证服务
  • 权限校验
  • 路由转发

业务层

  • 订单服务
  • 报告服务
  • 授信服务
  • 客户服务

资源层

  • Redis
  • MySQL
  • MQ
  • 文件服务
  • 第三方系统
  • ESB

也就是说,很多图本质上都是在回答:

一个外部请求进入系统后,如何穿过入口层、业务层和资源层,最后把结果带回来。

在企业系统里,最常见的一类序列图其实是“先认证,再执行业务,再按分层策略取数”

这是最值得形成套路感的地方。

以“查询客户授信信息”为例,常见链路就是:

  1. 用户在前端发起请求
  2. 前端带 Token 调用网关
  3. 网关调用认证服务校验身份
  4. 认证通过后,请求转给授信服务
  5. 授信服务先查 Redis
  6. Redis 未命中,再查本地 MySQL
  7. 本地数据不存在或失效,再通过 ESB 调用核心系统
  8. 核心系统返回结果
  9. 授信服务落库、回写缓存
  10. 结果逐层返回前端

这个模式其实能覆盖大量真实业务。

它背后的系统思想也很清晰:

  • 能从缓存拿,就不要查库
  • 能从本地库拿,就不要频繁打外部系统
  • 实在没有,再走跨系统调用

这不是画图技巧,而是很多企业系统的真实运行逻辑。

Redis、MySQL、ESB、MQ 这些东西之所以常出现,不是因为它们“高级”,而是因为它们承担的角色不同

Redis 的意义是“快”

它通常承担的是热点数据缓存、临时状态保存、限流状态、会话信息等能力。

在序列图里,Redis 常常意味着:

系统在优先尝试更低成本、更高速度的取数方式。

MySQL 的意义是“准”

它通常是业务主数据的权威来源,是系统正式保存数据的地方。

在序列图里,MySQL 出现,通常代表:

系统开始触达持久化主数据。

ESB 的意义是“跨系统协同”

不是所有调用都要经过 ESB。 通常只有在跨域、跨系统、调用老系统/核心系统时,ESB 才会出现。

所以 ESB 是否该画,不取决于“企业里有没有 ESB”,而取决于:

这次交互是否真的经过了它。

MQ 的意义是“异步解耦”

很多主流程之外的事情,比如:

  • 审计日志
  • 消息通知
  • 行为留痕
  • 指标统计
  • 后续异步任务

不适合同步阻塞主流程,就会交给 MQ。

所以在序列图里,MQ 往往意味着:

系统不是把所有事情都同步做完,而是在把主流程和旁路任务拆开。

Nacos、K8s、Nginx 这些东西不是不重要,而是大多数业务序列图里它们不是主角

这是一个很容易混淆的点。

很多人因为知道这些组件很重要,于是画图时总想加进去。 但要分清:

  • 业务交互图画的是请求如何流转
  • 部署架构图画的是服务如何部署与运行
  • 基础设施图画的是底座能力如何支撑

所以:

  • Nacos 主要是服务注册发现、配置管理
  • Kubernetes 主要是容器调度与编排
  • Nginx 往往属于入口接入层实现细节

它们当然很重要,但如果这张图描述的是“用户查询授信信息的业务调用链”,那它们通常不是主角。

也就是说:

不画它们,不代表它们不存在;只是这张图表达重点不在它们。

画序列图最稳的方法,不是追求一步到位,而是“先主流程,再补异常”

这是非常实战的一条经验。

很多人一开始就试图把所有异常、重试、回滚、超时、降级、幂等全塞进去,结果图直接爆掉。 更稳妥的方法是分两步:

第一步:先画成功主链路

只回答:

  • 请求从哪来
  • 经过谁
  • 主业务谁处理
  • 查了哪些资源
  • 最后怎么返回

第二步:再补关键异常

例如:

  • Token 失效
  • 缓存未命中
  • 数据不存在
  • 外部接口失败
  • 超时重试
  • 库存不足
  • 权限不足

这样画出来的图不仅更稳,也更容易给别人讲清楚。

一个真正能复用的思维模板,不是 Mermaid 语法模板,而是“六步提问法”

以后拿到任何一个功能场景,都可以先问自己这六个问题:

1. 谁发起请求

是用户、前端、第三方系统、定时任务,还是内部系统?

2. 请求先到哪

是前端、网关、ESB,还是某个接入层服务?

3. 谁是主处理服务

到底是认证服务、订单服务、报告服务,还是某个中台服务在执行业务主逻辑?

4. 它依赖哪些下游

是否要查 Redis、MySQL、文件服务、MQ、第三方系统、核心系统?

5. 中间有没有关键分支

例如认证通过/失败、缓存命中/未命中、本地有数据/无数据、下游成功/失败?

6. 最后怎么返回

是同步返回页面结果,还是发 MQ 异步处理,还是回调另一个系统?

只要这六个问题能回答清楚,图基本就能画出来。

适合用序列图表达的,不是“系统长什么样”,而是“系统怎么跑起来”

序列图特别适合以下场景:

  • 登录认证
  • 查询详情
  • 提交订单
  • 支付回调
  • 文件上传
  • 审批提交流程
  • 第三方接口调用
  • MQ 异步通知
  • AI 调用链路
  • 缓存读写流程

而如果你想表达的是:

  • 整体系统结构
  • 模块分层关系
  • 状态迁移
  • 完整业务流程节点

那很多时候用架构图、状态图、活动图、流程图会更合适。

所以可以记一句非常稳的话:

序列图专门回答“谁按什么顺序调用了谁”。

Mermaid 只是表达工具,真正决定图质量的是你是否抓住了“真实业务调用链”

Mermaid 很方便,因为它适合快速把逻辑写成图。 但要注意,Mermaid 只是载体,不是核心。

真正决定一张图是否好用的,不是:

  • 配色漂不漂亮
  • 是否用了激活条
  • 箭头是否足够复杂

而是:

  • 参与者是否真实
  • 顺序是否准确
  • 分支是否合理
  • 抽象层级是否统一
  • 这张图是否只讲清楚一件事

所以,序列图最终是工程思维问题,不是排版问题。

一个序列图高手和一个新手,真正的差别通常不在画法,而在抽象能力

新手常见问题是:

  • 什么都想画
  • 所有组件都想保留
  • 一张图想解释整个系统
  • 把业务问题、部署问题、基础设施问题混在一起

而更成熟的画法通常表现为:

  • 一图一事
  • 只保留本次交互真正相关的角色
  • 主流程先清楚
  • 异常补得适度
  • 让别人能顺着图把故事讲出来

也就是说,真正好的序列图不是“复杂”,而是:

复杂系统中仍然保持表达克制。

一条很值得记住的判断标准:序列图画得好不好,看别人能不能顺着它把一次请求讲明白

如果别人看完你的图,能自然说出类似这样的话:

“用户从前端发请求到网关,网关先做认证,认证通过后转给业务服务,业务服务先查缓存,没命中再查库,必要时再走 ESB 调核心系统,最后把结果缓存并返回前端。”

那这张图大概率就是合格的。

如果别人看完只能说:

“这里有很多系统和箭头。”

那图就大概率没有真正讲清楚交互。

可直接复用的 Mermaid 基础模板

sequenceDiagram
    participant U as 用户/调用方
    participant F as 前端/调用系统
    participant G as API网关
    participant A as 认证服务
    participant B as 业务服务
    participant R as Redis
    participant D as MySQL
    participant E as ESB
    participant X as 外部系统
    participant M as MQ

    U->>F: 发起业务请求
    F->>G: 请求接口 + Token

    G->>A: 校验身份/权限
    alt 认证通过
        A-->>G: 通过
        G->>B: 转发业务请求

        B->>R: 查询缓存
        alt 缓存命中
            R-->>B: 返回缓存结果
        else 缓存未命中
            R-->>B: 未命中
            B->>D: 查询本地数据
            alt 本地数据有效
                D-->>B: 返回本地数据
            else 本地无数据或失效
                D-->>B: 无有效数据
                B->>E: 调用ESB
                E->>X: 调用外部系统
                X-->>E: 返回结果
                E-->>B: 返回标准化结果
                B->>D: 保存/更新数据
                D-->>B: 保存成功
            end
            B->>R: 回写缓存
            R-->>B: 回写成功
        end

        B->>M: 发送异步消息/日志
        M-->>B: 发送成功

        B-->>G: 返回业务结果
        G-->>F: 返回响应
        F-->>U: 展示结果
    else 认证失败
        A-->>G: 拒绝访问
        G-->>F: 返回未认证/无权限
        F-->>U: 提示失败
    end

最后固化成一句自己的画图原则

序列图不是为了展示“我系统懂得很多”,而是为了把一次请求的真实运行路径讲清楚。

可以把原则压缩成这四句:

先定场景,再列角色。 先写文字,再连箭头。 先画主线,再补异常。 谁真参与,谁才上图。

一句话回收

序列图的本质,不是系统全景,而是一次请求在系统中的动态轨迹。