ticker.go 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. package utils
  2. import (
  3. "time"
  4. backoff "github.com/cenkalti/backoff/v4"
  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. Stop: backoff.Stop,
  40. Clock: backoff.SystemClock,
  41. }
  42. for _, opt := range o {
  43. opt(b)
  44. }
  45. b.Reset()
  46. return b
  47. }
  48. func NewBackoffTicker(o ...expBackoffOpt) *backoff.Ticker {
  49. return backoff.NewTicker(newExpBackoff(o...))
  50. }