重试机制的简单库。
概要
http请求重试示例:
url := "http://example.com"
var body []byte
err := retry.Do(
func() error {
resp, err := http.Get(url)
if err != nil {
return err
}
defer resp.Body.Close()
body, err = ioutil.ReadAll(resp.Body)
if err != nil {
return err
}
return nil
},
)
fmt.Println(body)
使用
func BackOffDelay
func BackOffDelay(n uint, _ error, config *Config) time.Duration
BackOffDelay是一种DelayType,它增加了连续重试之间的延时。
func Do
func Do(retryableFunc RetryableFunc, opts ...Option) error
func FixedDelay
func FixedDelay(_ uint, _ error, config *Config) time.Duration
FixedDelay是一种DelayType,它在所有迭代中保持相同的延时。
func IsRecoverable
func IsRecoverable(err error) bool
IsRecoverable检查错误是否是unrecoverableError的实例。
func RandomDelay
func RandomDelay(_ uint, _ error, config *Config) time.Duration
RandomDelay是一种DelayType,它选择一个随机延迟到config.maxJitter。
func Unrecoverable
func Unrecoverable(err error) error
Unrecoverable在unrecoverableError结构中包装错误。
type Config
type Config struct {
}
type DelayTypeFunc
type DelayTypeFunc func(n uint, err error, config *Config) time.Duration
调用DelayTypeFunc以返回在n次尝试后可重试函数失败后等待的下一个延迟。
func CombineDelay
func CombineDelay(delays ...DelayTypeFunc) DelayTypeFunc
CombineDelay是一种DelayType,它将所有指定的延迟组合成一个新的DelayTypeFunc。
type Error
type Error []error
Error类型表示重试中的错误列表。
func (Error) Error
func (e Error) Error() string
Error方法返回Error的字符串表示,是错误接口的实现。
func (Error) WrappedError
func (e Error) WrappedErrors() []error
WrappedErrors返回此错误正在包装的错误列表。它是errwrap包中errwrap.Wrapper接口的实现,因此retry.Error可以与该库一起使用。
type OnRetryFunc
type OnRetryFunc func(n uint, err error)
OnRetry函数的函数签名n等于尝试次数。
type Option
type Option func(*Config)
Option表示重试的选项。
func Attempts
func Attempts(attempts uint) Option
Attempts设置的重试次数默认为10。
func Context
func Context(ctx context.Context) Option
Context允许设置重试的context默认是BackgroundContext。
立即取消的例子(也许这不是最好的例子,但我希望它足以作为示例):
ctx, cancel := context.WithCancel(context.Background())
cancel()
retry.Do(
func() error {
...
},
retry.Context(ctx),
)
func Delay
func Delay(delay time.Duration) Option
Delay用于设置重试之间的延迟,设置默认为100毫秒。
func DelayType
func DelayType(delayType DelayTypeFunc) Option
DelayType设置重试之间延迟的类型默认为BackOff。
func LastErrorOnly
func LastErrorOnly(lastErrorOnly bool) Option
返回来自重试函数的直接最后一个错误,默认为false(返回所有内容的包装错误)。
func MaxDelay
func MaxDelay(maxDelay time.Duration) Option
MaxDelay设置重试之间的最大延迟,不适用于默认值。
func MaxJitter
func MaxJitter(maxJitter time.Duration) Option
MaxJitter为RandomDelay设置重试之间的最大随机抖动。
func OnRetry
func OnRetry(onRetry OnRetryFunc) Option
OnRetry函数每次重试都会被回调。
记录每个重试示例:
retry.Do(
func() error {
return errors.New("some error")
},
retry.OnRetry(func(n uint, err error) {
log.Printf("#%d: %s\n", n, err)
}),
)
func RetryIf
func RetryIf(retryIf RetryIfFunc) Option
RetryIf控制是否应在出现错误后尝试重试(假设还有重试剩余次数)。
示例,如果出现特殊错误,请跳过重试:
retry.Do(
func() error {
return errors.New("special error")
},
retry.RetryIf(func(err error) bool {
if err.Error() == "special error" {
return false
}
return true
})
)
默认情况下,如果使用retry.Unrecoverable包装错误,则RetryIf停止执行,因此上面的示例也可以缩短为:
retry.Do(
func() error {
return retry.Unrecoverable(errors.New("special error"))
}
)
type RetryIfFunc
type RetryIfFunc func(error) bool
重试if函数的函数签名。
type RetryableFunc
type RetryableFunc func() error
可重试函数的函数签名。
参考
avast/retry-go: Simple golang library for retry mechanism (github.com)