go.uber.org/yarpc@v1.72.1/yarpcconfig/backoff.go (about) 1 // Copyright (c) 2022 Uber Technologies, Inc. 2 // 3 // Permission is hereby granted, free of charge, to any person obtaining a copy 4 // of this software and associated documentation files (the "Software"), to deal 5 // in the Software without restriction, including without limitation the rights 6 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 // copies of the Software, and to permit persons to whom the Software is 8 // furnished to do so, subject to the following conditions: 9 // 10 // The above copyright notice and this permission notice shall be included in 11 // all copies or substantial portions of the Software. 12 // 13 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 // THE SOFTWARE. 20 21 package yarpcconfig 22 23 import ( 24 "time" 25 26 backoffapi "go.uber.org/yarpc/api/backoff" 27 "go.uber.org/yarpc/internal/backoff" 28 ) 29 30 // Backoff specifies a backoff strategy, particularly for retries. 31 // The only supported strategy at time of writing is "exponential" with full 32 // jitter. This structure may be extended in the future to support registering 33 // alternate backoff strategies. 34 // 35 // exponential: 36 // first: 100ms 37 // max: 30s 38 type Backoff struct { 39 Exponential ExponentialBackoff `config:"exponential"` 40 } 41 42 // Strategy returns a backoff strategy constructor (in terms of the number of 43 // attempts already made) and the given configuration, or an error. 44 func (c Backoff) Strategy() (backoffapi.Strategy, error) { 45 return c.Exponential.Strategy() 46 } 47 48 // ExponentialBackoff details the exponential with full jitter backoff 49 // strategy. 50 // "first" defines the range of possible durations for the first attempt. 51 // Each subsequent attempt has twice the range of possible jittered delay 52 // duration. 53 // The range of possible values will not exceed "max", inclusive. 54 // 55 // first: 100ms 56 // max: 30s 57 type ExponentialBackoff struct { 58 First time.Duration `config:"first"` 59 Max time.Duration `config:"max"` 60 } 61 62 // Strategy returns an exponential backoff strategy (in terms of the number of 63 // attempts already made) and the given configuration. 64 func (c ExponentialBackoff) Strategy() (backoffapi.Strategy, error) { 65 var opts []backoff.ExponentialOption 66 67 if c.First > 0 { 68 opts = append(opts, backoff.FirstBackoff(c.First)) 69 } 70 if c.Max > 0 { 71 opts = append(opts, backoff.MaxBackoff(c.Max)) 72 } 73 74 return backoff.NewExponential(opts...) 75 }