医疗保健中的混沌工程:敏感工作负载入门

2020-10-07 08:31:00

虽然混沌工程是一种经过验证的提高系统弹性的技术,但当系统被视为关键时,利益相关者往往不愿引入这种做法。

对于关键系统,最好先在您的开发/测试类型环境中运行实验,以将实际风险和感知风险降至最低。当您从这些早期的实验中学到新的东西时,您可以向涉众解释,生产是一个更大、更复杂的环境,这将进一步从此实践中受益。

使用真实的生产流量,而不是合成工作负载,可以提高这些早期阶段实验的有用性。

一个好的混沌工程实践可以帮助您提高系统的弹性,以及在发生事件时的可观察性。

混沌工程学是一门近年来受到越来越多人关注的学科。它为通过接受系统将会失败这一事实来提高系统可靠性的有价值的实践提供了定义。虽然关于如何应用这种方法的文献和讨论比比皆是,但当系统被视为“关键的”或太重要而不能失败时,人们往往会犹豫。尽管可能有更令人信服的理由将此方法应用于关键系统,但预计这些系统中的风险承担者将对任何可能增加风险的新事物非常敏感。在这篇文章中,我将分享我们在医疗保健信息技术公司SCerner Corporation的团队发现在将这种做法引入我们的系统方面是有效的。

在您开始尝试应用这些类型的实验之前,您希望确保系统中的利益相关者在此方法上保持一致。这在早期阶段很重要,因为您的一些发现可能会改变您的软件交付计划。您将希望确保他们了解您开发过程的这一新部分,并且结果可能优先于其他计划的开发。您可以比较在生产事件中发现的解决可靠性问题的优先级如何高于其他规划的功能。您通过混沌测试发现的问题可能同样重要,但您将在实际事件中主动而不是被动地发现它们。

在准备引入这些类型的实验时,您需要确定系统的哪些组件将是初始重点的一部分。为了最大限度地减少利益相关者的沟通,将这些组件所有者包括在初始会议中是有帮助的,这样他们就可以了解应用的内容和原因,您就会得到他们的完全认可。与任何新的东西一样,同意共同参与包括他们的组件的第一个实验可能是最容易的,这样他们就可以密切参与,从而看到价值,并就如何最好地保持他们的参与度提供反馈。这通常是有价值的,因为他们可以立即提供有关观察到的系统行为的信息,而不是必须记录这些信息,并提供必要的详细信息,以便他们提供初始反馈。通过将它们作为实验的一部分,他们将能够在发现点更深入地挖掘他们的组件,这是收集额外细节的最有效时间。

对于关键系统,最好先在您的开发/测试类型环境中运行实验,以将实际风险和感知风险降至最低。当您从这些早期的实验中学到新的东西时,您可以向涉众解释,生产是一个更大、更复杂的环境,这将进一步从此实践中受益。同样,在将类似的东西引入生产之前,您希望确信您可以有一种安全的方法,允许您在不引入额外风险的情况下对新的发现感到惊讶。

下一步,考虑在新的生产环境中通过生成合成工作负载来处理实时流量之前,在该环境中运行混沌实验。您可以从开始在生产配置中测试系统的一些边界中获益,并且其他利益相关者很容易理解如何应用这一点,并且它不会给客户带来额外的风险,因为实时流量还没有得到处理。

要开始引入比您从合成流量中获得的更现实的工作负载,下一步可能是利用您现有的生产流量。在Cerner,我们构建了一个流量管理功能,可以将传入的请求重放到另一个系统,以生成某种形式的“影子流量”。此功能内置于我们的API网关中,该网关处理进入我们系统的流量。在查看影子通信量的候选项时,您需要确保可以安全地重放请求。您可能会想到只读类型的请求,这些请求可能是很好的候选请求,但是对于敏感的工作负载,即使是读取操作也可能有副作用。这方面的一个示例是从支持警报系统的服务发出的事件。在确定此流量的候选流量时,您需要小心,并了解如何控制系统中有问题的副作用。

能够将流量注释为被跟踪将有助于后面的实验。例如,如果系统中的影子请求失败,您不一定希望将此作为服务的总体生产指标(如其故障率),因为您可以在这些试验期间影子请求失败是可以接受的情况下开始向该服务的所有者发出警报。拥有在单个请求级别对此进行注释和控制的能力,可以为您提供适当的粒度级别来管理这些副作用并测量它们的行为。此外,在您的通信量上具有一致的关联标识符(例如,当应用影子通信量方法时,您可以通过比较处理实时通信量的系统和处理影子通信量的系统来比较两个系统的性能,因此它为您提供了一种可靠的方式来比较两个系统的性能。由于您可能只能将特定的一组请求安全地重放到另一个系统,因此您不能准确地应用行为的聚合比较(例如,故障率或响应时间的第99%),而不知道应该比较该业务的哪个子集。通过使用相关标识符并知道哪个请求针对哪个系统,您可以比较系统的行为。

使用影子通信量,您可以开始向另一个系统重放通信量,该系统本质上可能会出现故障,而不会影响该请求的来源。这种类型的设置可能是增加这些类型的实验的有效方式。这允许您在系统处于活动状态后继续这种类型的测试,因为通过控制系统中的流量流,您就能够控制这些实验的风险。

当谈到运行实验时,您希望从保持简单开始,并计划更多的时间来有效地消化所发现的任何意外。例如,如果你认为做实验需要两个小时,那就计划整个下午。如果你不需要所有的时间,那很好,但你不想因为时间的限制而感到被迫提前结束。拥有一个中心位置会很有帮助,您可以在其中记录这些实验,以供他人发现和学习。在这个中心位置,您将在应用实验之前制定场景和预期行为的计划。在观察行为之前捕获您期望的内容是很有价值的,因为您通常会对实际行为感到惊讶。

在早期,当向系统注入故障时,您可能没有太多的自动化。这方面的常见示例是手动关闭服务。这可能是物理基础架构或关闭支持您的系统的虚拟机。因此,当您有多个人作为实验的一部分来协调任务时,确保通信集中在一个位置非常重要。这可能是让每个人都在同一个聊天中,并确保他们的日历在那个时候被屏蔽,这样他们的注意力就不会被转移到其他地方。让每个人都成为同一聊天的一部分也有助于捕捉该实验的事件时间线。这有助于将事件和重要发现(如系统从故障中恢复的总时间)关联起来。利用能够快速向实际消费者展示这些实验效果的工具是很有价值的。Vegeta是一个简单的HTTP负载测试工具,您可以使用它来生成合成流量,它可以在您的控制台中通过实时图表快速展示客户端体验。捕获客户端指标非常重要,因为可能存在

当您开始识别问题并基于这些实验改进您的系统时,您希望确保其他人了解这是如何有效的。通常,许多参与实验的主要利益相关者已经意识到了其中的好处。他们看到这些故障的系统行为,了解到什么,以及如何应用改进。然而,对于那些密切参与的人来说,被进一步除名的利益相关者(包括领导团队)可能看不到这项工作的价值,这一点可能并不明显。领导层经常了解生产事件,但他们可能并不总是能听到什么时候避免了事件。

为了应对这种情况,可以将实验记录在一个可以在领导层更新中分享的故事中,包括发现了什么、是如何发现的、对客户的影响是什么,以及正在采取什么措施来解决这个问题。通常,当这个故事被框定为一种主动的方法,即您准备好系统并为意外故障做好计划时,您已经降低了给客户带来的风险(或者至少将其保持在最低水平)。因此,当您可以分享团队如何在不影响客户的情况下学习和改进系统的这些故事时,继续使用这些方法显然是一个选择。在可能的情况下,通过将调查结果与您的利益相关者可能更容易记住的过去的生产事件进行比较,可以进一步扩大这些故事的份量。分享如何通过主动寻找系统中的这些故障边界来发现和避免某些事情,通常会让更多的人对这些方法感兴趣,因为主动方法带来的控制感超过了生产事件导致的通常是反应性的方法。这种方法提高了您的团队诊断和解决生产中问题的能力。无论是观察性的提高还是对系统的了解,都为团队在未来处理不同的事件做好了准备。

更改从来都不是一件容易的事,特别是当它涉及生产环境中的敏感工作负载时。混沌工程方法可以为您的团队提供识别和解决系统可用性风险的主动方法,从而为您的系统带来重大价值。通过及早与这些系统的风险承担者合作并共享此实践的价值,您可以建立一个重要的势头,帮助您将此方法从早期环境应用到实际生产系统中。

卡尔·切瑟(Carl Chesser)是全球医疗信息技术领先企业Cerner Corporation的首席工程师,负责支持该服务平台。他职业生涯的大部分时间都专注于为Cerner的核心电子病历平台千禧年发展和扩展服务基础设施。他热衷于在Cerner培养积极的工程文化,并作为黑客马拉松、聚会和技术演讲的组织者做出贡献。在业余时间,他喜欢写关于工程相关主题的博客,分享他制作的拙劣插图。

InfoQ上上周内容的综述每周二都会发布。加入一个超过25万名高级开发人员的社区。 查看示例。

选择您的国家/地区我同意InfoQ.com按照本隐私声明中的说明处理我的数据。