服务雪崩效应
架构
前言
分布式系统中经常会出现某个基础服务不可用造成整个系统不可用的情况, 这种现象被称为服务雪崩效应
服务雪崩效应形成的原因
服务雪崩效应是一种因 服务提供者 的不可用导致 服务调用者 的不可用,并将不可用 逐渐放大 的过程.如果所示:

- 服务提供者不可用
- 重试加大流量
- 服务调用者不可用
服务提供者不可用
- 硬件故障
- 程序Bug
- 缓存击穿
- 用户大量请求
重试加大流量
- 用户重试
- 代码逻辑重试
服务调用者不可用
- 同步等待造成的资源耗尽
当服务调用者使用 同步调用 时, 会产生大量的等待线程占用系统资源. 一旦线程资源被耗尽,服务调用者提供的服务也将处于不可用状态, 于是服务雪崩效应产生了.
服务雪崩的应对策略
- 流量控制
- 改进缓存模式
- 服务自动扩容
- 服务调用者降级服务
- 流量控制 的具体措施包括:
网关限流
- 用户交互限流
- 关闭重试
因为Nginx的高性能,目前一线互联网公司大量采用Nginx+Lua的网关进行流量控制, 由此而来的OpenResty也越来越热门.
用户交互限流的具体措施有:
- 采用加载动画,提高用户的忍耐等待时间.
- 提交按钮添加强制等待时间机制.
改进缓存模式
- 缓存预加载
- 同步改为异步刷新
服务自动扩容
- AWS的auto scaling
服务调用者降级服务
- 资源隔离
资源隔离主要是对调用服务的线程池进行隔离.
我们根据具体业务,将依赖服务分为: 强依赖和若依赖. 强依赖服务不可用会导致当前业务中止,而弱依赖服务的不可用不会导致当前业务的中止.
- 对依赖服务进行分类
- 不可用服务的调用快速失败
不可用服务的调用快速失败一般通过 超时机制, 熔断器 和熔断后的 降级方法 来实现