时序图 vs 流程图:什么时候该画时序图?(判断规则 + 典型例子)
讲清时序图(UML 序列图)与流程图的核心区别:什么时候用时序图、什么时候用流程图,以及两者如何配合交付更清晰的需求/设计/测试材料。附判断清单、反例修正与常见问题。
先给结论:你在回答的问题不一样
如果你只记一句话:
- 流程图回答的是:“事情怎么走(步骤/分支/决策)”——把一个流程从开始到结束的节点画清楚。
- 时序图(UML 序列图)回答的是:“谁在什么时候对谁说了什么(交互/消息/调用顺序)”——把多个参与者之间的消息往来按时间顺序画清楚。
所以,“什么时候该画时序图?”其实等价于:
当你的问题核心是 多参与者交互、调用先后顺序、同步/异步、超时重试/回调、并发、边界与异常——流程图很难把这些讲明白时,就该用时序图。
接下来我会把判断规则讲得更可执行,并给你一套交付时的组合用法:流程图管“流程”,时序图管“交互”,两张图一起用,往往比单张图更省沟通成本。
你也可以用在线工具快速把文字交互变成规范图:手打时序图 - 时序图在线制作
一张对比表背后的本质差异(别只背结论)
很多文章会用表格对比“时序图 vs 流程图”,但真正能帮你做决策的是:你要表达的“信息结构”是什么。
1)表达目标不同:流程图是“状态迁移”,时序图是“消息往来”
-
流程图擅长表达:
- 业务步骤:A → B → C
- 决策分支:如果 X 就走 D,否则走 E
- 人工/系统混合步骤:填表、审核、回退
- “有没有走到某一步”的路径覆盖(测试很爱用)
-
时序图擅长表达:
- 参与者(Actor / 系统 / 服务 / 组件)之间的调用链
- 请求与响应的先后关系
- 同步 vs 异步(例如发消息、回调、事件驱动)
- 超时、重试、幂等、补偿等“交互侧”问题
一个很实用的判断:
- 如果你写的是“用户点击 → 页面跳转 → 提交表单 → 审核通过/拒绝”,流程图更直观。
- 如果你写的是“前端 → 网关 → 订单服务 → 支付服务 → 第三方支付 → 回调 → 风控 → 通知”,时序图更直观。
2)时间维度不同:时序图把“先后”当一等公民
流程图当然也有先后顺序,但它的顺序是“流程节点顺序”。
时序图的顺序是“消息在时间轴上的发生顺序”。这会带来两个关键能力:
- 你能清楚标出 谁先调用谁,以及每个参与者在何时处于活跃状态(Activation)。
- 你能表达流程图里很容易糊掉的情况:
- A 调用 B 后 并不等待,而是继续做别的(异步)
- B 的返回结果可能在 很久之后通过回调回来
- 并行分支真正的“并发”而不是“看起来分叉”
3)参与者视角不同:流程图弱化“边界”,时序图强调“边界”
流程图经常把“系统”当成一个整体:节点是“校验”“下单”“发货”。
时序图会逼你回答:
- 校验到底发生在哪个组件?前端?网关?服务端?
- 下单是订单服务做的,还是网关做的?还是调用了库存服务?
- 发货是谁发的?仓储系统?第三方?
这件事对研发/测试/架构非常关键:
- 研发需要知道“我负责的边界在哪,接口是什么”。
- 测试需要知道“哪个环节可控,哪个环节要 mock,异常怎么注入”。
- 架构需要知道“跨服务调用链长不长,有没有不合理耦合”。
什么时候该画时序图:8 条判断规则(能直接照着用)
下面这 8 条,建议你当成“开工前自检”。满足越多条,越该画时序图(至少补一张)。
规则 1:参与者 ≥ 3 个,而且每个都有明确职责
典型场景:前端、BFF/网关、业务服务、外部系统。
- 只有 1~2 个参与者?流程图或文字说明可能就够。
- 3 个以上且职责不同?时序图能把“谁对谁负责”画清楚。
规则 2:你需要回答“先后顺序会影响结果吗?”
例如:
- 必须先锁库存再下单?还是先下单再锁库存?
- 风控在支付前还是支付后?
- 先写库还是先发消息?
只要顺序影响结果(尤其是异常结果),时序图价值就很高。
规则 3:存在同步/异步混用、回调或事件驱动
流程图常见的误导是:
它看起来像“走一步下一步”,但现实中很多系统不是这样。
有下面任何一个关键词,就建议画时序图:
- 回调(callback / webhook)
- MQ / 事件总线
- 异步任务(job)
- 长轮询 / SSE / WebSocket
- 延迟队列 / 重试队列
规则 4:你需要把“失败怎么处理”讲明白
比如:
- 超时重试:谁重试?重试几次?间隔?是否幂等?
- 降级熔断:熔断发生在哪一层?返回给谁?
- 补偿:失败后是否要反向操作?谁负责触发补偿?
这些都属于交互协议的一部分。流程图可以有“失败分支”,但很难表达“失败发生在调用链的哪个位置”。
规则 5:你在写接口文档/联调说明/测试用例
面向“要落地的人”的材料(研发、测试、写文档的人)通常都需要回答:
- 请求从哪里发起?
- 经过哪些服务?
- 每一步的输入输出是什么?
- 哪些步骤可观测(日志/指标/trace)?
这其实就是时序图的强项。
规则 6:你需要表达“并发”或“竞争条件”
例如:
- 同一用户连续点击两次提交
- 同一订单被两个回调重复通知
- 同一库存被多笔订单争抢
流程图画并发很容易变成“分叉两条线”,但并发的关键是同时发生以及相互影响。时序图配合 par(并行片段)更清晰。
规则 7:跨团队/跨系统协作,需要对齐责任边界
只要你要跟别的团队对齐(支付、风控、物流、第三方平台),时序图往往是“对齐契约”的最短路径。
流程图更多是“我们内部怎么走”。时序图更像“我们和外部怎么说话”。
规则 8:你发现自己写了很多“然后/之后/接着”但仍然容易误解
当文字描述里出现大量:
- “然后 A 再去调用 B”
- “之后 B 会回调 A”
- “接着 A 再通知 C”
而读者还是问“先后顺序到底怎样?”——把它画成时序图,通常立刻清晰。
典型例子:同一个需求,用流程图和时序图分别怎么表达
这里用一个常见需求:“用户提交订单并支付” 来对比。
用流程图表达(适合产品/业务说明)
流程图会强调:
- 用户提交订单
- 系统校验参数
- 创建订单
- 进入支付
- 支付成功/失败分支
- 成功后发货/通知
这种表达对产品、运营、甚至写 PRD 很友好:你能快速看清“流程节点”。
但它天然会弱化这些关键问题:
- 创建订单时是否锁库存?
- 支付成功是“前端拿到结果”还是“回调确认成功”?
- 回调失败要不要重试?谁重试?
用时序图表达(适合研发/测试/联调)
时序图会强调:
- 前端 → 网关:创建支付
- 网关 → 订单服务:创建订单(返回订单号)
- 订单服务 → 库存服务:锁库存(失败则回滚)
- 前端 → 支付渠道:拉起支付
- 支付渠道 → 回调接口:通知支付结果(可能重复)
- 回调接口 → 订单服务:更新订单状态(幂等)
- 订单服务 → 通知服务:发消息
这张图基本能回答“你们到底怎么联调”的问题。
如果你希望把这些参与者、消息、激活条、组合片段(alt/opt/loop/par)快速拼出来,可以用这个编辑器:左侧点选生命线/消息/组合片段,右侧实时预览,最后一键导出 SVG/PNG/JPEG/draw.io,便于放进 PRD/技术文档/测试报告里:
常见误解:为什么你画的流程图“看起来对”,但研发/测试还是不买账
下面是我见过最常见的几类“沟通翻车点”。每一条都给出反例和修正方式。
误解 1:把“组件调用”当成“流程节点”
反例:流程图里一个节点写“调用支付服务”,下一步写“支付服务回调”。
问题是:
- 回调是支付服务主动发起的,还是由我们轮询拉取?
- 回调到哪个服务?网关?订单服务?回调服务?
- 如果回调重复,谁负责幂等?
修正:把“调用”从流程节点里拆出来,画时序图:明确参与者、消息方向、同步/异步。
误解 2:用流程图画“并发”,实际上是“顺序分叉”
反例:流程图分出两条线:一条“写订单”,一条“发消息”,看起来像并行。
但真实问题是:
- 两个动作是不是必须都成功?
- 先写库还是先发消息?
- 其中一个失败怎么办?
修正:用时序图 par(并行)或明确顺序;如果用事件驱动,画出消息队列参与者与消费顺序。
误解 3:只画“成功路径”,异常全靠脑补
反例:流程图从“支付成功”直接到“发货”,没有任何失败分支。
现实里最难的是:
- 超时
- 重试
- 回调丢失
- 重复回调
- 部分失败(库存锁了但支付没成功)
修正:至少用时序图把 3 类异常补齐:
- 调用超时(谁重试)
- 异步结果迟到(回调/事件)
- 重复消息(幂等)
误解 4:把“业务规则”混进“交互协议”导致边界模糊
反例:流程图写“校验库存”,但没说是“我们自己校验”还是“库存服务校验”。
修正:流程图里保留业务节点(校验库存/创建订单),时序图里明确“谁执行”。两张图分工明确。
推荐的交付方式:两张图怎么配合最省力
如果你在写 PRD / 技术方案 / 测试用例,我建议用下面这个组合:
- 一张流程图:讲清业务步骤、分支、人工节点(给产品/业务/新人看)
- 一张时序图:讲清参与者、消息、先后、异常(给研发/测试/联调看)
交付清单(拿来就能用)
流程图至少包含
- 起点/终点定义清晰
- 关键决策点(if/else)完整
- 业务口径一致(状态名统一)
- 人工步骤与系统步骤区分
时序图至少包含
- 生命线命名一致(系统/服务/组件不要混叫)
- 同步/异步消息用不同箭头区分
- 关键返回值/状态变更有标注(别全靠读者猜)
alt片段补齐主要分支(成功/失败/风控拦截等)loop表达重试(标清次数/条件)opt表达可选步骤(例如“如果开启风控则…”)- 有外部系统时,画清边界(第三方/回调方向)
场景拆解:3 个“应该用时序图”的高频业务
为了让判断更直观,这里给 3 个常见场景,你可以对照自己的需求。
场景 1:登录(验证码/失败重试/风控)
为什么流程图不够:
- 验证码可能来自短信服务(异步)
- 风控可能在多个点触发(登录前/登录后)
- 失败重试有次数与间隔
时序图里你可以明确:
- 前端、认证服务、短信服务、风控服务、用户服务的交互
alt:验证码正确/错误/过期loop:重试次数
场景 2:下单-支付-回调(超时/补偿/重复回调)
为什么流程图不够:
- “支付成功”往往不是前端结果,而是回调确认
- 回调可能重复,必须幂等
- 支付成功但发货失败需要补偿
时序图里可以补齐:
- 回调方向与签名校验
- 幂等键
- 失败重试与补偿触发者
场景 3:接口调用(超时/熔断/降级)
为什么流程图不够:
- 超时发生在哪一跳?客户端?网关?服务间?
- 熔断发生在哪一层?返回给谁?
时序图里可以画:
- 调用链中的每一跳
alt:成功/超时/熔断opt:降级逻辑
FAQ:时序图和流程图的常见问题(含踩坑提醒)
Q1:能不能只画流程图,不画时序图?
可以,但通常只适用于:
- 参与者少(1~2 个)
- 没有异步/回调
- 异常处理简单
- 不需要跨团队联调
一旦你要落到研发/测试,很多“默认假设”会让人反复追问。那时补画时序图反而更费。
Q2:能不能只画时序图,不画流程图?
也可以,尤其在纯技术沟通里。
但当你要让产品/业务快速理解全局,“一张流程图讲业务步骤”会更友好。时序图在非技术读者眼里可能信息密度过高。
Q3:流程图里已经有分支了,时序图还需要 alt 吗?
需要,原因是两者分支的“含义”不同:
- 流程图分支:业务路径
- 时序图
alt:交互条件(在什么条件下,发生哪组消息)
如果你只在流程图里写“支付失败”,却不在时序图里画“失败发生在哪一步”,研发和测试仍然不知道如何处理。
Q4:时序图要画到什么粒度?画太细会不会维护成本高?
建议按“读者是谁”定粒度:
- 给联调:画到接口级(URL/方法/事件名)
- 给内部评审:画到服务级(订单服务→库存服务)
- 给产品:画到系统级(App→后端→第三方)
不要把“每个内部函数调用”都画进去。时序图的目标是对齐协作边界与关键协议,不是画代码执行栈。
Q5:我画的时序图总是很乱,有没有快速整理方法?
有三个非常实用的整理策略:
- 先列生命线,再补消息:先确定参与者(用户/前端/网关/服务/第三方),不要边画边加。
- 用组合片段收拢复杂度:
alt收拢分支loop收拢重试opt收拢可选步骤par收拢并行
- 把“异常”当作第一等公民:异常路径单独用
alt分出来,不要用注释糊过去。
如果你嫌排版麻烦,建议直接用可视化编辑器:左侧点选生命线/消息/组合片段快速搭结构,右侧实时预览随时校对;需要放文档时导出 SVG/PNG/JPEG;要继续加工就导出 draw.io 交给团队二次编辑。
工具入口(带文章追踪参数):手打时序图 - 时序图在线制作
最后一段:把“画图”当成对齐成本,而不是仪式
画流程图不是为了“看起来专业”,画时序图也不是为了“UML 正统”。它们的价值只有一个:减少误解,降低返工。
- 当你在对齐“业务路径”时,用流程图。
- 当你在对齐“交互协议与责任边界”时,用时序图。
把这两张图配合起来,你会发现很多争论根本不需要吵:图一画,问题自己就暴露出来了。
加餐:再给你 3 个“画错了就会返工”的反例(以及怎么改)
很多团队不是不会画图,而是画出来的图无法支撑落地:研发拿着没法实现、测试拿着没法设计用例、文档放进去读者看不懂。下面 3 个反例非常典型,你可以对照自己的图做一次自查。
反例 A:流程图把“接口协议”省掉,只剩业务词
常见画法:
- 节点写“校验参数”“创建订单”“调用支付”“更新状态”
问题:
- “校验参数”到底谁校验?前端校验还是后端校验?失败返回码是什么?
- “调用支付”是同步下单还是先拿预支付单?是否有签名?
- “更新状态”由谁触发?前端回传?回调确认?还是消息消费?
怎么改:
- 流程图继续保留这些业务节点 流程图在线制作 - AI生成 | 自动排版,但补一张时序图:把关键节点对应的接口/事件/回调补齐。
- 时序图里把每条关键消息至少标出:方向(谁→谁)/消息名/关键入参/关键返回值或状态变化。
反例 B:时序图只画“调用链”,不画“条件与异常”
常见画法:
- 从 A 到 B 到 C 一路同步调用,看起来很顺,但没有任何
alt/opt/loop。
问题:
- 真实系统里异常比成功更复杂:超时、重试、降级、回调失败、重复消息……
- 你不画,评审时就会出现“默认假设不同”:有人以为会重试,有人以为不会;有人以为失败要回滚,有人以为允许最终一致。
怎么改:
- 至少补三类
alt分支:- 关键失败(例如支付失败/库存不足/风控拦截)
- 技术失败(超时/网络错误/服务不可用)
- 重复与迟到(重复回调/重复消息/迟到回调)
- 把“重试”用
loop表达,并写清触发条件与上限(次数/间隔/是否指数退避)。
反例 C:流程图和时序图“说的不是同一件事”
常见画法:
- 流程图写“支付成功→发货”,但时序图里支付成功后没有任何通知/消息,或者发货由另一个系统触发。
问题:
- 两张图的口径不一致,读者会不知道该信哪张;更糟的是,后续维护的人会用错误的图做决策。
怎么改:
- 给每个“关键业务节点”建立映射:流程图的节点,对应时序图里的哪一段消息片段。
- 在时序图里用注释或片段标题标出:“这里对应流程图的【创建订单】节点”。
- 保持术语一致:同一个系统/服务/状态,不要在两张图里用不同名字。
评审用检查清单:这张图能不能作为交付物?
你可以在评审时直接按下面清单过一遍(特别适合架构评审、接口评审、测试评审)。
流程图评审(业务正确性)
- 起点和终点定义清晰(什么叫“完成/失败/取消”)
- 决策条件可判定(不是“视情况而定/可能/大概”)
- 每条分支都能走到某个终点(避免“悬空路径”)
- 业务状态、字段名、口径与 PRD/接口文档一致
- 人工步骤与系统步骤有区分(避免把人工动作当系统自动)
时序图评审(可实现、可测试)
- 参与者边界清晰(哪些在本系统内,哪些是外部)
- 同步/异步表达正确(不要把异步画成同步等待)
- 每个关键调用都有对应的错误处理分支(至少覆盖超时/失败返回)
- 幂等点标清(回调/消息消费/重试入口)
- 重试策略明确(谁重试、最大次数、是否需要去重)
- 可观测性入口明确(关键日志、trace、指标建议落在哪一段)
文档落地(让别人用得起来)
- 图里出现的术语在正文里有解释(尤其是缩写和内部名词)
- 图的导出格式适配你的交付渠道:
- 放 PRD/技术文档:优先 SVG(清晰可缩放)
- 发群里快速对齐:PNG/JPEG
- 团队要二次编辑:draw.io
- 版本可维护:图和接口/状态变更的版本号或更新时间能追踪
很多人卡在“排版太费时间”。更现实的做法是:先用编辑器把结构搭出来——左侧点选生命线、消息、组合片段快速补齐;右侧实时预览检查对齐;最后按场景导出 SVG/PNG/JPEG 或 draw.io 给团队继续维护。对于需要快速起草的场景,还可以让 AI 先从你的文字描述生成初稿,再由你做口径校正。