retry

package
v0.19.4 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Nov 1, 2026 License: Apache-2.0 Imports: 9 Imported by: 0

Documentation

Overview

* @Author: kamalyes 501893067@qq.com * @Date: 2023-07-28 00:50:58

  • @LastEditors: kamalyes 501893067@qq.com
  • @LastEditTime: 2025-06-23 09:50:58
  • @FilePath: \go-toolbox\pkg\retry\retry.go

* @Description: 重试机制 * * 主要功能: * - 支持自定义最大尝试次数和重试间隔 * - 支持指数退避策略(Exponential Backoff) * - 支持随机抖动(Jitter)避免惊群效应 * - 支持上下文取消和超时控制 * - 支持自定义重试条件函数 * - 支持成功/失败回调函数 * * 退避倍数(Backoff Multiplier)说明: * 退避倍数用于实现指数退避策略,每次重试失败后,下一次重试的等待时间会乘以退避倍数。 * 公式: 下一次间隔 = 当前间隔 × 退避倍数 * * 示例(初始间隔100ms,退避倍数2.0,最大间隔1s): * | 重试次数 | 等待时间 | * |---------|---------| * | 第1次失败后 | 100ms | * | 第2次失败后 | 200ms (100 × 2) | * | 第3次失败后 | 400ms (200 × 2) | * | 第4次失败后 | 800ms (400 × 2) | * | 第5次失败后 | 1000ms (受 maxInterval 限制) | * * 使用场景: * - 避免服务雪崩:当服务暂时不可用时,逐渐增大重试间隔 * - 网络抖动恢复:给网络足够的恢复时间 * - 资源竞争:减少对有限资源的争抢 * * 使用示例: * retry.New(). * SetAttemptCount(5). * SetInterval(100 * time.Millisecond). * SetBackoffMultiplier(2.0). * SetMaxInterval(5 * time.Second). * SetJitter(true). * Do(func() error { * return someOperation() * }) * * Copyright (c) 2024 by kamalyes, All Rights Reserved.

  • @Author: kamalyes 501893067@qq.com
  • @Date: 2025-06-13 15:51:15
  • @LastEditors: kamalyes 501893067@qq.com
  • @LastEditTime: 2025-06-16 13:49:29
  • @FilePath: \go-toolbox\pkg\retry\runner.go
  • @Description: *
  • Copyright (c) 2025 by kamalyes, All Rights Reserved.

Index

Constants

This section is empty.

Variables

View Source
var (
	ErrTimeout   = errors.New("function execution timeout")
	ErrFunIsNil  = errors.New("fn cannot be nil")
	ErrLockIsNil = errors.New("lock cannot be nil")
	ErrPanic     = "panic recovered"
)

Functions

This section is empty.

Types

type DoFun

type DoFun func() error

DoFun 定义执行函数的类型

type ErrCallbackFunc

type ErrCallbackFunc func(nowAttemptCount, remainCount int, err error, funcName ...string)

ErrCallbackFunc 是重试时的错误回调函数类型 nowAttemptCount 表示当前尝试次数 remainCount 表示剩余尝试次数 err 是当前执行时的错误信息

type Retry

type Retry struct {
	// contains filtered or unexported fields
}

Retry 结构体用于实现重试机制

func NewRetry

func NewRetry() *Retry

New 创建一个重试器,返回一个 Retry 实例

func NewRetryWithCtx

func NewRetryWithCtx(ctx context.Context) *Retry

NewRetryWithCtx 创建一个自定义上下文的重试器,返回一个 Retry实例

func (*Retry) Do

func (r *Retry) Do(fn DoFun) (err error)

Do 为 Retry 结构体定义执行函数,执行指定函数 f

锁只用来快照配置,重试循环、被重试的函数与每次退避 sleep 都在锁外执行

原先整个 Do 包在写锁里,带来三个问题:

  1. 被重试的函数在持锁状态下运行,而 sync.Mutex 不可重入——函数里只要读一下 自己的 Retry(打日志时读 attemptCount 这种很自然的写法)就直接死锁
  2. 锁跨越每次退避 sleep,并发的 Get* 要等整个重试窗口,带退避可达数秒
  3. 同一个 Retry 上的两次 Do 完全串行,第二次要等第一次把重试全跑完

[EN] The lock now only snapshots the configuration; the retry loop, the retried function and every backoff sleep run outside it. Wrapping all of Do in the write lock caused three problems: the retried function ran while holding a non-reentrant mutex, so reading its own Retry (as one naturally does when logging attemptCount) deadlocked outright; the lock spanned every backoff sleep, blocking concurrent Get* for the whole retry window; and two Do calls on one Retry serialised completely

func (*Retry) GetAttemptCount

func (r *Retry) GetAttemptCount() int

GetAttemptCount 获取最大尝试次数

func (*Retry) GetBackoffMultiplier

func (r *Retry) GetBackoffMultiplier() float64

GetBackoffMultiplier 获取退避倍数

func (*Retry) GetCaller

func (r *Retry) GetCaller() string

GetCaller 获取调用者信息

func (*Retry) GetConditionFunc

func (r *Retry) GetConditionFunc() func(error) bool

