Uber 为加快 AI 时代的代码合并,放弃主干始终通过测试

原标题Uber traded an always-green trunk for faster AI-scale merges

合并队列放宽部分冲突限制,合并后再验证组合状态,并保留已验证的可用版本。

PDPreetam Dwivedi讲者 · UberMAManjari Akella讲者 · Uber
频道
AI Engineer
发布
2026年11月9日
视频
27:35
阅读
5 分钟
幻灯片
12
原文
英语
在 YouTube 打开
往下滚动阅读时,视频会缩到右下角继续播放。字幕跟随阅读语言。
阅读语言共 2 种语言可读
由 AI 从英语原文翻译。打开“对照原文”可以逐段核对。
摘要

30 秒看懂

2026 年初,AI 带来的代码变更推动 Uber 的高峰合并量从每小时约 90 次升至 130 次,合并耗时的第 95 百分位却从 30 分钟升到三四小时。Preetam Dwivedi 和 Manjari Akella 说,团队通过流量控制和允许弱重叠变更并行来提高吞吐量。这意味着部分组合可能导致主分支失败,因此另一个系统会验证合并后的提交,并记录最近通过验证的状态。他们说,到 10 月,高峰吞吐量约为每小时 300 次,第 95 百分位合并耗时约为 30 分钟。

  1. 1高峰合并量上升 44%,第 95 百分位等待时间增至数小时Dwivedi 说,2026 年 1 月到 3 月高峰合并量从每小时约 90 次增至 130 次,合并耗时从 30 分钟升至三四小时。
  2. 2准入控制提高吞吐量,却要求开发者重新安排时间高峰时限制昂贵变更让吞吐量从每小时约 130 次升至 160 次;后来延迟队列实现了自动重新提交。
  3. 3放宽较弱的冲突关系可以增加并行工作队列对构建目标的重叠程度评分,保留较强关联,移除较弱关联以达到配置的并行度。
  4. 4更快的队列允许部分未经组合测试的变更进入主分支Akella 说放宽冲突后每小时可合并约 250 次;由此产生的风险需要合并后验证。
  5. 5已验证版本指针在主分支出错时保护下游Stovepipe 检查合并后的提交,仅在验证通过时推进指针;值班工程师负责修复或回滚。
  6. 6团队报告高峰每小时合并 300 次,第 95 百分位耗时 30 分钟这一 10 月结果与 1 月每小时约 90 次的基线形成对比。

要点建议

  1. 同时衡量合并吞吐量与开发者等待时间之间的权衡。
  2. 高峰时自动延后昂贵变更,避免其阻塞较小的工作。
  3. 按冲突强度排序以提高并行度,同时承认部分组合不会在合并前测试。
  4. 接受合并后验证时,维护已验证的可用版本和故障恢复流程。
  5. 可以进一步考虑按项目报告健康状态并自动恢复。
全文

按章节阅读整理后的全文

只看原始文稿
01

为什么分别通过的变更可能破坏主分支

Dwivedi 介绍 Uber 单体仓库的规模,以及 SubmitQueue 如何测试可能出现的组合状态。

Uber 单体仓库的规模
幻灯片 1 / 12Uber 单体仓库的规模讲者展示六个主要仓库的贡献者数量和每周变更量。

Preetam Dwivedi 说,Uber 有六个主要单体仓库,超过 5,000 名贡献者,每周产生超过 36,000 次提交和 27,000 个 pull request。演讲主要关注规模最大、扩展挑战尤为突出的 Go 仓库。

两个变更分别针对同一个原始主干通过测试,组合后却可能失败。如果 A 先合并,而 B 没有针对包含 A 的状态测试,那么合并 B 就可能破坏主分支。数千名开发者同时工作时,这类问题会带来持续的恢复负担。

分别通过测试仍可能破坏主分支
幻灯片 2 / 12分别通过测试仍可能破坏主分支变更 B 没有针对 A 合并后的状态进行测试。

