与 Rust 社区其他部分一样,crates.io 发展迅速,下载量和包数量每年增长 2-3 倍。这种增长并非没有问题,为了确保我们能够长期提供软件包,我们在 crates.io 上对下载处理进行了一些更改。
问题
这种增长带来了一些挑战。其中最重要的是,目前所有下载请求都通过 crates.io API,偶尔会导致扩展问题。如果 API 出现故障或速度缓慢,也会影响所有下载请求。事实上,唤醒 crates.io 值班团队的首要原因是“下载速度慢”,因为 API 存在性能问题。
此外,这种设置对于北美以外的用户来说也是有问题的,因为由于距离 crates.io API 服务器的距离,他们的下载请求速度很慢。
解决方案
为了解决这些问题,在过去的一年里,我们决定做出一些改变。
从 2024 年 3 月 12 日开始,cargo
将开始直接从我们的 static.crates.io CDN 服务器下载软件包。
此更改将通过修改软件包索引上的 config.json
文件来实现。换句话说:更改生效不需要对 cargo
或您自己的系统进行任何更改。config.json
文件由 cargo
用于确定软件包的下载 URL,我们将更新它以直接指向 CDN 服务器,而不是 crates.io API。
在过去的几个月里,我们对 crates.io 后端进行了多项更改,以实现这一点。
-
我们 宣布弃用“非规范”下载,这在直接从 CDN 下载时将难以支持。
-
我们更改了下载计数方式。以前,下载计数直接在 crates.io API 服务器上进行。现在,我们分析 CDN 服务器的日志文件来统计下载请求。
后一种更改导致大多数软件包的下载数量增加,因为以前一些下载请求没有被统计。具体来说,crates.io 镜像通常已经直接从 CDN 服务器下载,而这些下载以前没有被统计。对于下载量很大的软件包,这些更改几乎不会引起注意,但对于较小的软件包,自我们启用此更改以来,过去几周的下载数量大幅增加。
预期结果
我们预计这些更改将显著提高下载的可靠性和速度,因为 crates.io API 服务器的性能将不再影响下载请求。在接下来的几周内,我们将监控系统的性能,以确保更改产生预期效果。
我们注意到,一些非 cargo 构建系统没有使用索引的 config.json
文件来构建下载 URL。我们将联系这些构建系统的维护者,确保他们了解此更改,并帮助他们更新系统以使用新的下载 URL。旧的下载 URL 将继续有效,但这些系统将错过潜在的性能改进。
我们对这些更改感到兴奋,并相信它们将极大地提高 crates.io 的可靠性。我们期待您的反馈!