Go 语言实现的一个简单的重试方法
27 August 2018
有时候业务需要重试极致,今天讲一下非常简单的重试方法。
代码
简单的东西就不废话了,直接上代码。
func Retry(attempts int, sleep time.Duration, fn func() error) error {
if err := fn(); err != nil {
if s, ok := err.(stop); ok {
return s.error
}
if attempts--; attempts > 0 {
logger.Warnf("retry func error: %s. attemps #%d after %s.", err.Error(), attempts, sleep)
time.Sleep(sleep)
return Retry(attempts, 2*sleep, fn)
}
return err
}
return nil
}
type stop struct {
error
}
func NoRetryError(err error) stop {
return stop{err}
}
接收三个参数:
- attempts:最多重试次数;
- sleep:调用失败后的等待时间;
- fn:重试的函数。函数的类型是
func() error
,如果你的重试函数定义并不是这样,可以通过闭包包一下。
重试的逻辑
最多重试attempts
次,如果调用fn
返回错误,等待sleep
的时间,而下次错误重试就需要等待两倍的时间了。还有一点是错误的类型,常规错误会重试,而stop
类型的错误会中断重试,这也提供了一种中断机制。
示例
cnt := 0
err := fmt.Errorf("test error every time")
a := func() error {
if cnt == 0 {
cnt++
return err
} else {
cnt++
return nil
}
}
errFn := util.Retry(3, 1*time.Millisecond, a)
GitHub
完整的代码放到了 GitHub 上面,地址。欢迎大家 Star。
完整文档:godoc。
更多阅读:Simple Golang Retry Function
原文链接:Go 语言实现的一个简单的重试方法,转载请注明来源!
–EOF–