backoff.go 864 B

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