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