Skip to content

🧠 核心原理

MeshFlow 的核心目标是将复杂的异步联动转化为确定的原子更新。为了实现这一目标,引擎底层依赖四大核心机制。

1. 层级拓扑引擎 (Layered DAG)

解决痛点:钻石依赖导致的重复计算

在复杂的依赖网格中,经常会出现“钻石依赖”结构:节点 A 同时影响 B 和 C,而 B 和 C 又共同指向 D。在传统的监听模式下,A 的变动会导致 D 被触发两次。

实现逻辑

MeshFlow 在节点注册阶段会构建一个 有向无环图 (DAG),并对所有节点进行 层级排序

  • 深度分析:统计每个节点在拓扑序里的层级。
  • 层级执行:引擎确保只有在第 N 层的所有节点计算完成后,才会开始第 N+1 层的计算,避免节点抢跑

结果:无论依赖路径多复杂,D 永远只会在 B 和 C 都准备好后,执行一次“原子更新”。

2. 水位线调度 (Watermark)

解决痛点:复杂拓扑中的“版本失步”

在拓扑计算中,节点往往拥有多个上游。当部分上游触发异步更新,而另一部分上游保持静默时,下游节点如何判断当前各个上游的数据是否已经“对齐”到同一个逻辑周期?

实现逻辑:逻辑时钟与提交拦截

MeshFlow 引入了基于逻辑周期的水位线机制:

  1. 逻辑时钟同步:每当根节点触发变更,引擎会检查 Watermark水位线。水位深度会随拓扑路径向下游传播,作为该次变更的“合法身份证明”。
  2. 状态可信度校验:阻塞与等待:如果某个上游节点处于“计算中”且水位未对齐,下游节点将保持挂起状态,直到所有依赖项的有效性得到确认

结果:彻底解决了“脏读”问题。确保每个节点在执行 logic 回调时,其获取到的上游数据在逻辑时间轴上是完全对齐的。

3. 智能变更追踪 (Smart Change Tracking)

解决痛点:冗余计算与无效传播

在大型网格中,并非每次上游变动都需要下游重新执行逻辑。如果 $A$ 变了但 $B$ 的计算结果没变,那么 $B$ 之后的所有下游都不应该被触发。

实现逻辑:记忆化与自动剪枝

MeshFlow 引入了高效的“桶计算”与路径截断机制:

  • 惰性求值 (Memoization):通过比对输入特征桶(Input Buckets),仅在依赖项发生实质性变更时才触发 logic 重算。
  • 变更剪枝 (Pruning):即便节点处于受影响路径上,若其计算结果未通过有效性检查(即输出未改变),引擎将自动截断该路径,停止向下游传播。

结果:实现了真正的“计算最小化”,确保每一度 CPU 算力都花在必要的逻辑变更上。

4. 实时环路熔断 (Cycle Detection)

解决痛点:逻辑死循环

在手动编写联动时,很容易出现 A -> B -> A 的死循环,导致浏览器崩溃。

实现逻辑

引擎在 SetRule 建立连接的瞬间,会以该路径为起点进行一次一次 $O(V+E)$ 复杂度的深度优先搜索(DFS):

  • 静态检测:在节点定义阶段而非运行阶段识别环路。
  • 即时报错:一旦检测到路径闭环,立即抛出清晰的路径追踪错误,防止非法逻辑进入生产环境。