分布式系统的特性 - Resilience
本文介绍了分布式系统的特性之一:Resilience。
- 有必要搞清楚 Fault v/s Failure 的区别:Fault 指的是系统错误,例如说存储层速度慢,内存泄漏,线程堵塞,依赖错误,错误数据等等;而 Failure 则是系统完全无法正常工作了,例如豆瓣开小差。Fault 可能会导致 Failure;Failure 会使系统的 uptime & availability 降低。一般而言,Failure 可能会导致向客户赔钱什么的(违反了 SLA)。
- 使系统 Resilience 有几个很困难的基本点:网络层是不可靠的,依赖总可能会失效,用户行为无法预测。但是基于一些原则,Resilience 是可以做到的。
- 少写代码!
- 在客户端配置 timeout,可以防止雪崩。一般 timeout 值可以设置成依赖的 99.9 百分位的请求都可用时的响应时间。
- 重试。但是要引入 backoff。因为立马重试很可能是没什么意义的行为。这也意味着服务端在实现接口的时候要特别注意提供幂等语义。
- 优雅降级:Fallbacks。服务可以给出一些降级的默认值,至少服务没崩&提供不那么对的数据 比 完全拿不到数据还是好一些。
- Circuit Breakers。Java 业界事实标准是使用 Hystrix。
- Resiliency Testing。预期碰运气遇到错误,不如主动制造错误,观察程序的行为并加以修整。