Rust in Everything
基于 tower 0.5.3

重试

tower::retry 由 retry feature 打开,分成两半。一半是中间件本身:Retry 服务和它的响应 future,四个文件连注释一共 334 行,只做一件事,在响应 future 里跑「失败 → 等待 → 重新 poll_ready → 再发」这个循环。另一半是给 Policy 用的零件:backoff 算等多久,budget 算还能不能重试。Retry 不认识这两个模块,它只认 Policy trait;要不要退避、要不要预算,由你写的 Policy 自己决定。

  1. Policy 与重试状态机:Policy 的两个方法 retry 和 clone_request;call 把整个 Retry(策略和内层服务)复制进响应 future;future 在 Called、Waiting、Retrying 三个状态之间转,重试前重新 poll_ready。
  2. 退避与重试预算:ExponentialBackoff 的增长、抖动和参数校验;Budget trait 和 TpsBudget 的滑动窗口计数,默认配置下,一个请求都没成功过,10 秒内最多放过 100 次重试。
flowchart TB
  user[你写的 Policy] -->|实现| pol[Policy trait]
  pol --> rt[Retry 与 ResponseFuture]
  bo[backoff 模块] -.->|可选,自己调用| user
  bu[budget 模块] -.->|可选,自己调用| user

虚线表示 Retry 不会替你调用它们:0.5.3 里没有任何地方把 ExponentialBackoff 或 TpsBudget 接进 Retry,两个模块只在各自的文件和文档示例里出现。

💬 关联讨论

发起讨论
加载中...