背景:系统A调用系统B
1. B因io,load,deadlock等原因出现长时间卡顿或stw,会导致对外提供服务的能力下降,rt时间过长。
2. A接口调用B超时失败,往往会发生重试,重试+正常qps,导致对B系统的调用量增加,B系统雪上加霜,恢复更慢。
3. A调用B的线程会被更长时间占用(接口调用10ms,超时1s失败,重试3次,最坏情况接口耗时4s),A的性能受用影响,有可能级联影响到调用A的服务。形成一种链式的雪崩。
生产例子:
理论: redis使用单线程,单机处理能力qps 10W, redis中存放的对象应尽量小,如果存放对象过大会影响网络带宽,阻塞后续请求,导致qps大幅下降,客户端请求超时失败。 redis热点问题,qps激增也会导致类似的情况。
问题: 系统A->系统B->redis。因redis超时导致整个链路互相影响,形成雪崩。
解决方案: 系统中除主流程外,大多数操作都是锦上添花的,增强客户体验效果的,这部分操作在紧急情况下,可以降级不作处理,以保证系统正常运行主流程不受影响。上述问题,如果感知B系统提供的服务出现问题,同时B系统提供的服务非主核心,降级不请求B接口。这样既减少了对B系统的请求,有利于B系统尽早恢复,同时也减少了A系统的性能损耗,避免了链式雪崩。