This package implements the backoff strategy described in the AWS
Architecture Blog article
"Exponential Backoff And Jitter". Essentially,
the backoff has an interval time.Duration; the nth call
to backoff will return an a time.Duration that is 2 n *
interval. If jitter is enabled (which is the default behaviour), the
duration is a random value between 0 and 2 n * interval.
The backoff is configured with a maximum duration that will not be
exceeded; e.g., by default, the longest duration returned is
backoff.DefaultMaxDuration.
A Backoff is initialised with a call to New. Using zero values
causes it to use DefaultMaxDuration and DefaultInterval as the
maximum duration and interval.
package something
import "github.com/cloudflare/backoff"
func retryable() {
b := backoff.New(0, 0)
for {
err := someOperation()
if err == nil {
break
}
log.Printf("error in someOperation: %v", err)
<-time.After(b.Duration())
}
log.Printf("succeeded after %d tries", b.Tries()+1)
b.Reset()
}
It can also be used to rate limit code that should retry infinitely, but which does not
use Backoff itself.
package something
import (
"time"
"github.com/cloudflare/backoff"
)
func retryable() {
b := backoff.New(0, 0)
b.SetDecay(30 * time.Second)
for {
// b will reset if someOperation returns later than
// the last call to b.Duration() + 30s.
err := someOperation()
if err == nil {
break
}
log.Printf("error in someOperation: %v", err)
<-time.After(b.Duration())
}
}
NewWithoutJittercreates a Backoff that doesn't use jitter.
The default behaviour is controlled by two variables:
DefaultIntervalsets the base interval for backoffs created with the zerotime.Durationvalue in theIntervalfield.DefaultMaxDurationsets the maximum duration for backoffs created with the zerotime.Durationvalue in theMaxDurationfield.