Files
AI-CS/backend/service/rag/retry.go
T
2026-02-02 21:41:47 +08:00

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