66 lines
1.9 KiB
Go
66 lines
1.9 KiB
Go
package delay
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"time"
|
|
)
|
|
|
|
// ProgressiveDelay 用于管理渐进式延迟策略
|
|
type ProgressiveDelay struct {
|
|
initialDelay time.Duration // 初始延迟时间
|
|
growthFactor float64 // 延迟增长因子 (例如 1.5)
|
|
maxDelay time.Duration // 最大延迟时间
|
|
maxRetryDuration time.Duration // 最大重试时间
|
|
currentDelay time.Duration // 当前延迟时间
|
|
startTime time.Time // 重试开始时间
|
|
}
|
|
|
|
// New 创建一个新的渐进式延迟对象
|
|
func New(initialDelay, maxDelay, maxRetryDuration time.Duration, growthFactor float64) (*ProgressiveDelay, error) {
|
|
// 参数校验
|
|
if initialDelay <= 0 {
|
|
return nil, errors.New("initialDelay must be greater than zero")
|
|
}
|
|
if maxDelay <= 0 {
|
|
return nil, errors.New("maxDelay must be greater than zero")
|
|
}
|
|
if maxRetryDuration <= 0 {
|
|
return nil, errors.New("maxRetryDuration must be greater than zero")
|
|
}
|
|
if growthFactor <= 1.0 {
|
|
return nil, errors.New("growthFactor must be greater than 1")
|
|
}
|
|
|
|
// 初始化并返回
|
|
return &ProgressiveDelay{
|
|
initialDelay: initialDelay,
|
|
maxDelay: maxDelay,
|
|
maxRetryDuration: maxRetryDuration,
|
|
growthFactor: growthFactor,
|
|
currentDelay: initialDelay,
|
|
startTime: time.Now(),
|
|
}, nil
|
|
}
|
|
|
|
// NextDelay 计算并返回下次的延迟时间
|
|
func (pd *ProgressiveDelay) NextDelay() (time.Duration, error) {
|
|
// 检查最大重试时间是否已过
|
|
if time.Since(pd.startTime) > pd.maxRetryDuration {
|
|
return 0, fmt.Errorf("最大重试时间超过限制: %v", pd.maxRetryDuration)
|
|
}
|
|
|
|
// 返回当前延迟时间
|
|
delay := pd.currentDelay
|
|
|
|
// 计算下一个延迟时间并更新 currentDelay
|
|
pd.currentDelay = time.Duration(float64(pd.currentDelay) * pd.growthFactor)
|
|
|
|
// 如果下次延迟超过最大延迟时间,限制在最大值
|
|
if pd.currentDelay > pd.maxDelay {
|
|
pd.currentDelay = pd.maxDelay
|
|
}
|
|
|
|
return delay, nil
|
|
}
|