utils/httputil/backoff.go (44 lines of code) (raw):
package httputil
import (
"time"
"github.com/cenkalti/backoff"
)
// ExponentialBackOffConfig maps backoff settings into YAML config format.
type ExponentialBackOffConfig struct {
Enabled bool `yaml:"enabled"`
InitialInterval time.Duration `yaml:"initial_interval"`
RandomizationFactor float64 `yaml:"randomization_factor"`
Multiplier float64 `yaml:"multiplier"`
MaxInterval time.Duration `yaml:"max_interval"`
MaxRetries uint64 `yaml:"max_retries"`
}
func (c *ExponentialBackOffConfig) applyDefaults() {
if c.InitialInterval == 0 {
c.InitialInterval = 2 * time.Second
}
if c.RandomizationFactor == 0 {
c.RandomizationFactor = 0.05
}
if c.Multiplier == 0 {
c.Multiplier = 2
}
if c.MaxInterval == 0 {
c.MaxInterval = 30 * time.Second
}
if c.MaxRetries == 0 {
c.MaxRetries = 5
}
}
// Build creates a new ExponentialBackOff using c's settings (if enabled).
func (c ExponentialBackOffConfig) Build() backoff.BackOff {
if c.Enabled {
c.applyDefaults()
b := &backoff.ExponentialBackOff{
InitialInterval: c.InitialInterval,
RandomizationFactor: c.RandomizationFactor,
Multiplier: c.Multiplier,
MaxInterval: c.MaxInterval,
Clock: backoff.SystemClock,
}
return backoff.WithMaxRetries(b, c.MaxRetries)
}
return &backoff.StopBackOff{}
}