知识卡片
指数退避加抖动防止重试雪崩
内容
下游服务响应失败或超时,最直接的应对是重试,但如果一失败就立刻重试、一次接一次不留间隔,等于在对方本就过载的时候又追加一轮请求,反而把对方进一步推向崩溃——相当于自己给自己发起了一场拒绝服务攻击。指数退避的做法是让每次重试的等待时间随尝试次数递增,给下游服务留出喘息和恢复的时间;再叠加一个随机抖动因子,是因为如果调用方有多个实例副本,大家按同一套退避公式计算出来的重试时间点会精确对齐,所有副本在同一时刻一起发起重试,等于是把”惊群”问题从故障发生那一刻推迟到了重试那一刻,抖动的作用就是把这些原本会同时到达的重试请求在时间上错开。发散:这是分布式系统里”避免同步行为放大问题”的通用手段——凡是多个独立实例会对同一个外部事件做出相同反应(重试、心跳、缓存失效),都值得考虑加一点随机扰动,把本来会叠加的峰值削平摊开。
参考来源
《Cloud Native Spring in Action》第8章《Reactive Spring: Resilience and scalability》