Anthropic如何重新设计源码控制系统

Anthropic如何重新设计源码控制系统

💡 原文英文,约2300词,阅读约需9分钟。
📝

内容提要

Anthropic因AI生成代码激增导致Git基础设施不堪重负,遂自研源码控制系统Scion。Scion采用客户端-服务器架构,由服务器集中处理历史查询、差异计算与提交,客户端仅缓存所需对象。变更以changeset记录,元数据存于Spanner,文件内容存于云存储。系统利用内容寻址实现不可变对象与多级共享缓存,大幅减少重复传输与计算,支撑每日数万次合并与数千万次检出。

🔎

延伸解读

Git 的本地独立性为何成为负担

Git 设计上让每个克隆都是自包含仓库,本地即可查历史、算差异、建提交。但 Anthropic 的客户端大多是自动化任务和智能体,本就依赖网络服务,本地独立性价值不大,反而导致重复传输、存储和维护成本。团队曾用浅克隆、稀疏检出、数百个内部镜像等缓解,但镜像同步和种子过期问题随合并频率激增而恶化。

客户端-服务器不对称的实际取舍

Scion 把历史查询、差异计算、提交创建、合并与变基都交给服务器,客户端只维护有限缓存并准备磁盘文件。好处是客户端无需组装完整历史即可回答 blame 等问题,提交也无需单独 push。代价是强依赖服务可用性与网络连接,一旦服务不可达,客户端能做的操作非常有限。

内容寻址如何简化缓存

Scion 用内容哈希标识对象,相同内容永远对应同一 ID,因此缓存对象不可变,无需因仓库其他位置有开发活动而做新鲜度检查。这使多级缓存(节点守护进程、区域缓存、权威服务器)能安全共享对象。但可变引用如分支名 main 仍需单独处理,不能与不可变对象混为一谈。

分层缓存与故障边界

Scion 的缓存分三层:计算节点上的 scion-daemon 跨任务共享对象,区域级 scion-cache 跨节点共享,未命中才回源到权威服务器。三层使用统一的对象请求接口,目的是在区域缓存故障时,消费者不会直接压垮权威服务器。这种严格边界是规模化支撑每日数千万次检出的关键设计。

❓

Q&A

Anthropic 为什么要自己开发源码控制系统 Scion?

因为 AI 生成代码激增,Git 基础设施不堪重负:每日合并变更从 2026 年 5 月的约 2500 次增长到 9 月的超过 30000 次,主分支历史接近 100 GB,CI 系统每天约 2500 万次检出,导致下载仓库、准备工作区等成为瓶颈。

Scion 的客户端-服务器架构是如何分工的?

服务器集中处理历史查询、差异计算、提交创建、合并与变基;客户端(scn)只维护有限缓存、准备磁盘文件、监视本地文件系统变化,并向开发者或任务提供接口。这种非对称设计让客户端无需保存完整仓库历史。

Scion 中的 changeset 是什么?它如何存储?

changeset 是变更的持久化记录,记录相对于第一个父提交的文件变化及内容引用,并包含父信息和作者详情。其元数据存储在分布式数据库 Spanner 中,压缩文件内容存放在云对象存储,根树由服务器派生而非直接存储。

Scion 如何利用内容寻址实现高效缓存?

Scion 通过哈希函数从对象内容计算标识符,使对象不可变,相同 ID 始终指向相同数据。因此缓存命中时无需检查新鲜度,可跨任务共享缓存,减少重复传输和计算。

Scion 如何扩展以支撑每日数千万次检出?

Scion 将仓库操作移至共享服务并通过 API 暴露;客户端只请求缺失的对象;采用多级缓存:节点上的 scion-daemon 在任务间共享缓存,区域级 scion-cache 跨节点共享,未命中时再访问权威服务器。各层使用统一对象请求接口,严格缓存边界防止故障扩散。

Anthropic 从构建 Scion 中总结了哪些经验?

1)小团队(7 人)也能快速开发;2)开发者仍重要,但工作转向高层系统理解和设计权衡,常需阻止 Claude 走错误路径;3)Claude 能快速编写大量代码,使 Scion 成为测试最充分、防护最完善的代码库之一;4)通过 Claude Tag 监控各组件,达到新的运维水平。

🏷️

标签

➡️

继续阅读