重试
tower::retry 由 retry feature 打开,分成两半。一半是中间件本身:Retry 服务和它的响应 future,四个文件连注释一共 334 行,只做一件事,在响应 future 里跑「失败 → 等待 → 重新 poll_ready → 再发」这个循环。另一半是给 Policy 用的零件:backoff 算等多久,budget 算还能不能重试。Retry 不认识这两个模块,它只认 Policy trait;要不要退避、要不要预算,由你写的 Policy 自己决定。
- Policy 与重试状态机:
Policy的两个方法retry和clone_request;call把整个Retry(策略和内层服务)复制进响应 future;future 在Called、Waiting、Retrying三个状态之间转,重试前重新poll_ready。 - 退避与重试预算:
ExponentialBackoff的增长、抖动和参数校验;Budgettrait 和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,两个模块只在各自的文件和文档示例里出现。
💬 关联讨论
发起讨论加载中...