feat(all): v1.0
This commit is contained in:
65
pkg/lzkit/delay/ProgressiveDelay.go
Normal file
65
pkg/lzkit/delay/ProgressiveDelay.go
Normal file
@@ -0,0 +1,65 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user