是时候终结Staging了:拥抱生产环境测试

31 阅读7分钟

文章讨论了软件开发中传统分期环境的弊端,如瓶颈、低保真度和速度慢。文章提出了一种新的“请求隔离”方法,通过按需沙箱在生产环境中进行测试,解决了这些问题。该方法通过路由隔离、安全模型和审计日志确保了生产数据的安全。文章最后指出,DoorDash和Uber等公司已成功采用此模型,预示着分期环境的时代已成过去。

译自:It's Time To Kill Staging: The Case for Testing in Production

作者:Arjun Iyer

分期环境一直是一种必要的邪恶。新的隔离和按需沙箱方法最终使其变得纯粹邪恶。

几十年来,分期环境一直是软件开发的一个固定组成部分。同样,它也一直被开发人员所憎恨。这就像每个开发人员为了验证自己的工作而被迫经历的典型交通堵塞。

然而,分期环境不再是必需的了;它的时代已经到来并已经过去。新的隔离方法使开发人员能够在实时环境中安全地进行测试,提供在分期环境中无法实现的快速、高保真反馈。

是时候放弃你的分期环境了。

我们都了解的问题

理论上,分期环境是有意义的。在将代码部署到生产环境之前,我们必须在类似生产的环境中进行测试。否则将是疯狂的。

但治疗已成为疾病本身。在任何拥有不止一小部分微服务的组织中,分期环境最终都会成为开发人员痛苦和烧钱的荒原。

  • 它是瓶颈: 当 50 名开发人员合并代码时,分期环境就变成了一个共享队列。测试失败不是因为代码不好,而是因为另一个开发人员部署了冲突的更改。
  • 它不是生产环境: 我们称之为“类似生产”,但它从未拥有相同的数据规模、流量模式或身份和访问管理 (IAM) 策略。这种保真度差距是危险错误隐藏的地方。
  • 它扼杀了速度: 提交代码,等待 CI,等待部署槽,运行 40 分钟的测试套件。这个长达数小时的循环会破坏心流状态。
  • 没有人维护它: 团队将其视为不稳定构建的倾倒场,使其与生产环境进一步偏离。

我们已经接受了这种破败的工作流程 20 年。我们相信这是唯一的方法。

从环境隔离到请求隔离

分期环境的存在是基于测试必须在环境级别隔离的假设。要测试支付服务的新版本,您必须将其部署到一个也包含购物车服务、用户服务和身份验证服务的环境中。

这个假设已经过时且不复存在。

新模型是请求级别的隔离。不是克隆整个环境,而是只启动您正在更改的服务。这种模型由提供每个请求的按需沙箱的 Kubernetes 原生平台支持。

它的工作原理如下:

  • 新服务版本在一个按需、隔离的“沙箱”中启动。
  • 当发送测试请求时(用唯一标头标记),它会被路由到沙箱服务。
  • 当该服务调用其依赖项时,这些调用会通过路由回生产环境中的稳定基线服务。
  • 测试请求在通过堆栈时保持隔离,而所有其他流量正常流动。

通过这种方法,您可以获得高保真测试(真实依赖项、真实网络策略),而不会有共享环境的缺点(没有冲突,没有队列,成本大大降低)。

请求级别的隔离可以集成到传统的本地 > 分期 > 生产部署流程中以进行改进,消除争用和对 CI 管道的漫长等待。但它的真正威力在于绕过分期环境的需要,从而能够在生产环境中进行测试。

安全模型

在生产环境中进行测试听起来很危险。只要有合适的防护措施,就不会。

  • 严格的数据隔离至关重要。 最大的担忧是沙箱服务可能会损坏其他服务中的数据。解决方案很简单。用于隔离测试流量的相同路由标头也将数据库操作路由到单独的测试数据库。例如,当测试请求流经系统时,每个服务都会识别测试上下文并将所有数据库写入定向到隔离的测试数据存储,与生产数据库完全分开。测试用户仅与测试数据交互。生产数据保持不变。
  • 多租户提供了基础。 虚拟专用网络 (VPN) 限制可确保测试流量仅来自授权的内部网络。审计日志会跟踪每个沙箱会话以进行合规性检查。
  • 请求路由提供爆炸半径控制。 您的沙箱在请求级别隔离。您同事的工作不受影响。生产流量正常流动。
  • 渐进式推出仍然至关重要。 沙箱处理预生产验证,但您仍然可以使用金丝雀部署、功能标志和可观测性来安全地向真实用户推出。

回答棘手的问题

在生产环境中进行测试是向左移动测试的逻辑演变。但是,对 CI/CD 管道进行如此基础性的更改自然会引发一些关键问题:

  • “您如何保证测试流量不会损坏生产数据?” 测试写入是隔离的。隔离标头会将所有数据库写入重定向到临时、非生产数据存储,这些存储在测试后被销毁。生产数据永远不会被触及。
  • “那爆炸半径呢?您如何阻止不良测试使下游服务遭受 DDoS 攻击?” 沙箱是“影子”部署,内置了断路器和网络策略等防护措施。具有失控网络请求的错误测试会被自动限制和隔离,防止其压垮基线服务或影响其他用户。
  • “这对于简单的 API 来说听起来不错,那 Kafka 或 gRPC 呢?” 隔离模型是协议无关的。隔离标头通过 gRPC 或作为 Kafka 消息头 进行传播。例如,沙箱化的使用者从主主题读取,但仅处理带有其唯一沙箱 ID 的消息。
  • “合规性和审计要求呢?” 这种模型的可审计性更强。每个沙箱都与特定用户和拉取请求/开发会话相关联。所有测试流量都明确标记了沙箱 ID 和用户身份,从而创建了一个细粒度的审计日志,远优于共享的分期环境。

解决这些问题并向生产环境测试的转变将不可避免地涉及一些前期的工程投入。然而,这项工作的投资回报不仅仅是消除分期环境直接基础设施成本的节省。它还带来了更好的开发人员体验、更快的交付产品以及减少因竞争对手能够更快地迭代和发布而错失的机会。

是时候放手了

消除分期环境可能听起来像是一个梦想,但一些著名的云原生团队,如 DoorDashUber,已经完成了向左移动到在生产环境中测试的转变。受其高度复杂的 微服务堆栈和对更高测试 保真度的需求驱动,它们也正在实现巨大的基础设施成本节约。

像这些团队这样放弃分期环境而在生产环境中进行测试,代表了一个更广泛的趋势:拒绝近似以拥抱现实。分期环境是基础设施复制比协调人员围绕共享资源更难解决的问题的时代的产物。

那个时代正在结束。

未来不是关于构建更好的生产环境近似或优化您的 CI 管道。它是关于采用一种全新的范式。迈出这一步的团队不仅速度更快、成本更低。他们还交付了更可靠的代码。

是时候放弃你的分期环境了。