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 ¶
- Variables
- type DoFun
- type ErrCallbackFunc
- type Retry
- func (r *Retry) Do(fn DoFun) (err error)
- func (r *Retry) GetAttemptCount() int
- func (r *Retry) GetBackoffMultiplier() float64
- func (r *Retry) GetCaller() string
- func (r *Retry) GetConditionFunc() func(error) bool
- func (r *Retry) GetContext() context.Context
- func (r *Retry) GetErrCallback() ErrCallbackFunc
- func (r *Retry) GetInterval() time.Duration
- func (r *Retry) GetJitter() bool
- func (r *Retry) GetJitterPercent() float64
- func (r *Retry) GetMaxInterval() time.Duration
- func (r *Retry) GetSuccessCallback() SuccessCallbackFunc
- func (r *Retry) SetAttemptCount(attemptCount int) *Retry
- func (r *Retry) SetBackoffMultiplier(multiplier float64) *Retry
- func (r *Retry) SetCaller(caller string) *Retry
- func (r *Retry) SetConditionFunc(fn func(error) bool) *Retry
- func (r *Retry) SetErrCallback(fn ErrCallbackFunc) *Retry
- func (r *Retry) SetInterval(interval time.Duration) *Retry
- func (r *Retry) SetJitter(jitter bool) *Retry
- func (r *Retry) SetJitterPercent(percent float64) *Retry
- func (r *Retry) SetMaxInterval(maxInterval time.Duration) *Retry
- func (r *Retry) SetSuccessCallback(fn SuccessCallbackFunc) *Retry
- type Runner
- func (r *Runner[T]) CustomTimeoutErr(err error) *Runner[T]
- func (r *Runner[T]) GetTimeout() time.Duration
- func (r *Runner[T]) OnError(fn func(result T, err error)) *Runner[T]
- func (r *Runner[T]) OnSuccess(fn func(result T, err error)) *Runner[T]
- func (r *Runner[T]) OnTimeout(fn func()) *Runner[T]
- func (r *Runner[T]) Run(fn func(ctx context.Context) (T, error)) (result T, err error)
- func (r *Runner[T]) RunWithLock(lock syncx.Locker, fn func(ctx context.Context) (T, error)) (T, error)
- func (r *Runner[T]) Timeout(d time.Duration) *Runner[T]
- type SuccessCallbackFunc
Constants ¶
This section is empty.
Variables ¶
Functions ¶
This section is empty.
Types ¶
type ErrCallbackFunc ¶
ErrCallbackFunc 是重试时的错误回调函数类型 nowAttemptCount 表示当前尝试次数 remainCount 表示剩余尝试次数 err 是当前执行时的错误信息
type Retry ¶
type Retry struct {
// contains filtered or unexported fields
}
Retry 结构体用于实现重试机制
func NewRetryWithCtx ¶
NewRetryWithCtx 创建一个自定义上下文的重试器,返回一个 Retry实例
func (*Retry) Do ¶
Do 为 Retry 结构体定义执行函数,执行指定函数 f
锁只用来快照配置,重试循环、被重试的函数与每次退避 sleep 都在锁外执行
原先整个 Do 包在写锁里,带来三个问题:
- 被重试的函数在持锁状态下运行,而 sync.Mutex 不可重入——函数里只要读一下 自己的 Retry(打日志时读 attemptCount 这种很自然的写法)就直接死锁
- 锁跨越每次退避 sleep,并发的 Get* 要等整个重试窗口,带退避可达数秒
- 同一个 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) GetBackoffMultiplier ¶
GetBackoffMultiplier 获取退避倍数
func (*Retry) GetConditionFunc ¶
GetConditionFunc 获取重试条件函数
func (*Retry) GetErrCallback ¶
func (r *Retry) GetErrCallback() ErrCallbackFunc
GetErrCallback 获取错误回调函数
func (*Retry) GetJitterPercent ¶
GetJitterPercent 获取抖动百分比
func (*Retry) GetMaxInterval ¶
GetMaxInterval 获取最大重试间隔时间
func (*Retry) GetSuccessCallback ¶
func (r *Retry) GetSuccessCallback() SuccessCallbackFunc
GetSuccessCallback 获取成功回调函数
func (*Retry) SetAttemptCount ¶
SetAttemptCount 设置最大尝试次数,返回 Retry 实例以支持链式调用
func (*Retry) SetBackoffMultiplier ¶
SetBackoffMultiplier 设置退避倍数,返回 Retry 实例以支持链式调用
func (*Retry) SetConditionFunc ¶
SetConditionFunc 设置重试条件函数
func (*Retry) SetErrCallback ¶
func (r *Retry) SetErrCallback(fn ErrCallbackFunc) *Retry
SetErrCallback 设置错误回调函数,返回 Retry 实例以支持链式调用
func (*Retry) SetInterval ¶
SetInterval 设置重试间隔时间,返回 Retry 实例以支持链式调用
func (*Retry) SetJitterPercent ¶
SetJitterPercent 设置抖动百分比(0-1),返回 Retry 实例以支持链式调用 例如: 0.2 表示 ±20% 的抖动范围,0.005 表示 ±0.5% 的抖动范围
func (*Retry) SetMaxInterval ¶
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 (*Runner[T]) CustomTimeoutErr ¶
CustomTimeoutErr 设置自定义的超时错误,任务超时时返回该错误
type SuccessCallbackFunc ¶
type SuccessCallbackFunc func(funcName ...string)
SuccessCallbackFunc 是成功回调函数类型