tydata-server/pkg/lzkit/delay/ProgressiveDelay.go
2025-01-10 00:09:25 +08:00

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
}