1.7 版本回滚事件报告
2016 年 11 月 3 日,Wade Anderson,@waderyan_
昨晚,即 11 月 2 日星期三,我们将 Visual Studio Code 的 1.7 版本回滚到 1.6.1。如果您已升级到 1.7,系统会提示您更新回 1.6.1。今天早上,我们实施了一个缓解性修复并发布了一个新版本,现在您应该使用的是 VS Code 1.7.1。如果您不确定自己使用的是哪个版本,可以在“关于”对话框中找到版本信息。
对于这些更新给您带来的不便,我们深表歉意,并希望解释所发生的事件以及我们正在采取的措施,以确保您拥有出色的 VS Code 体验。
自动类型获取
在 VS Code 1.7 中,我们发布了一项名为“自动类型获取”(ATA)的功能。ATA 的目的是改善 JavaScript IntelliSense 体验。
VS Code 使用 TypeScript 语言服务为 JavaScript 提供 IntelliSense。TypeScript 语言服务使用称为类型声明文件(也称为类型文件)的特殊文件,这些文件发布在 npm 的 @types 范围下。过去,您必须手动安装类型声明文件才能点亮 package.json
中依赖项的 IntelliSense。我们知道这不是一件容易的事,因此我们与 TypeScript 团队合作开发了 ATA。
启用 ATA 的 TypeScript 语言服务会监视您的 package.json
文件,并自动将所有依赖项的类型声明文件安装到文件系统上的缓存中。当它找到对知名客户端库的引用时,也会执行相同的操作。
在 Insider 版本中启用此功能两周后,我们认为它对用户很有用,并决定在 VS Code 1.7 中向所有人发布 ATA。
发生了什么?
11 月 2 日下午 1:57 左右(太平洋标准时间) 我们发布了 VS Code 1.7。苏黎世团队上床睡觉,雷德蒙德团队开始制定 1.8 的计划。
11 月 2 日下午 4:12 左右(太平洋标准时间) 我们收到了 npm 的联系。他们发现客户端尝试访问 @types
范围下不存在的包,导致注册表活动出现巨大峰值。在其峰值时,这些请求约占所有流量的 10%(有趣的事实:VS Code 用户发送的请求量大约与 npm 从印度看到的请求量相同),并短暂地使他们的服务不堪重负。
npm 运维人员迅速采取行动,减轻了非故意的 DDoS 攻击,并将问题诊断为来自 VS Code 1.7 版本。关键问题是由于以下算法导致的大量请求不存在的包的洪水
- TypeScript 语言服务器对照其应用程序缓存检查
package.json
中列出的模块。 - 对于应用程序缓存中不存在的每个模块,TypeScript 语言服务器都会向 npm 发送请求
@types/{module}
。 - 存在的模块将添加到应用程序缓存中。
- 由于预计新类型声明文件将添加到
@types
范围中,每次打开项目或文件夹时都会请求不存在的模块,这会导致 npm 以 404 响应。
鉴于 @types
范围下不存在的模块数量,大量 404 错误短暂地影响了 npm 的可用性。
11 月 2 日下午 5:45 左右(太平洋标准时间) 在适当的背景下并应 npm 的要求,我们取消了 1.7 版本的发布,并将用户回滚到 VS Code 1.6.1。我们更新了网站,提供了我们掌握的事实,并卷起袖子分析最佳的下一步措施。
未来展望
您应该已收到安装 VS Code 1.7.1 的提示。此版本已禁用 ATA,但所有其他 1.7 功能均可使用。在接下来的几天里,我们将与 TypeScript 团队合作,为 ATA 找到令人满意的修复方案(昨晚已在此 PR 中开始),我们将在更新可用时通知您。
Wade Anderson,VS Code 团队成员
@waderyan_