如何设计高可用的微服务架构如何设计高可用的微服务架构
要点
动态的环境和分布式的系统,比如微服务,它们出现故障的几率更大。
发生故障的服务应该被隔离开来,实现优雅的服务降级,提升用户体验。
70%的故障都是因为代码变更引起的,所以有时候回退代码并不算是什么坏事。
如果发生故障,就要让它们快速而独立的发生。一个团队无法控制他们服务的依赖项。
缓存、隔板、回路断路器和速率限定器这些架构模式有助于构建可靠的微服务。
微服务架构通过定义良好的边界让失效隔离成为可能,但每一个分布式系统都存在同样的问题——网络、硬件或应用程序层面
都有可能出现故障。因为服务之间存在依赖关系,所以任何一个组件出现了问题都会影响到组件依赖者。为了最小化局部故障
所带来的影响,我们需要构建具有容错能力的服务,可以优雅地应对某些类型的故障。
这篇文章基于RisingStack的Node.js咨询和开发经验,介绍构建高可用微服务系统的常用技术和架构模式。
如果你不熟悉这篇文章所介绍的模式,并不代表你现在所做的就是错的,毕竟构建一个可靠的系统需要付出额外的代价。
微服务架构的风险
微服务架构将业务逻辑分散到了各个微服务当中,微服务间通过网络层进行通信。网络通信带来了额外的延迟和复杂性,需要
多个物理组件和逻辑组件共同协作。分布式系统的额外复杂性增加了出现网络故障的几率。
微服务架构相比单体架构最大的优势之一在于,不同的团队可以独立地设计、开发和部署他们的服务。他们可以完全掌控自己
的微服务生命周期。当然,这也意味着他们无法控制服务依赖项,因为依赖项的控制权掌握在其他团队手中。在采用微服务架
构时,我们要时刻铭记,发布、配置等方面的问题可能会导致服务提供者出现短暂的不可用。
优雅的服务降级
通过微服务架构可以实现失效隔离,也就是说,在组件发生故障时可以实现优雅的服务降级。例如,在图片共享应用发生故障
时,用户可能无法上传新的图片,但他们仍然可以浏览、编辑和分享已有的图片。
图:理论上的微服务失效隔离
在大多数情况下,实现这种优雅的服务降级是很困难的,因为在分布式系统里,应用之间相互依赖,为了应对临时的故障,需
要应用到一些失效备援方案(稍后会提到)。