Twitch如何对前端进行混沌工程?


混沌工程是 Netflix 首创的一种用于测试系统弹性的方法。
您可以使用 Chaos Monkey、Gremlin、AWS Fault Injection Simulator 等工具模拟整个系统的不同故障,然后衡量影响。这些工具允许您设置模拟故障(例如阻止传出 DNS 流量、关闭虚拟机、丢包等),然后安排它们在特定时间窗口内随机运行。
混沌工程旨在作为一个科学过程来完成,您需要遵循4 个步骤

  1. 使用延迟百分位数、错误率、吞吐量等定量测量来定义您的系统在正常情况下的行为方式。
  2. 创建一个控制组和一个实验组。在理想的实现中,您直接在一小部分真实用户流量上运行实验。否则,请使用暂存环境。 
  3. 模拟反映真实世界事件的故障,例如服务器崩溃、网络连接断开等。
  4. 比较对照组和实验组之间定量测量的差异。

通常,混沌工程用于衡量后端的弹性(通常是面向服务的架构)。

然而,Twitch 的工程师决定使用混沌工程技术来测试他们的前端。他们想要回答的问题是“如果他们整个系统的某些部分出现故障,前端会如何表现以及最终用户会看到什么?”
Joaquim Verges 是 Twitch 的高级开发人员,他写了一篇关于 Twitch 混沌测试流程的精彩博客文章。

摘要如下:
Twitch 是一个实时流媒体网站,内容创建者可以在其中向观众流式传输实时视频。他们拥有数百万的主播和数千万的日活跃用户。在任何给定时间,网站上都有超过一百万的用户。
Twitch 的后端使用面向服务的架构,并且拥有数百个微服务。
前端客户端使用单个GraphQL API 与后端通信。GraphQL 允许前端开发人员使用查询语言来请求他们正在寻找的确切数据,而不是调用一堆不同的REST端点。
GraphQL 服务器有一个解析器层,负责调用特定的后端服务来获取所有请求的数据。

他们的系统最常见的故障是他们的微服务失败之一。在这种情况下,GraphQL 会将部分数据转发给客户端,客户端的工作是优雅地处理部分数据并提供可能的最佳降级体验。
Twitch 的工程师决定使用 Chaos Engineering 来测试这些微服务故障场景。
他们创建了Chaos Mode,可以在暂存环境中将额外的标头传递给 GraphQL 调用。在标头中,他们传递了他们想要模拟失败的后端服务的名称。

这种方法的主要问题是 Twitch 需要在 GraphQL 标头中发送后端服务的名称。因此,他们必须维护一个包含所有各种后端服务的列表以进行测试。 
功能和服务不断变化,因此手动将特定服务映射到测试是不可扩展的。他们需要一种方法让测试套件“发现”他们应该为其模拟故障的服务。
为了解决这个问题,Twitch 在他们的 GraphQL 调用中添加了一个调试头,从而在 GraphQL解析器层启用了跟踪。解析器记录对内部服务依赖项所做的任何方法调用,然后在同一个 GraphQL 调用中将信息发送回客户端。
从那里,客户端可以提取涉及的服务名称并将其用作混沌测试套件的输入。