微服务容错模式

微服务的容错模式

在使用了微服务架构以后,整体的业务流程被拆分成小的微服务,并组合在一起对外提供服务,微服务之间使用轻量级的网络通信协议,通常是RESTFul风格的远程调用。由于服务与服务的调用不再是进程内的调用,而是通过网络进行的远程调用,众所周知,网络通信是不稳定、不可靠的,一个服务依赖的服务可能会出错、超时或者宕机,如果没有及时发现和隔离问题,或者在设计中没有考虑如何应对这样的问题,那么很可能在短时间内服务的线程池中的线程被用满,资源耗尽,导致出现雪崩效应。

舱壁隔离模式

这里用航船的设计比喻舱壁隔离模式,若一艘航船遇到了意外事故,其中一个船舱进了水,则我们希望这个船舱和其他船舱是隔离的,不受影响。在微服务架构中,这主要体现在下面两个方面:

微服务容器分组

将不同的微服务或者不同环境下的服务分布在不同的容器中,这样,一旦其中某个微服务除了问题,导致节点宕机,也只会影响到和它同一个容器中的服务,对其他容器外的服务没有影响。

容器分组

线程池隔离

在微服务架构实施的过程中,也可以使用线程池来隔离不同的微服务。

容器分组

熔断模式

当服务地输入负载迅速增加时,如果没有有效的措施对负载进行熔断,则会使服务迅速被压垮,服务被压垮会导致依赖的服务被压垮,出现雪崩效应,一女子可以模拟家庭的电路保险开关,在微服务架构中实现熔断模式。

熔断模式的状态流转如下图所示:

熔断模式

限流模式

针对服务突然上量,我们必须由限流机制。限流机制一般会控制访问的并发量。有以下几种主流的方法实现限流。

计数器

通过原子变量计算单位时间内的访问次数,如果超过某个阈值,则拒绝后续的请求,等到下一个单位时间再重新计数。

令牌筒

令牌筒是一个流行的实现限流的技术方案,它通过一个线程在单位时间内产生固定数量的令牌,然后把令牌放入队列,每次请求调用需从桶中拿取一个令牌,拿到令牌后才有资格执行请求调用,否则只能等待拿到令牌再执行,或者直接丢弃。

信号量

失效转移模式

若微服务架构发生了熔断和限流,则该如何处理被拒绝的请求呢?解决这个问题的模式叫做失效转移模式,通常分为下面几种:

  • 采用快速失败的策略,直接返回使用方错误,让使用方知道发生了问题并自行决定后续处理
  • 是否有备份服务,如果有备份服务,则迅速切换到备份服务
  • 失败的服务有可能是某台机器有问题,采用重试的方法解决,但是这种方法要求服务提供者的服务实现了幂等性
0%