GetConditionFunc 获取重试条件函数

func (*Retry) GetContext

func (r *Retry) GetContext() context.Context

GetContext 获取上下文

func (*Retry) GetErrCallback

func (r *Retry) GetErrCallback() ErrCallbackFunc

GetErrCallback 获取错误回调函数

func (*Retry) GetInterval

func (r *Retry) GetInterval() time.Duration

GetInterval 获取重试间隔时间

func (*Retry) GetJitter

func (r *Retry) GetJitter() bool

GetJitter 获取是否添加随机抖动

func (*Retry) GetJitterPercent

func (r *Retry) GetJitterPercent() float64

GetJitterPercent 获取抖动百分比

func (*Retry) GetMaxInterval

func (r *Retry) GetMaxInterval() time.Duration

GetMaxInterval 获取最大重试间隔时间

func (*Retry) GetSuccessCallback

func (r *Retry) GetSuccessCallback() SuccessCallbackFunc

GetSuccessCallback 获取成功回调函数

func (*Retry) SetAttemptCount

func (r *Retry) SetAttemptCount(attemptCount int) *Retry

SetAttemptCount 设置最大尝试次数,返回 Retry 实例以支持链式调用

func (*Retry) SetBackoffMultiplier

func (r *Retry) SetBackoffMultiplier(multiplier float64) *Retry

SetBackoffMultiplier 设置退避倍数,返回 Retry 实例以支持链式调用

func (*Retry) SetCaller

func (r *Retry) SetCaller(caller string) *Retry

SetCaller 设置调用者信息,返回 Retry 实例以支持链式调用

func (*Retry) SetConditionFunc

func (r *Retry) SetConditionFunc(fn func(error) bool) *Retry

SetConditionFunc 设置重试条件函数

func (*Retry) SetErrCallback

func (r *Retry) SetErrCallback(fn ErrCallbackFunc) *Retry

SetErrCallback 设置错误回调函数,返回 Retry 实例以支持链式调用

func (*Retry) SetInterval

func (r *Retry) SetInterval(interval time.Duration) *Retry

SetInterval 设置重试间隔时间,返回 Retry 实例以支持链式调用

func (*Retry) SetJitter

func (r *Retry) SetJitter(jitter bool) *Retry

SetJitter 设置是否添加随机抖动,返回 Retry 实例以支持链式调用

func (*Retry) SetJitterPercent

func (r *Retry) SetJitterPercent(percent float64) *Retry

SetJitterPercent 设置抖动百分比(0-1),返回 Retry 实例以支持链式调用 例如: 0.2 表示 ±20% 的抖动范围,0.005 表示 ±0.5% 的抖动范围

func (*Retry) SetMaxInterval

func (r *Retry) SetMaxInterval(maxInterval time.Duration) *Retry

SetMaxInterval 设置最大重试间隔时间,返回 Retry 实例以支持链式调用

func (*Retry) SetSuccessCallback

func (r *Retry) SetSuccessCallback(fn SuccessCallbackFunc) *Retry

SetSuccessCallback 设置成功回调函数,返回 Retry 实例以支持链式调用

type Runner

type Runner[T any] struct {
	// contains filtered or unexported fields
}

Runner 是一个支持泛型的任务执行器, 提供超时控制、panic 捕获以及成功和失败的回调处理机制。

func NewRunner

func NewRunner[T any]() *Runner[T]

NewRunner 创建一个新的 Runner 实例,泛型类型由调用时指定

func (*Runner[T]) CustomTimeoutErr

func (r *Runner[T]) CustomTimeoutErr(err error) *Runner[T]

CustomTimeoutErr 设置自定义的超时错误,任务超时时返回该错误

func (*Runner[T]) GetTimeout

func (r *Runner[T]) GetTimeout() time.Duration

GetTimeout 获取超时时间

func (*Runner[T]) OnError

func (r *Runner[T]) OnError(fn func(result T, err error)) *Runner[T]

设置失败回调

func (*Runner[T]) OnSuccess

func (r *Runner[T]) OnSuccess(fn func(result T, err error)) *Runner[T]

设置成功回调

func (*Runner[T]) OnTimeout

func (r *Runner[T]) OnTimeout(fn func()) *Runner[T]

OnTimeout 设置任务超时时的回调函数

func (*Runner[T]) Run

func (r *Runner[T]) Run(fn func(ctx context.Context) (T, error)) (result T, err error)

Run 执行任务函数 fn,支持超时控制、panic 捕获和回调处理 fn 接收 context.Context,返回泛型结果和错误

func (*Runner[T]) RunWithLock

func (r *Runner[T]) RunWithLock(lock syncx.Locker, fn func(ctx context.Context) (T, error)) (T, error)

RunWithLock 带锁执行任务,保证同一时刻只有一个任务执行 lock 必须实现 syncx.Locker 接口

func (*Runner[T]) Timeout

func (r *Runner[T]) Timeout(d time.Duration) *Runner[T]

Timeout 设置任务执行的超时时间

type SuccessCallbackFunc

type SuccessCallbackFunc func(funcName ...string)

SuccessCallbackFunc 是成功回调函数类型

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL