商业
微软宕机揭示了什么

它又发生了:技术的又一次连锁失败。近年来,我们经历了互联网中断、航空系统崩溃,而现在由于影响微软系统的问题而导致的大范围停电,导致航班停飞,并扰乱了包括医疗服务提供商、银行和广播公司在内的一系列其他业务。

为什么我们在预防这些方面做得这么差?从根本上说,因为我们的技术系统太复杂了,任何人都无法完全理解。这些不是由单个人编写的计算机程序;它们是许多人多年来的心血结晶。它们是无数组件的交互作用,这些组件可能以一种特定的方式被设计出来,原因无人记得。我们的许多系统涉及大量的计算机,其中任何一台都可能发生故障,导致其他所有计算机瘫痪。而且许多计算机代码有数百万行,没有人完全掌握。

除非出了问题,否则我们不会感激这一切。当我们发现技术基础设施的脆弱性时,为时已晚。

那么我们怎样才能减少系统的故障呢?

我们需要更好地了解他们。具有讽刺意味的是,做到这一点的最好方法是打破它们。就像生物学家通过照射细菌来引起突变,从而向我们展示细菌的功能一样,我们可以将错误引入技术,以了解它们是如何容易失败的。

Samuel Arbesman:一切都过于复杂了

这项工作通常落在软件质量保证工程师身上,他们通过向系统投入大量不同的输入来测试系统。一个流行的编程笑话说明了基本思想。

一个软件工程师走进一家酒吧。他点了一杯啤酒。不点啤酒。订购9999999999999瓶啤酒。蜥蜴命令。点1瓶啤酒。点了一份三明治。(到目前为止,一切顺利。酒保可能没能弄到蜥蜴,但酒吧还在。)一位真正的顾客走进来,问洗手间在哪里。酒吧突然起火。

工程师只能诱导出这么多错误。当他们没有预料到的事情发生时,网络就会崩溃。那么我们如何扩大系统暴露的故障范围呢?作为研究复杂系统的人,我有一些方法。

一种叫做“模糊测试”。模糊测试有点像酒吧里的工程师,但打了兴奋剂。它包括将大量随机生成的输入输入到软件程序中,以观察程序如何响应。如果它没有失败,那么我们就可以更有信心,它将在现实和不可预测的世界中生存下来。第一代苹果麦金塔电脑也采用了类似的方法。

模糊测试在单个程序的级别上工作,但我们也需要在系统级别注入故障。这就是众所周知的“混沌工程”。正如该实践的宣言所指出的那样,“即使分布式系统中的所有单个服务都正常工作,这些服务之间的交互也可能导致不可预测的结果。”将不可预测的结果与破坏性的现实世界事件结合起来,你就会得到一个“内在混乱”的系统。在工程阶段制造混乱对于在实际环境中减少混乱是至关重要的。

Netflix是这方面的早期实践者。2012年,该公司公开发布了一个内部使用的名为Chaos Monkey的软件套件,该套件可以随机关闭不同的子系统,以测试公司整体基础设施的反应。这有助于Netflix预测和防范模糊测试无法发现的系统故障。

话虽如此,模糊和混沌工程并不完美。随着我们的技术系统变得越来越复杂,测试每一个输入或条件变得不可能。随机性可以帮助我们发现额外的错误,但我们只能对潜在情况的一小部分进行抽样。这还不包括那些扭曲系统却没有完全破坏它们的故障。令人不安的是,这些问题很难根除。

与这些现实作斗争需要一些认识论上的谦卑:对于我们的技术如何以及何时会失败,我们所能知道的是有限的。它还要求我们克制把整个系统的失败归咎于某个特定的人或团体的冲动。在许多情况下,现代系统太大了,当出现问题时,我们无法指出单个参与者。

凯西·罗森塔尔和诺拉·琼斯在他们的书《混沌工程》中提供了几个没有单一罪魁祸首的系统故障的例子。其中一起涉及到一家大型在线零售商,为了避免在节日期间引入漏洞,该零售商暂时停止了对软件代码的修改。这意味着该公司也暂停了频繁的系统重置,这是这些变化所需要的。他们的谨慎适得其反。零售商使用的外部库中的一个小错误开始导致内存问题(经常重置会使问题变得无害),并导致系统中断。

在这种情况下,错误不太可能属于任何一个工程师,而是现代软件不可避免的复杂性。因此,正如罗森塔尔和琼斯所说——正如我在《过度复杂》一书中所探讨的那样——我们必须通过使用诸如混沌工程之类的技术来应对这种复杂性,而不是试图通过工程来消除它。

随着我们的世界越来越多地被庞大的系统联系在一起,我们需要成为打破它们的人——一次又一次——在世界得到机会之前。

点击分享到

热门推荐