ticker.go 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. package utils
  2. import (
  3. "time"
  4. "github.com/cenkalti/backoff"
  5. )
  6. type expBackoffOpt func(e *backoff.ExponentialBackOff)
  7. func BackoffInitialInterval(i time.Duration) expBackoffOpt {
  8. return func(e *backoff.ExponentialBackOff) {
  9. e.InitialInterval = i
  10. }
  11. }
  12. func BackoffRandomizationFactor(i float64) expBackoffOpt {
  13. return func(e *backoff.ExponentialBackOff) {
  14. e.RandomizationFactor = i
  15. }
  16. }
  17. func BackoffMultiplier(i float64) expBackoffOpt {
  18. return func(e *backoff.ExponentialBackOff) {
  19. e.Multiplier = i
  20. }
  21. }
  22. func BackoffMaxInterval(i time.Duration) expBackoffOpt {
  23. return func(e *backoff.ExponentialBackOff) {
  24. e.MaxInterval = i
  25. }
  26. }
  27. func BackoffMaxElapsedTime(i time.Duration) expBackoffOpt {
  28. return func(e *backoff.ExponentialBackOff) {
  29. e.MaxElapsedTime = i
  30. }
  31. }
  32. func newExpBackoff(o ...expBackoffOpt) backoff.BackOff {
  33. b := &backoff.ExponentialBackOff{
  34. InitialInterval: 5 * time.Second,
  35. RandomizationFactor: 0.5,
  36. Multiplier: 2,
  37. MaxInterval: 2 * time.Minute,
  38. MaxElapsedTime: 0,
  39. Clock: backoff.SystemClock,
  40. }
  41. for _, opt := range o {
  42. opt(b)
  43. }
  44. b.Reset()
  45. return b
  46. }
  47. func NewBackoffTicker(o ...expBackoffOpt) *backoff.Ticker {
  48. return backoff.NewTicker(newExpBackoff(o...))
  49. }