init
This commit is contained in:
125
strategy.go
Normal file
125
strategy.go
Normal file
@@ -0,0 +1,125 @@
|
||||
package reconnect
|
||||
|
||||
import "time"
|
||||
|
||||
// Strategy 重连策略接口
|
||||
type Strategy interface {
|
||||
// NextDelay 返回下一次重试的延迟时间
|
||||
// attempt 是当前重试次数(从1开始)
|
||||
NextDelay(attempt int) time.Duration
|
||||
|
||||
// Reset 重置策略状态
|
||||
Reset()
|
||||
}
|
||||
|
||||
// ExponentialBackoff 指数退避策略
|
||||
type ExponentialBackoff struct {
|
||||
initialDelay time.Duration
|
||||
maxDelay time.Duration
|
||||
multiplier float64
|
||||
}
|
||||
|
||||
// NewExponentialBackoff 创建指数退避策略
|
||||
func NewExponentialBackoff(initialDelay, maxDelay time.Duration, multiplier float64) *ExponentialBackoff {
|
||||
if multiplier <= 0 {
|
||||
multiplier = 2.0
|
||||
}
|
||||
return &ExponentialBackoff{
|
||||
initialDelay: initialDelay,
|
||||
maxDelay: maxDelay,
|
||||
multiplier: multiplier,
|
||||
}
|
||||
}
|
||||
|
||||
// NextDelay 计算下一次延迟时间
|
||||
func (e *ExponentialBackoff) NextDelay(attempt int) time.Duration {
|
||||
if attempt <= 0 {
|
||||
attempt = 1
|
||||
}
|
||||
delay := float64(e.initialDelay)
|
||||
for i := 1; i < attempt; i++ {
|
||||
delay *= e.multiplier
|
||||
if time.Duration(delay) >= e.maxDelay {
|
||||
return e.maxDelay
|
||||
}
|
||||
}
|
||||
if time.Duration(delay) > e.maxDelay {
|
||||
return e.maxDelay
|
||||
}
|
||||
return time.Duration(delay)
|
||||
}
|
||||
|
||||
// Reset 重置策略
|
||||
func (e *ExponentialBackoff) Reset() {
|
||||
// 无状态,无需重置
|
||||
}
|
||||
|
||||
// FixedInterval 固定间隔策略
|
||||
type FixedInterval struct {
|
||||
interval time.Duration
|
||||
}
|
||||
|
||||
// NewFixedInterval 创建固定间隔策略
|
||||
func NewFixedInterval(interval time.Duration) *FixedInterval {
|
||||
return &FixedInterval{
|
||||
interval: interval,
|
||||
}
|
||||
}
|
||||
|
||||
// NextDelay 返回固定延迟时间
|
||||
func (f *FixedInterval) NextDelay(attempt int) time.Duration {
|
||||
return f.interval
|
||||
}
|
||||
|
||||
// Reset 重置策略
|
||||
func (f *FixedInterval) Reset() {
|
||||
// 无状态,无需重置
|
||||
}
|
||||
|
||||
// LinearBackoff 线性退避策略
|
||||
type LinearBackoff struct {
|
||||
initialDelay time.Duration
|
||||
maxDelay time.Duration
|
||||
increment time.Duration
|
||||
}
|
||||
|
||||
// NewLinearBackoff 创建线性退避策略
|
||||
func NewLinearBackoff(initialDelay, maxDelay, increment time.Duration) *LinearBackoff {
|
||||
return &LinearBackoff{
|
||||
initialDelay: initialDelay,
|
||||
maxDelay: maxDelay,
|
||||
increment: increment,
|
||||
}
|
||||
}
|
||||
|
||||
// NextDelay 计算下一次延迟时间
|
||||
func (l *LinearBackoff) NextDelay(attempt int) time.Duration {
|
||||
if attempt <= 0 {
|
||||
attempt = 1
|
||||
}
|
||||
delay := l.initialDelay + time.Duration(attempt-1)*l.increment
|
||||
if delay > l.maxDelay {
|
||||
return l.maxDelay
|
||||
}
|
||||
return delay
|
||||
}
|
||||
|
||||
// Reset 重置策略
|
||||
func (l *LinearBackoff) Reset() {
|
||||
// 无状态,无需重置
|
||||
}
|
||||
|
||||
// NewStrategy 根据配置创建策略
|
||||
func NewStrategy(cfg Config) Strategy {
|
||||
switch cfg.Strategy {
|
||||
case StrategyFixedInterval:
|
||||
return NewFixedInterval(cfg.InitialDelay)
|
||||
case StrategyLinearBackoff:
|
||||
return NewLinearBackoff(cfg.InitialDelay, cfg.MaxDelay, cfg.LinearIncrement)
|
||||
case StrategyExponentialBackoff:
|
||||
fallthrough
|
||||
default:
|
||||
return NewExponentialBackoff(cfg.InitialDelay, cfg.MaxDelay, cfg.Multiplier)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user