Uber 的 SubmitQueue 在合并前测试可能出现的未来状态,使变更合并时主干保持通过测试。它分析受影响的构建目标,让独立工作并行;根据历史结果优先进行可能有用的推测构建;并允许较小、已准备好的变更绕过较慢的大型变更。

SubmitQueue 如何扩展
幻灯片 3 / 12SubmitQueue 如何扩展目标分析、推测构建和绕过大型变更帮助队列处理工作。
02

AI 带来的需求压垮原有合并队列

变更更加频繁后,尽管主干始终通过测试,长尾等待时间显著增加。

Dwivedi 说,AI 生成的工作改变了请求到达速度:2026 年 1 月,高峰每小时合并约 90 次,到 3 月增至 130 次,两个月增长 44%。与此同时,合并耗时的第 95 百分位从约 30 分钟上升到三四小时,尽管主干依然保持通过测试。

高峰合并需求的增长
幻灯片 4 / 12高峰合并需求的增长幻灯片比较了 2026 年 1 月和 3 月的高峰合并速率。
03

控制高峰流量并延后昂贵变更

准入控制保护吞吐量,延迟队列则让开发者无需手动重新提交。

Manjari Akella 介绍了三项应对措施:用准入控制调整流量,用延迟队列减轻开发者负担,以及通过放宽冲突恢复并行度。每项措施都有权衡。

准入控制按成本对请求分类,例如根据受影响的构建目标数量。繁忙时段允许小变更进入;影响多个目标的昂贵变更最初会被拒绝,以免它们阻塞活跃队列。

准入控制
幻灯片 5 / 12准入控制高峰期,小变更进入活跃队列,昂贵变更被暂时挡住。

Akella 说,这让工作时间的吞吐量从每小时约 130 次升至 160 次,增长超过 20%。代价是开发者必须寻找空闲时段重新提交;维护广泛使用的共享库的开发者受影响尤其明显。

延迟机制用持久化等待队列取代拒绝。开发者只需提交一次,系统会在容量允许时将昂贵请求送入活跃队列,通常是在高峰期之外。这避免了手动重新安排时间,但并没有消除等待。

延后昂贵请求
幻灯片 6 / 12延后昂贵请求持久化队列在容量允许时自动释放请求。
04

放宽弱冲突以恢复并行度

对重叠关系评分后可以创建更多独立队列,但部分变更组合会未经测试就合并。

第三项改动处理构建目标重叠造成的串行化。如果 A 与 B 重叠、B 与 C 重叠,以此类推,整条关联链可能被视为一个组件,即使部分关联很弱,也会限制并行工作。

放宽较弱的冲突
幻灯片 7 / 12放宽较弱的冲突系统对重叠关系排序,而不是将其视为同样强。

冲突放宽机制对重叠强度评分,而不是把所有重叠视为同等重要。SubmitQueue 保留较强的关联,移除较弱的关联,直到达到配置的并行度。分数综合考虑目标重叠和新增依赖关系。

在 Akella 的示例中,移除最弱的连接后,六个请求被分成三个独立队列。系统不会持续重建整张冲突图,而是在新请求进入时确定其关联,保留先前的决定和推测构建结果。

将链条拆成并行队列
幻灯片 8 / 12将链条拆成并行队列示例通过移除弱关联,形成三个独立组。
吞吐量与安全性的权衡
幻灯片 9 / 12吞吐量与安全性的权衡更高并行度意味着部分组合未经过合并前联合测试。

Akella 说,放宽冲突后,高峰吞吐量从每小时约 160 次升至约 250 次,有时更高。代价是部分组合在合并前没有一起测试,因此主干可能出错,合并后的验证也随之成为必要工作。

05

验证已合并提交并保留可用状态

Stovepipe 在合并后检查主分支,维护已验证指针,并在失败时通知值班工程师。

Dwivedi 回到 A 和 B 的例子:两个变更分别通过测试,但合并后的组合可能失败。Uber 使用 Stovepipe 在提交合并后进行验证,检测构建失败并启动恢复流程。

