尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

超时重试:先限制次数、预算与取消信号

超时重试:先限制次数、预算与取消信号 超时重试先限制次数、预算与取消信号重试只适合处理短暂、可恢复且幂等的失败。对参数错误、权限错误或已经超出调用方截止时间的请求继续重试只会增加下游压力。设计重试前先回答三个问题该操作是否幂等、谁负责重试、整个请求还剩多少时间。重试要受截止时间约束固定间隔会让大量客户端在同一时刻再次发起请求。更稳妥的做法是指数退避加随机抖动并在每次等待和每次调用前检查ctx.Done()。下面示例只对可重试错误调用fn最多尝试三次次数和退避上限应按依赖的容量和调用链长度配置。func Retry(ctx context.Context, attempts int, fn func(context.Context) error) error { var err error for i : 0; i attempts; i { if err fn(ctx); err nil || !retryable(err) { return err } backoff : time.Duration(1i) * 50 * time.Millisecond wait : time.Duration(rand.Int64N(int64(backoff) 1)) timer : time.NewTimer(wait) select { case -ctx.Done(): timer.Stop() return ctx.Err() case -timer.C: } } return err }如果服务端无法识别重复写入客户端重试可能造成重复扣款、重复发消息或重复创建资源。写操作应使用幂等键或改为异步任务加去重。别让每一层都重试网关、SDK、业务服务和数据库客户端同时重试时实际尝试次数会相乘。选择一层作为主要重试者并将尝试次数、超时和失败原因写入指标。下游已经熔断或排队时立即失败或返回降级结果通常比排队重试更好。还需要重试预算在一个时间窗口内限制额外重试流量预算耗尽后停止重试。断路器应基于实际失败率、慢调用和恢复探测配置不要把某个固定百分比当成所有服务的通用阈值。验证时故意注入超时、连接拒绝、5xx 和 4xx确认只有预期错误会重试任务取消不会留下 goroutine重复写不会造成副作用。重试的目标是度过短暂抖动不是隐藏长期故障。
返回列表