Nx 智能分发机制(Nx Agents + Nx Cloud)
Nx 智能分发机制(Nx Agents + Nx Cloud)
阶段 | 关键做的事 | 作用 |
---|---|---|
1. 收集信息 | - Project Graph:解析整个 workspace 依赖关系(谁依赖谁) - 历史统计:每次 CI 结束后将每个任务的实际用时与缓存命中情况上传到 Nx Cloud | 获得带“权重”(预计耗时)的依赖 DAG |
2. 生成执行计划 | - 计算 critical path(最慢依赖链) - 用历史耗时为每个 task 估价 - 优先调度 会先执行阻塞下游的大任务 | 将总时长逼近「最长公共库 + 最慢应用」的理论极限 |
3. 声明式启动分发 | npx nx-cloud start-ci-run --distribute-on="15 linux-medium-plus-js" --stop-agents-after="e2e-ci" 主 job 做两件事: ① 解析后续所有 nx … 命令② 把它们提交给 Nx Cloud 调度器 | 你无需编写任务‑机器映射,仓库结构变化也不用改 CI 脚本 |
4. Nx Agents 执行 | - 每台 agent 启动后向 Nx Cloud 拉取「下一条最合适的任务」 - 调度器基于 耗时 + 依赖拓扑 实时分配,保证所有机器尽量满载 - 任务结果立即上传到远程缓存 | 以任务粒度(而非 VM 粒度)调度,最大化并发、最小化空闲 |
5. 动态自学习 & 弹性扩容 | - 跑几次后,历史数据更准确,计划不断微调 - 加 --dynamically-allocate-agents 后,Nx Cloud 会根据 PR 改动面自动决定启动多少台机器 | PR 越大机器越多,既省钱又保证最坏情形够快 |
为什么说它「智能」?
-
任务‑而非机器‑中心
传统做法要先把任务按机器分块写死在 CI 脚本里;Nx Agents 只关心“空闲 agent 数量”,依赖图 + 统计数据实时排程,仓库结构改变也不用改脚本。 -
历史耗时启发式调度
根据真实运行时间,Nx 把长任务尽早塞进队列、把短任务穿插其间,逼近“理论最短壁钟时间”。 -
自动拆分大任务
对 Playwright / Cypress E2E 测试,Nx 会在调度前把单一长任务切成多个 spec task,然后分派到多机并行。 -
动态扩缩容
当 PR 改动范围小,Nx 只拉少量 agent;改动大时自动扩容。
GitHub Actions 最小示例
jobs:main:runs-on: ubuntu-lateststeps:- uses: actions/checkout@v4with:fetch-depth: 0# 启动 Nx Cloud 分发,3 台中号 JS runner- run: pnpm dlx nx-cloud start-ci-run --distribute-on="3 linux-medium-js" --stop-agents-after="build"# 把任务交给 Nx Cloud 自动分派- run: pnpm exec nx affected -t lint test build
效果示例
在vsavkin/interstellar
示例仓库,同一套任务从 87 min → 9 min,仅靠上面一行配置实现。
与缓存的关系
方案 | 解决的问题 | 命中时表现 | 未命中时表现 |
---|---|---|---|
本地/远程缓存 | 平均值 | 直接复用结果,≈ 0 s | 仍需完整执行 |
智能分发 | 最坏值 | 由缓存决定 | 将执行时间压到理论最短壁钟时间 |
两者结合 | 稳定且极快 | ✅ | ✅ |
结论
Nx 的智能分发(Nx Agents + Nx Cloud)是一套基于 依赖图 和 历史统计数据 的自学习调度系统:
- 一句配置即可接入
- 自动计算关键路径并动态并行
- 动态把任务撒到多机并行
- 随仓库演化自行调整
让中大型 Monorepo 的 CI 从「数小时」压缩到「数分钟」