backoff.go 923 B

1234567891011121314151617181920212223242526272829303132
  1. package backoff
  2. import (
  3. "math/rand"
  4. "time"
  5. )
  6. // Func defines the method to calculate how long to retry.
  7. type Func func(attempt int) time.Duration
  8. // LinearWithJitter waits a set period of time, allowing for jitter (fractional adjustment).
  9. func LinearWithJitter(waitBetween time.Duration, jitterFraction float64) Func {
  10. r := rand.New(rand.NewSource(time.Now().UnixNano()))
  11. return func(attempt int) time.Duration {
  12. multiplier := jitterFraction * (r.Float64()*2 - 1)
  13. return time.Duration(float64(waitBetween) * (1 + multiplier))
  14. }
  15. }
  16. // Interval it waits for a fixed period of time between calls.
  17. func Interval(interval time.Duration) Func {
  18. return func(attempt int) time.Duration {
  19. return interval
  20. }
  21. }
  22. // Exponential produces increasing intervals for each attempt.
  23. func Exponential(scalar time.Duration) Func {
  24. return func(attempt int) time.Duration {
  25. return scalar * time.Duration((1<<attempt)>>1)
  26. }
  27. }