...
1 package backoff
2
3 import (
4 "math/rand"
5 "time"
6 )
7
8 type jitter interface {
9 apply(interval float64) float64
10 }
11
12 func newJitter(jitterFactor float64, rng Random) jitter {
13 if jitterFactor <= 0 || jitterFactor >= 1 {
14 return newNopJitter()
15 }
16 return newRandomJitter(jitterFactor, rng)
17 }
18
19 type nopJitter struct{}
20
21 func newNopJitter() *nopJitter {
22 return &nopJitter{}
23 }
24
25 func (j *nopJitter) apply(interval float64) float64 {
26 return interval
27 }
28
29 type randomJitter struct {
30 jitterFactor float64
31 rng Random
32 }
33
34 func newRandomJitter(jitterFactor float64, rng Random) *randomJitter {
35 if rng == nil {
36
37
38
39 rng = rand.New(rand.NewSource(time.Now().UnixNano()))
40 }
41
42 return &randomJitter{
43 jitterFactor: jitterFactor,
44 rng: rng,
45 }
46 }
47
48 func (j *randomJitter) apply(interval float64) float64 {
49 jitterDelta := interval * j.jitterFactor
50 jitterMin := interval - jitterDelta
51 jitterMax := interval + jitterDelta
52
53
54
55
56
57
58 return jitterMin + j.rng.Float64()*(jitterMax-jitterMin+1)
59 }
60
View as plain text