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) }