exponential_retry.go 835 B

12345678910111213141516171819202122232425262728293031323334353637
  1. package retry
  2. import (
  3. "math"
  4. "time"
  5. )
  6. // ExponentialRetryRule 指数级增长等待时间重试规则
  7. type ExponentialRetryRule struct {
  8. baseDelay time.Duration // 基础等待时间
  9. maxDelay time.Duration // 单次最大等待时间
  10. }
  11. var DefaultExponentialRetryRule = NewExponentialRetryRule(DefaultBaseDelay, DefaultMaxDelay)
  12. func NewExponentialRetryRule(baseDelay time.Duration, maxDelay time.Duration) ExponentialRetryRule {
  13. if baseDelay < 0 {
  14. baseDelay = DefaultBaseDelay
  15. }
  16. if maxDelay < 0 {
  17. maxDelay = DefaultMaxDelay
  18. }
  19. return ExponentialRetryRule{
  20. baseDelay: baseDelay,
  21. maxDelay: maxDelay,
  22. }
  23. }
  24. func (r ExponentialRetryRule) GetDelay(attempts int) time.Duration {
  25. delay := r.baseDelay * time.Duration(math.Pow(2, float64(attempts-1)))
  26. if delay > r.maxDelay {
  27. return r.maxDelay
  28. }
  29. return delay
  30. }