random_retry.go 873 B

123456789101112131415161718192021222324252627282930313233343536373839
  1. package retry
  2. import (
  3. "math/rand"
  4. "time"
  5. )
  6. // RandomRetryRule 随机等待时间重试规则
  7. type RandomRetryRule struct {
  8. minDelay time.Duration // 最小随机等待时间
  9. maxDelay time.Duration // 最大随机等待时间
  10. }
  11. var DefaultRandomRetryRule = NewRandomRetryRule(DefaultRandomMinDelay, DefaultRandomMaxDelay)
  12. func NewRandomRetryRule(minDelay time.Duration, maxDelay time.Duration) RandomRetryRule {
  13. if minDelay < 0 {
  14. minDelay = DefaultRandomMinDelay
  15. }
  16. if maxDelay < 0 {
  17. maxDelay = DefaultRandomMaxDelay
  18. }
  19. if maxDelay < minDelay {
  20. minDelay = DefaultRandomMinDelay
  21. maxDelay = DefaultRandomMaxDelay
  22. }
  23. return RandomRetryRule{
  24. minDelay: minDelay,
  25. maxDelay: maxDelay,
  26. }
  27. }
  28. func (r RandomRetryRule) GetDelay(attempts int) time.Duration {
  29. delay := r.minDelay + time.Duration(rand.Int63n(int64(r.maxDelay-r.minDelay+1)))
  30. return delay
  31. }