依赖巡检先识别循环再计算关键路径
依赖巡检先识别循环再计算关键路径
关键路径、启动顺序和不少动态规划计算都要求输入是 DAG。配置中的依赖关系却未必满足这一条件:临时路由、录入错误或双向依赖都可能形成环。巡检程序不应假设输入正确,更不能在检测到环后擅自删除一条边继续计算。
Kahn 算法适合做前置校验:处理完成的节点数少于总节点数,就说明图中有环或存在不一致数据。此时应返回未处理节点、相关边和数据来源,交由服务负责人确认。若要定位环的组成,可再运行强连通分量算法。
func isDAG(total, processed int) error { if processed != total { return fmt.Errorf("依赖图包含环或缺失节点:已处理 %d/%d", processed, total) } return nil }图较大时,避免递归 DFS 造成栈增长;可使用显式栈或 Kahn 队列。还要限制单次巡检的节点数、边数和运行时间,并对异常输入给出可诊断错误。
通过 DAG 校验后,才根据业务定义计算最长路径。边权表示启动耗时、优先级还是故障传播成本,会决定状态转移式,不能混用。验证至少包含无环图、自环、多个环、孤立节点和重复边;动态变化的依赖图则需要基于一致快照计算并标明快照时间。
