Go第三方库-重试(retry-go)


重试机制的简单库。

概要

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)


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM