质量检查在 Netflix 的重要性

乔梁 | 2022-06-14

我们生活在动荡但有趣的时代。富人变得更富有,穷人变得更穷,创新者设计了创新的方法来应对由冠状病毒引起的大流行带来的破坏。大流行还给我们的生活方式带来了一系列变化,首先是我们中的许多人从头开始学习如何烹饪复杂的菜肴,其他人则找到了新的爱好,甚至花时间学习了一些关于我们自己的新知识。在大流行期间,我们中的许多人也终于找到时间蜷缩在沙发上,变成沙发土豆,疯狂地观看 Netflix 原件,直到带宽用完为止。

突然激增

尽管Netflix、Amazon Prime 视频和许多其他视频和音频流媒体服务提供商等大多数服务都具有高度可扩展的系统,可以承受使用量的突然激增和尖峰,但这些服务可能会遇到中断,从而导致用户沮丧和一些长期中断的极端情况——平台也被放弃。复杂的大规模分布式系统,例如 Netflix 和 Amazon Prime 视频以及许多其他可能拥有数百万用户的系统,必须进行有效和广泛的测试,同时牢记激增和尖峰。

然而,诸如由大流行引起的异常严重的峰值是前所未有的,并且可能没有出现在任何公司的测试团队中。

持续集成交付和生产环境

CI/CD 的问题和解决持续参与系统的问题

像Netflix这样的公司会不断更新他们的系统,这些系统会不断地经过测试并交付到他们的直播平台上。为此,Netflix 测试团队每天创建数十万个测试人员帐户,每个帐户都用于数千个测试场景,以避免任何不足。

这导致 Netflix 的测试从手动测试方案转变为在生产环境中大规模运行的 Netflix 客户端和服务器应用程序的大型分布式自动化测试。为了促进这一点,Netflix 的测试已经从低容量的手动模式转变为连续的、全自动的、大量的模式,没有任何机会。

具有实际含义的想象场景

想象一下——你和数以百万计的其他人正处于故事的紧张、悬疑的高潮,突然——轰隆隆!Netflix 现已离线。这会在 Netflix 总部敲响警钟,测试 SWAT 团队会突然从你的窗户飞进来分析哪里出了问题。然而,幸运的是,这种情况并不经常发生。

目标

Netflix 的目标很简单——让用户 99.99% 的时间都在线。尽管 Netflix 在保持在线方面有着相当不错的记录,但他们确实偶尔会遇到使系统偏离轨道的故障。其中一起事件发生在 Netflix 的一个开发团队部署的软件对 Netflix 的大型基础设施产生负面影响时,导致服务广泛中断和成千上万的不满意客户。

这导致 Netflix 争先恐后地创建一个修复程序,该修复程序将在几个小时内从根本上解决问题,但也让 Netflix 产生了一些思考——他们的测试方案对于如此庞大的、分布式的、面向用户的系统来说是不充分且无效的。

会出什么问题?

Netflix 发生的事情是各个层面的疏忽。一段旨在清理未使用资源的新代码实际上正在生产环境服务器上进行测试。由于代码中的错误,这种疏忽导致了两个主要问题:

第一个错误导致清理中的空运行模式标志,以保护实际清理被错误解释 - 反转其效果。这是由于编写不佳的单元测试造成的,这可能导致此问题在开发中被捕获。 第二个错误是在一段代码中检查资源是否实际未使用。这个检查的结论忽略了一些只存在于生产环境中的情况。 这两个错误的组合导致生产环境中的关键资源被删除——导致 Netflix 实际中断。

预防这些问题

预防或减少这些问题的发生会导致一个共同的困境

测试应该在测试环境中还是在 环境环境中进行?尽管我们大多数人都主张在生产环境前进行测试,以免影响实际客户,但有些人会主张在生产环境中进行测试,以确保代码在测试和生产环境中都运行良好。该场景的实际情况是代码应该在所有三种情况下进行测试:dev、test 和 prod。Netflix 面临的挑战是设计一种有效的方法来帮助决定为什么、何时以及如何在这些环境中进行测试。

这也引出了另一组问题

测试环境是我们生产环境安全完整的镜像吗? 或者

测试环境是否具有其他人可能需要集成的功能的最新版本? 其结果是具有非常复杂和众多的测试环境的常见场景。

答案

从解决现有问题的想法中产生的这个问题的答案很简单——端到端自动化可以复制数千个场景而不会出现问题。

然而,这个答案也有其自身的一系列问题——找到一个可扩展的解决方案来创建一个类似生产环境的预生产环境,不需要完全克隆生产环境并导致大量投资需求。

另一个问题是预生产和生产环境使用模式可能完全不同。与生产环境相比,流量也少了数千倍。

测试付款

测试付款完全是另一个庞然大物。与其在生产环境中使用真钱测试支付,不如在不会使现有支付系统负担过重的沙盒账户中创建假 MOP 和对其执行的假交易。

该方法

在数千种可能的方法中,Netflix 选择了生产环境捕获和回放来扩展他们的测试,使其尽可能接近生产环境。

来自客户设备的大量请求是从持​​久性中提取的,并在剥离了他们的个人识别信息后在测试中对它们进行了双工重放。这导致测试成为现实世界的场景。这也有助于识别许多以前未知的极端情况错误。

识别出的错误通过模式路由回功能和集成测试。这也有助于获得对质量功能迁移的信心,并有助于加快更改速度。这也让位于一个有趣的学习:

所有基本的双工测试都可以通过测试人员帐户在 PRODUCTION 中运行。但是,产品捕获和重放双工测试仅限于测试环境,因为在生产环境中重放会因重新发出请求而损害实际客户数据。

黑斯廷斯说。“而不幸的是,这是一个生物问题,所以每个人都被关起来了,我们在今年上半年实现了有史以来最大的增长。” 市值约2300亿美元,自3月以来一直与华特迪士尼争夺全球市值最高娱乐集团的头衔。

经过一段时间延迟后,屏蔽和刷新的数据可以安全地用于在测试环境中重播请求。这将我们的兴趣集中在数据集而不是生产环境上。虽然这不像生产环境那样完全稳定,但让我们很好地了解了它是如何实现的。

失败在测试中很重要。失败有助于测试团队识别下游实施中的真正问题。为了缓解这种情况,所有功能验证都在生产环境中运行真正的金丝雀,本质上是将一小部分实际客户流量暴露给被测 API 的两个版本。

对从这些实现收集的指标运行金丝雀分析算法,比较验证方案将检查客户端和服务器指标是否相等。这将有助于从金丝雀捕获失败的请求日志,并有助于更好地调试和分类问题。

学习

从这种方法中学到的东西是多方面的。

  • 第一个是要了解 test 和 prod 是不同的,但必须接受它们的差异以利用两者的能力。
  • 尽管在沙盒环境中进行测试很好,但生产环境中的测试对于此类实现很重要。
  • 解决任一环境中的问题对于确保测试成功大有帮助
  • 请留意重新考虑您的测试策略。即使它可能需要额外的成本,最终的结果也是值得的。
  • 找到适合您公司的实用测试形状——不要寻找适合的教科书形状。
  • 开始生产环境模拟和混沌实验——这些将有助于验证您未来的功能和弹性测试能力。

在 Netflix,混沌测试是在生产环境中大规模进行的。测试从天上降下的火雨到外星人杀死他们的服务器的一切,他们没有留下任何机会。如果他们没有,你为什么要这样做?


原文链接:The Importance Of QA At Netflix