1.3.3 韧性
如果一个系统能够在出现故障或环境变化的情况下依然能够提供服务,那么我们就说它是有韧性(resilience)的。韧性是指“在面临故障以及挑战正常运维的情况下,硬件-软件网络提供和保持可接受的服务水平的能力”[9]。
[9] J. E. Blyler, “Heuristics for resilience — A richer metric than reliability”, 2016 IEEE International Symposium on Systems Engineering (ISSE), 2016: 1-4。
在构建云原生应用时,我们的目标应该是,不管是基础设施还是我们的软件出现故障,都要确保应用始终是可用的。云原生应用在一个动态的环境中运行,在这种环境中所有的事情都在不断地发生变化,故障在所难免,这是无法预防的。过去,我们习惯于将变化和故障视为异常情况。但是,对于像云原生这样的高度分布式系统来说,变化不是异常情况,它们是常态。
当讨论韧性的时候,我们有必要定义三个基本概念,即过错(fault)、错误(error)和故障(failure)。
■ 过错:指的是在软件或基础设施中会产生不正确的内部状态的缺陷。例如,某个方法调用返回了一个空值,但是规范要求它必须返回非空的值。
■ 错误:指的是系统的预期行为和实际行为的差异。例如,因为上面所述的过错,抛出了NullPointerException异常。
■ 故障:当出现过错并导致错误时,有可能会产生故障,这将使得系统无反应并且无法按照其规范行事。例如,如果这个NullPointerException没有被捕获的话,这个错误就会引发故障——系统对任何请求都会产生500响应码。
过错可能会变成错误,进而引发故障,所以我们应该设计能够容错(fault tolerant)的应用。韧性的一个重要组成部分就是要确保故障不会级联到系统的其他组件中,而是在修复时保持它是隔离的。我们可能还希望系统是自我修复(self-repairing)或自我治愈(self-healing)的,云模型实际上可以做到这一点。
在本书中,我将会展示一些容错技术,并且能够阻止故障的影响传播到系统的其他组成部分,导致故障传播。例如,我们将会使用断路器、重试、超时和限流器。