mirror of
https://github.com/2930134478/AI-CS.git
synced 2026-06-15 00:44:30 +08:00
65 lines
1.2 KiB
Go
65 lines
1.2 KiB
Go
package rag
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"time"
|
|
)
|
|
|
|
// RetryConfig 重试配置
|
|
type RetryConfig struct {
|
|
MaxAttempts int
|
|
InitialDelay time.Duration
|
|
MaxDelay time.Duration
|
|
BackoffFactor float64
|
|
}
|
|
|
|
// DefaultRetryConfig 默认重试配置
|
|
func DefaultRetryConfig() RetryConfig {
|
|
return RetryConfig{
|
|
MaxAttempts: 3,
|
|
InitialDelay: 100 * time.Millisecond,
|
|
MaxDelay: 5 * time.Second,
|
|
BackoffFactor: 2.0,
|
|
}
|
|
}
|
|
|
|
// Retry 重试执行函数
|
|
func Retry(ctx context.Context, config RetryConfig, fn func() error) error {
|
|
var lastErr error
|
|
delay := config.InitialDelay
|
|
|
|
for attempt := 0; attempt < config.MaxAttempts; attempt++ {
|
|
// 检查上下文是否已取消
|
|
select {
|
|
case <-ctx.Done():
|
|
return ctx.Err()
|
|
default:
|
|
}
|
|
|
|
// 执行函数
|
|
err := fn()
|
|
if err == nil {
|
|
return nil
|
|
}
|
|
|
|
lastErr = err
|
|
|
|
// 如果不是最后一次尝试,等待后重试
|
|
if attempt < config.MaxAttempts-1 {
|
|
select {
|
|
case <-ctx.Done():
|
|
return ctx.Err()
|
|
case <-time.After(delay):
|
|
// 指数退避
|
|
delay = time.Duration(float64(delay) * config.BackoffFactor)
|
|
if delay > config.MaxDelay {
|
|
delay = config.MaxDelay
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return fmt.Errorf("重试 %d 次后仍然失败: %w", config.MaxAttempts, lastErr)
|
|
}
|