边的含义决定价值
依赖图的价值取决于边的语义。一条边可以表示「编译依赖」「运行时调用」「读取数据」或「一同部署」,每种含义回答的问题都不同。把它们混进一张无向图,得到的只是好看却无法解释的示意图。画线之前,先给边命名。
构建图、运行时图与数据图
构建图来自包清单和 import 语句;运行时图来自链路追踪、服务网格遥测或网络流日志;数据图来自数据血缘元数据。它们有重叠但并不相同:一个库可以是构建依赖却从未在运行时被调用,一个服务也可能调用了别人却从未声明。要按问题选择对应的图。
影响分析
变更之前,沿图向前走:哪些服务依赖即将修改的组件,它们的关键程度如何?故障期间,沿图向后走:出故障的组件依赖了什么?例如,修改事件表的 schema 看似风险很低,直到图上显示有四个下游消费者,其中两个还没有负责人。
让图保持诚实
依赖图比示意图腐烂得更快,因为它宣称精确。每次部署都重建图,把推断出的边标记为推断,并记录每条边最后一次被观测到的时间。对在既定窗口内未出现在遥测中的边应当删除,但要保留归档,以便解释历史决策。
与架构图的对比
架构图向人传达意图,依赖图支持机器查询。架构图说「订单会调用支付」,依赖图回答「如果支付不可用十分钟,三百个服务里哪些会受影响」。成熟团队两者都保留,并用同一个事实来源生成。