logo
0
0
WeChat Login
📝 docs: 完善 README 文档,添加详细功能说明和使用示例

retry-go

一个简单而强大的 Go 语言库,用于实现各种重试机制,支持多种延迟策略、错误处理和自定义配置。

功能特性

  • 支持多种延迟策略(固定延迟、指数退避、带抖动的指数退避等)
  • 支持针对特定错误的重试次数配置
  • 支持无限重试
  • 支持上下文取消
  • 支持重试回调
  • 支持带数据返回的重试函数
  • 支持错误包装和处理

安装

使用 Go 模块安装:

go get cnb.cool/zhiqiangwang/pkg/retry-go

基本使用

简单重试

import "cnb.cool/zhiqiangwang/pkg/retry-go" func main() { err := retry.Do(func() error { // 执行可能失败的操作 return someOperation() }) if err != nil { // 处理错误 } }

带数据返回的重试

import "cnb.cool/zhiqiangwang/pkg/retry-go" func main() { result, err := retry.DoWithData(func() (string, error) { // 执行可能失败的操作并返回数据 return someOperationWithResult() }) if err != nil { // 处理错误 } // 使用结果 fmt.Println(result) }

高级配置

配置重试次数

// 最多重试 5 次 err := retry.Do(func() error { return someOperation() }, retry.Attempts(5)) // 无限重试,直到成功 err := retry.Do(func() error { return someOperation() }, retry.UntilSucceeded())

配置延迟策略

// 固定延迟 err := retry.Do(func() error { return someOperation() }, retry.Delay(100*time.Millisecond), retry.DelayType(retry.FixedDelay)) // 指数退避延迟 err := retry.Do(func() error { return someOperation() }, retry.Delay(100*time.Millisecond), retry.DelayType(retry.BackOffDelay)) // 带抖动的指数退避延迟 err := retry.Do(func() error { return someOperation() }, retry.Delay(100*time.Millisecond), retry.DelayType(retry.FullJitterBackoffDelay)) // 组合延迟策略 err := retry.Do(func() error { return someOperation() }, retry.Delay(100*time.Millisecond), retry.MaxJitter(50*time.Millisecond), retry.DelayType(retry.CombineDelay(retry.BackOffDelay, retry.RandomDelay)))

配置针对特定错误的重试次数

testErr := errors.New("temporary error") err := retry.Do(func() error { if condition { return testErr } return someOperation() }, retry.AttemptsForError(3, testErr))

配置重试回调

err := retry.Do(func() error { return someOperation() }, retry.OnRetry(func(attempt uint, err error) { fmt.Printf("Attempt %d failed: %v\n", attempt, err) }))

配置上下文

ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() err := retry.Do(func() error { return someOperation() }, retry.Context(ctx))

配置错误处理

// 标记错误为不可恢复,遇到此错误将不再重试 err := retry.Do(func() error { if fatalCondition { return retry.Unrecoverable(errors.New("fatal error")) } return someOperation() }) // 只返回最后一个错误 err := retry.Do(func() error { return someOperation() }, retry.LastErrorOnly(true))

延迟策略

策略描述
FixedDelay固定延迟时间
BackOffDelay指数退避延迟
RandomDelay随机延迟
FullJitterBackoffDelay带抖动的指数退避延迟
CombineDelay组合多种延迟策略

测试

运行测试:

go test -v

示例

示例 1:网络请求重试

import ( "cnb.cool/zhiqiangwang/pkg/retry-go" "fmt" "io" "net/http" "time" ) func fetchData(url string) (string, error) { var data string err := retry.Do(func() error { resp, err := http.Get(url) if err != nil { return err } defer resp.Body.Close() // 检查 HTTP 状态码 if resp.StatusCode != http.StatusOK { return fmt.Errorf("unexpected status code: %d", resp.StatusCode) } body, err := io.ReadAll(resp.Body) if err != nil { return err } data = string(body) return nil }, retry.Attempts(3), // 最多重试 3 次 retry.Delay(1*time.Second), // 基础延迟 1 秒 retry.MaxDelay(10*time.Second), // 最大延迟 10 秒 retry.DelayType(retry.BackOffDelay), // 使用指数退避延迟 retry.OnRetry(func(attempt uint, err error) { fmt.Printf("Attempt %d failed: %v\n", attempt, err) })) return data, err } // 使用示例 func main() { url := "https://api.example.com/data" data, err := fetchData(url) if err != nil { fmt.Printf("Failed to fetch data: %v\n", err) return } fmt.Printf("Fetched data: %s\n", data) }

示例 2:数据库连接重试

func connectDB(dsn string) (*sql.DB, error) { var db *sql.DB err := retry.Do(func() error { var err error db, err = sql.Open("mysql", dsn) if err != nil { return err } return db.Ping() }, retry.Attempts(5), retry.Delay(2*time.Second), retry.DelayType(retry.BackOffDelay)) return db, err }

许可证

Apache License 2.0

About

一个简单的 Go 语言库,用于重试机制

88.00 KiB
0 forks0 stars1 branches1 TagREADMEApache-2.0 license