Stovepipe 跟踪两个引用。变更合并时,main 向前移动;verified main 则停留在最近已知通过验证的状态。如果提交 B 到 D 的组合验证失败,已验证指针就继续停留在 A。后续状态通过时,指针才向前移动。

主分支与已验证主分支
幻灯片 10 / 12主分支与已验证主分支后续状态验证失败时,已验证指针停留在上一个通过的提交。

当 Stovepipe 检测到失败,它会通知值班工程师。工程师准备修复或回滚,再通过 SubmitQueue 提交。Stovepipe 持续验证变化中的主干,并在某个状态通过后推进已验证指针。目前恢复过程仍需人工处理。

06

结果和下一步改进

团队报告高峰吞吐量提高,并计划采用批处理、更细粒度的健康状态和更快的恢复方式。

Dwivedi 说,截至 2026 年 10 月,高峰吞吐量达到每小时约 300 次合并,而合并耗时的第 95 百分位约为 30 分钟。讲者将其与 1 月每小时约 90 次的基线比较。SubmitQueue 和 Stovepipe 都以开放方式开发。

报告的吞吐量与合并耗时
幻灯片 11 / 12报告的吞吐量与合并耗时2026 年 10 月的幻灯片显示,高峰每小时约 300 次合并,第 95 百分位约为 30 分钟。

团队正在探索把相关变更批量处理以减少重复构建,按服务或项目而非整个仓库报告健康状态,并自动执行修复或回滚以缩短恢复时间。

计划中的改进
幻灯片 12 / 12计划中的改进团队列出了批处理、按项目报告健康状态及自动恢复。

最终采用的是混合策略:在合并前测试重要关联,放宽较弱关联以提高吞吐量,再验证合并后的状态。系统持续检查 main 的同时,下游可以使用已验证通过的状态。

同频道的其他文章

7 张幻灯片19:41EN → 简体中文
AI Engineer· 2026年11月9日高可靠自动化的第一步:把难处理的案例分流出去Matthew Jewkes · Standard CyberneticsMatthew Jewkes 介绍如何在生物医药文档索引流程中区分关键错误、模糊判断和异常情况。智能体工程Workflow automation评估+1
7 张幻灯片22:01EN → 简体中文
AI Engineer· 2026年11月9日Zach Lloyd:让软件工厂可以衡量和修改Zach Lloyd · WarpWarp CEO 建议记录智能体运行、评估失败原因,并用真实任务测试工作流的改动。软件工厂编程智能体评估+2
3 张幻灯片15:25EN → 简体中文
AI Engineer· 2026年11月9日Hassan 与 Omar El Mghari:AI 财务预测为何会“结果对了,理由错了”Hassan El Mghari, Omar El Mghari · Together AI一个 Costco 会员费模型通过了基础检查,结果也接近实际数据,但审计发现了相互抵消的错误假设。金融 AI评估智能体工程
3 张幻灯片14:38EN → 简体中文
AI Engineer· 2026年11月9日Jemima Abu:从一开始就给编程代理无障碍规则Jemima Abu · CAIS一位产品工程师介绍如何利用语义化 HTML、可复用组件和明确的代理技能,帮助团队构建更易用的界面。编程智能体产品与体验Agent skills
4 张幻灯片21:12EN → 简体中文
AI Engineer· 2026年11月9日Tom Moor:给编程代理补上代码看不到的产品背景Tom Moor · LinearLinear 的工作流将客户请求、历史决策、审查记录和人工反馈贯穿于接收、实现与审查。编程智能体产品与体验智能体工程
2 张幻灯片15:35EN → 简体中文
AI Engineer· 2026年11月9日Mislav Ivanda:先选执行边界,再选智能体框架Mislav Ivanda · DaytonaDaytona 工程师比较了运行智能体生成代码时的本机审批、嵌入式运行时和沙箱机器。Sandboxes & isolation智能体工程基础设施与部署