Documentation ¶
Overview ¶
Package backoff helps you at backing off !
It was forked from github.com/cenkalti/backoff which is awesome.
This BackOff sleeps upon BackOff() and calculates its next backoff time instead of returning the duration to sleep.
Index ¶
Constants ¶
const ( DefaultInitialInterval = 500 * time.Millisecond DefaultRandomizationFactor = 0.5 DefaultMultiplier = 1.5 DefaultMaxInterval = 60 * time.Second )
Default values for ExponentialBackOff.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type BackOffer ¶
type BackOffer interface { // Example usage: // // for ;; { // err, canRetry := somethingThatCanFail() // if err != nil && canRetry { // backoffer.Backoff() // } // } BackOff() // Reset to initial state. Reset() }
BackOffer interface to use after a retryable operation failed. A Backoffer.BackOff sleeps.
type ConstantBackOff ¶
func NewConstant ¶
func NewConstant(d time.Duration) *ConstantBackOff
func (*ConstantBackOff) BackOff ¶
func (b *ConstantBackOff) BackOff()
func (*ConstantBackOff) Reset ¶
func (b *ConstantBackOff) Reset()
type ExponentialBackOff ¶
type ExponentialBackOff struct { InitialInterval time.Duration MaxInterval time.Duration RandomizationFactor float64 Multiplier float64 // contains filtered or unexported fields }
ExponentialBackOff is an implementation of BackOff that increases it's back off period for each retry attempt using a randomization function that grows exponentially. Backoff() time is calculated using the following formula:
randomized_interval = retry_interval * (random value in range [1 - randomization_factor, 1 + randomization_factor])
In other words BackOff() will sleep for times between the randomization factor percentage below and above the retry interval. For example, using 2 seconds as the base retry interval and 0.5 as the randomization factor, the actual back off period used in the next retry attempt will be between 1 and 3 seconds.
Note: max_interval caps the retry_interval and not the randomized_interval.
Example: The default retry_interval is .5 seconds, default randomization_factor is 0.5, default multiplier is 1.5 and the max_interval is set to 25 seconds. For 12 tries the sequence will sleep (values in seconds) (output from ExampleExpBackOffTimes) :
request# retry_interval randomized_interval 1 0.5 [0.25, 0.75] 2 0.75 [0.375, 1.125] 3 1.125 [0.562, 1.687] 4 1.687 [0.8435, 2.53] 5 2.53 [1.265, 3.795] 6 3.795 [1.897, 5.692] 7 5.692 [2.846, 8.538] 8 8.538 [4.269, 12.807] 9 12.807 [6.403, 19.210] 10 19.22 [9.611, 28.833] 11 25 [12.5, 37.5] 12 25 [12.5, 37.5]
Implementation is not thread-safe.
func NewExponential ¶
func NewExponential() *ExponentialBackOff
NewExponential creates an instance of ExponentialBackOff using default values.
func (*ExponentialBackOff) BackOff ¶
func (b *ExponentialBackOff) BackOff()
func (*ExponentialBackOff) GetSleepTime ¶
func (b *ExponentialBackOff) GetSleepTime() time.Duration
func (*ExponentialBackOff) IncrementCurrentInterval ¶
func (b *ExponentialBackOff) IncrementCurrentInterval()
Increments the current interval by multiplying it with the multiplier.
func (*ExponentialBackOff) Inverval ¶
func (b *ExponentialBackOff) Inverval() time.Duration
func (*ExponentialBackOff) Reset ¶
func (b *ExponentialBackOff) Reset()
Reset the interval back to the initial retry interval and restarts the timer.
type LinearBackOff ¶
type LinearBackOff struct { InitialInterval time.Duration Multiplier float64 Increment time.Duration MaxInterval time.Duration // contains filtered or unexported fields }
grows linearly until
func (*LinearBackOff) BackOff ¶
func (lb *LinearBackOff) BackOff()
func (*LinearBackOff) Reset ¶
func (lb *LinearBackOff) Reset()
type ZeroBackOff ¶
type ZeroBackOff struct{}
ZeroBackOff is a fixed back-off policy whose back-off time is always zero, meaning that the operation is retried immediately without waiting.
func (*ZeroBackOff) BackOff ¶
func (b *ZeroBackOff) BackOff()
func (*ZeroBackOff) Reset ¶
func (b *ZeroBackOff) Reset()