pub struct RetryPolicy {
pub max_retries: u32,
pub initial_backoff: Duration,
pub max_backoff: Duration,
pub backoff_multiplier: f64,
}Expand description
Configuration for automatic retry with exponential backoff.
§Defaults
| Field | Default |
|---|---|
max_retries | 3 |
initial_backoff | 500 ms |
max_backoff | 30 s |
backoff_multiplier | 2.0 |
§What a call can cost, which is not the request timeout
ClientConfig::request_timeout is per attempt — its own doc says
“per-request” — and a retrying call makes several. The wall-clock a caller
should budget for is:
(max_retries + 1) × request_timeout + the backoffs between themAt the shipped defaults, with the default 30-second request_timeout:
four attempts of 30s plus backoffs of 0.5s, 1s and 2s — about 124
seconds for one send_request on a client configured with “timeout: 30
seconds”. A server sending Retry-After can lengthen each gap up to
max_backoff, so the same policy against a rate-limiting server is four
attempts plus up to 90 seconds of waiting.
Nothing here is wrong — the two knobs mean what they say — but the product
of them is what a caller actually waits for, and multiplying it out is not
something anyone does while reading a builder. Wrap the call in
tokio::time::timeout if you need a real ceiling; this type does not
provide one.
(The push path states the same arithmetic through
PushSender::max_delivery_duration, which exists because the server needed
to budget against it. A client has no equivalent because nothing else in
the process needs the number — only the person calling does.)
Fields§
§max_retries: u32Maximum number of retry attempts (not counting the initial attempt).
initial_backoff: DurationInitial backoff duration before the first retry.
max_backoff: DurationMaximum backoff duration (caps exponential growth).
backoff_multiplier: f64Multiplier applied to the backoff after each retry.
Implementations§
Source§impl RetryPolicy
impl RetryPolicy
Sourcepub const fn with_max_retries(self, max_retries: u32) -> RetryPolicy
pub const fn with_max_retries(self, max_retries: u32) -> RetryPolicy
Creates a retry policy with the given maximum number of retries.
Sourcepub const fn with_initial_backoff(self, backoff: Duration) -> RetryPolicy
pub const fn with_initial_backoff(self, backoff: Duration) -> RetryPolicy
Sets the initial backoff duration.
Sourcepub const fn with_max_backoff(self, max: Duration) -> RetryPolicy
pub const fn with_max_backoff(self, max: Duration) -> RetryPolicy
Sets the maximum backoff duration.
Sourcepub const fn with_backoff_multiplier(self, multiplier: f64) -> RetryPolicy
pub const fn with_backoff_multiplier(self, multiplier: f64) -> RetryPolicy
Sets the backoff multiplier.
Trait Implementations§
Source§impl Clone for RetryPolicy
impl Clone for RetryPolicy
Source§fn clone(&self) -> RetryPolicy
fn clone(&self) -> RetryPolicy
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for RetryPolicy
impl Debug for RetryPolicy
Source§impl Default for RetryPolicy
impl Default for RetryPolicy
Source§fn default() -> RetryPolicy
fn default() -> RetryPolicy
Auto Trait Implementations§
impl Freeze for RetryPolicy
impl RefUnwindSafe for RetryPolicy
impl Send for RetryPolicy
impl Sync for RetryPolicy
impl Unpin for RetryPolicy
impl UnsafeUnpin for RetryPolicy
impl UnwindSafe for RetryPolicy
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> FutureExt for T
impl<T> FutureExt for T
Source§fn with_context(self, otel_cx: Context) -> WithContext<Self> ⓘ
fn with_context(self, otel_cx: Context) -> WithContext<Self> ⓘ
Source§fn with_current_context(self) -> WithContext<Self> ⓘ
fn with_current_context(self) -> WithContext<Self> ⓘ
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
Source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T in a tonic::Request