feat: super 新增 ConditionalRetryByExponentialBackoff 函数,支持可中断的退避指数算法重试
This commit is contained in:
parent
dd3f3ede07
commit
274402e721
|
@ -47,8 +47,20 @@ func RetryByRule(f func() error, rule func(count int) time.Duration) error {
|
||||||
// - multiplier:延迟时间的乘数,通常为 2
|
// - multiplier:延迟时间的乘数,通常为 2
|
||||||
// - randomization:延迟时间的随机化因子,通常为 0.5
|
// - randomization:延迟时间的随机化因子,通常为 0.5
|
||||||
func RetryByExponentialBackoff(f func() error, maxRetries int, baseDelay, maxDelay time.Duration, multiplier, randomization float64) error {
|
func RetryByExponentialBackoff(f func() error, maxRetries int, baseDelay, maxDelay time.Duration, multiplier, randomization float64) error {
|
||||||
|
return ConditionalRetryByExponentialBackoff(f, nil, maxRetries, baseDelay, maxDelay, multiplier, randomization)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ConditionalRetryByExponentialBackoff 该函数与 RetryByExponentialBackoff 类似,但是可以被中断
|
||||||
|
// - cond 为中断条件,当 cond 返回 false 时,将会中断重试
|
||||||
|
//
|
||||||
|
// 该函数通常用于在重试过程中,需要中断重试的场景,例如:
|
||||||
|
// - 用户请求开始游戏,由于网络等情况,进入重试状态。此时用户再次发送开始游戏请求,此时需要中断之前的重试,避免重复进入游戏
|
||||||
|
func ConditionalRetryByExponentialBackoff(f func() error, cond func() bool, maxRetries int, baseDelay, maxDelay time.Duration, multiplier, randomization float64) error {
|
||||||
retry := 0
|
retry := 0
|
||||||
for {
|
for {
|
||||||
|
if cond != nil && !cond() {
|
||||||
|
return fmt.Errorf("interrupted")
|
||||||
|
}
|
||||||
err := f()
|
err := f()
|
||||||
if err == nil {
|
if err == nil {
|
||||||
return nil
|
return nil
|
||||||
|
|
Loading…
Reference in New Issue