27 August 2018

IMG-THUMBNAIL

有时候业务需要重试极致,今天讲一下非常简单的重试方法。

代码

简单的东西就不废话了,直接上代码。

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