避免连锁故障

连锁故障是由于正反馈循环导致的不断扩大规模的故障,也称为雪崩效应。

故障原因

  • 服务器过载,集群故障时负载均衡或者编排系统会加剧过载进程
  • 资源耗尽
    • CPU耗尽一般会导致所有请求变慢,会引发正在处理请求数上升、线程卡死、RPC超时、CPU缓存效率下降等副作用
    • 内存耗尽会导致任务崩溃、GC触发增多等,并会进一步导致CPU资源减少
    • 线程不足
    • 文件描述符不足
    • 资源相互依赖
  • 服务不可用,比如进程崩溃、更新等

避免连锁故障的方法

  • 使用负载压力测试服务器的极限,同时测试过载情况下的失败模式
  • 提供降级结果
  • 过载时主动拒绝请求
  • 上层系统应该主动拒绝请求,比如在反向代理和负载均衡层进行速率限制
  • 容量规划
  • 有队列服务在处理速度无法跟上请求到速率时尽早拒绝请求,将FIFO改为LIFO或可控延迟算法避免处理那些不值得处理的请求
  • 优雅降级,比如降低回复质量
  • 使用随机化、指数型递增的重试周期,并限制重试次数
  • 考虑一个全局重试预算,预算耗尽直接失败
  • 使用明确的返回码,并仔细考虑每个错误码的处理
  • 设置请求截止时间(超时),可以使用截止时间传递和取消传递的策略
  • 慢启动和冷缓存:为集群增加负载时要缓慢增加
  • 保持调用栈永远向下

解决连锁故障问题

  • 增加资源
  • 停止健康检查导致的任务死亡
  • 重启服务
  • 丢弃流量
  • 进入降级模式
  • 暂停非关键流量负载
Feisky wechat
微信公众号订阅