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 使用体验。
自动类型获取 (Automatic Type Acquisition)
在 VS Code 1.7 中,我们发布了一项名为“自动类型获取”(ATA) 的功能。ATA 的目的是改善 JavaScript 的 IntelliSense 体验。
VS Code 使用 TypeScript 语言服务为 JavaScript 提供 IntelliSense。TypeScript 语言服务使用一种称为类型声明文件(也称为 typings 文件)的特殊文件,这些文件发布在 npm 的 @types 作用域下。过去,您必须手动安装类型声明文件才能为 package.json 中的依赖项启用 IntelliSense。我们知道这并非易事,因此我们与 TypeScript 团队合作开发了 ATA。
启用了 ATA 的 TypeScript 语言服务会监视您的 package.json 文件,并自动将所有依赖项的类型声明文件安装到您文件系统上的缓存中。当它发现对知名的客户端库的引用时,也会执行相同的操作。
在 Insiders 版本中对该功能进行了两周的测试后,我们认为它对用户很有用,因此决定在 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_