Files
orbit/pulse/model/policy.go

34 lines
1.2 KiB
Go

package model
import (
"errors"
"time"
)
// RetryPolicy 保存到受理时冻结的策略快照,时长统一使用毫秒。
// MaxAttempts 包含首次尝试,不能理解为首次之外的重试次数。
type RetryPolicy struct {
// MaxAttempts 最多执行尝试数,包含首次尝试。
MaxAttempts uint32 `json:"max_attempts"`
// InitialDelayMS 首次重试前的等待时长,单位毫秒。
InitialDelayMS uint64 `json:"initial_delay_ms"`
// MaxDelayMS 重试等待时长上限,单位毫秒。
MaxDelayMS uint64 `json:"max_delay_ms"`
// AttemptTimeoutMS 单次执行尝试的超时时长,单位毫秒。
AttemptTimeoutMS uint64 `json:"attempt_timeout_ms"`
}
func (p RetryPolicy) Validate() error {
maxMS := uint64((1<<63 - 1) / int64(time.Millisecond))
if p.MaxAttempts == 0 || p.AttemptTimeoutMS == 0 || p.AttemptTimeoutMS > maxMS {
return errors.New("finite attempt count and representable positive timeout required")
}
if p.InitialDelayMS > p.MaxDelayMS || p.MaxDelayMS > maxMS {
return errors.New("invalid retry delay range")
}
if p.MaxAttempts > 1 && p.InitialDelayMS == 0 {
return errors.New("retry delay must be positive")
}
return nil
}