返回资讯中心
外部精选
软件工程
#开发者工具#Architecture & optimization#Engineering#Git#Infrastructure

GitHub 发布新 Git 存储架构,支持每秒数千次写入

来源标题:Inside GitHub’s new Git storage architecture

GitHub 公布新 Git 存储架构,内部测试已能支持 5000 个并发智能体操作同一仓库、每秒 7200 次推送,同时保持读取低延迟。该架构遵循最小化协调与存储计算解耦两项原则,是 GitHub 支撑大规模智能体开发的基础。

GitHub BlogKarthik Raman2026/11/5 · 今天30 分钟阅读

以下正文由 AI 翻译自 GitHub Blog(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。

上周在 GitHub Universe 上,我们公布了全新的 Git 存储架构,它每秒可处理数千次写入,读取能力可按需扩展。通过内部测试,我们已证明能够支持 5,000 个并发 agent 在同一个仓库上工作,每秒向一个仓库发送 7,200 次 push,同时以稳定的低延迟处理读取流量。这一新架构是 GitHub 支持数亿开发者进行 agentic 开发的基础,而我们是在 GitHub 持续运行的同时,在其底层构建这套架构的。

过去一年里,agent 改变了 GitHub 上繁忙仓库的面貌。在本系列的第一篇文章中,我们阐述了下一代 Git 存储架构背后的两条原则:最小化协调,以及将存储与计算解耦。在上一篇文章中,我们介绍了过渡方案:将 99.99999% 的仓库迁移到 Azure,把写入 quorum 的范围限定到单个 reference,并搭建由 Azure Blob Storage 支持的虚拟副本。

我们在上一篇文章结尾还留下了一个观察:一次写入中需要排序的部分非常少。Git object 是不可变的,并且以其内容命名,这意味着两个写入者可以同时存储它们,而无需就任何事情达成一致。一次 push 中需要达成一致的部分是 reference 更新,而 reference 更新相比之下非常小。虚拟副本是围绕这一点进行构建的第一步,也是我们将仓库接入新架构的手段。

架构的其余部分就建立在这一观察之上。只有 reference 更新需要达成一致。这使得 Git 基础设施中过去紧密耦合的部分(存储数据、处理请求、维护仓库)可以独立扩展。对开发者而言,Git 依然是 Git:他们以同样的方式 push、fetch 和 branch,同样的保护机制依然生效。下面,我们将梳理设计背后的需求,跟踪一个请求在系统中的流转过程,并深入剖析其中两个组件。

为 agent 规模而构建

我们从两个维度来考虑 GitHub 平台的规模:

  • 水平扩展是指有多少开发者和 agent 能够在众多仓库上工作。GitHub 目前在这一维度上的许多做法已经过多年的实战检验,并将延续到新架构中:跨基础设施的租户分区、租户流量的隔离和/或公平性保障、负载感知路由,等等。
  • 垂直扩展是指有多少开发者和 agent 能够在同一个仓库上工作。随着 agent 编写更多代码,我们预计单个仓库会变得更大、更繁忙,因此我们的大部分需求都来自垂直维度。 如今,GitHub.com 上最繁忙的仓库每秒最多接收几十次写入,通常以短时突发形式出现。随着越来越多的工作转移到并行运行、全天候不间断的 agent 上,我们预计这些突发将在未来一年内变成持续速率。每次 push 都会带来更多读取:CI 运行、部署系统拉取新 commit,其他 agent 获取它以作为上下文。这种读取扇出对整体流量产生巨大的放大效应,并随写入量而扩展。 我们已经在处于曲线顶端的仓库上看到了这一趋势。下图展示了一个 GitHub 仓库从 3 月到 5 月的每日请求量,其间其流量增长了约 4 倍。此后,它的增长一直呈指数级轨迹。 我们必须为一个 agent 驱动的开发持续以这种速度加速的世界做规划。我们没有按下一个增量来做规划,而是设定了至少两个数量级更高扩展能力的目标。对于单个仓库,这意味着新架构需要:
  • 每秒接受数千次写入。
  • 支持多个写入节点。原因有二:
  • 经验告诉我们,为传入的 pack 建立索引和检查 object 连通性是写入中 CPU 开销最大的部分,而且这一开销随写入大小而扩展,因此单个节点很快就会受限于计算能力。
  • 将这项工作分散到多个节点上可以提高容错能力,并在节点故障时缩短恢复时间。
  • 最小化 commit 延迟。agent 会等待每次 push 完成后才进入下一步。
  • 按每个 reference 记录变更顺序,并能够快速跨 reference 进行线性化。落后的虚拟副本需要只下载处理传入请求所需的数据就能追上。
  • 在没有任何变化时保持读取开销低廉,鉴于读写比例,这是常见情况。
  • 让每个组件独立扩展。 除此之外,系统还必须能够提升整体可靠性并在全球范围内扩展。

介绍“Project Rubicon”

2026 年 5 月,紧接初始 Azure 迁移之后,我们开始着手设计能够满足这些需求的方案。我们尝试了多种方法。在所有这些方法中,pack 数据都存放在 Azure Blob Storage 中,在部分方案中我们还尝试将 reference 状态也放在那里。下面我们会介绍发现的一些取舍,但最终我们确定了一个我们认为能在最大化吞吐量的同时,保持 GitHub 这样的平台所要求的正确性、持久性、可用性和延迟保证的设计。我们称之为“Rubicon”,以此致敬行业在 agentic 开发上跨过的那个不归点。 让我们自顶向下地梳理 Rubicon。许多东西保持不变:来自 Git 客户端、API 和 Web UI 的请求到达 Spokes,它仍然负责路由和负载均衡,并提供 GitHub 其余部分用来读写仓库数据的内部 API。Spokes 还保留了其作为放置与均衡服务的角色,维护水平扩展所需的分区、隔离和租户公平性。相比之下,Spokes 之下的数据平面则是全新的。

(原文较长,此处译出前 6000 字,完整内容请点「打开原文」。)

正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。

打开原文
去社区讨论 →