1.3.3 韧性
如果系统即使在出现故障或环境发生变化的情况下也能提供服务,则系统是有韧性的。韧性是“面对故障或挑战性操作,软硬件网络仍能提供和维持一个可接受的服务水平”。
云原生应用程序在动态环境中运行,其中所有内容都在不断变化,并且故障可能随时会发生。这是无法阻止的。过去,我们习惯于把变化和故障作为异常。但对于高度分布式的系统,如云原生系统,变化不是异常:它们是常态。
您的目标应该是:无论基础架构或软件中是否出现故障,都要确保您的应用程序可用。
在讨论韧性时,有必要定义三个基本概念:故障、错误和失效。
- 故障(Fault)。是软件或基础设施中会产生错误内部状态的缺陷。示例:方法调用返回空值,即使其规范要求返回非 null 值。
- 错误(Error)。是指系统的预期行为与实际行为的差异。示例:由于上面的错误,将引发抛出 NullPointerException。
- 失效(Failure)。当触发故障并导致错误时,可能会发生失效,导致系统没有响应,无法按照其规范运行。示例:如果未捕获 NullPointerException,则错误会引发失效,系统将对任何请求返回 500 响应。
故障可能会变成错误,这可能会引发失效,因此您应该将应用程序设计为能够 容错(fault tolerant)
。韧性的一个重要部分是确保失效不会波及到其他系统组件,而是使它保持隔离。您还需要这个系统能够 自我修复(self-repairing)
,而云模型实际上可以实现这一点。
在本书中,我将向您展示一些容错技巧,防止故障传播到系统的其他部分。例如,您将利用 Spring Cloud Circuit Breaker 和 Resilience4J 来实现断路器、重试和冗余。