# gretry **Repository Path**: kaylee595/gretry ## Basic Information - **Project Name**: gretry - **Description**: GO语言函数重试模块 - **Primary Language**: Go - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-05-01 - **Last Updated**: 2025-11-07 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README gretry是一个重试工具, 它可以用于任何需要重试的场景, 比如网络请求, 数据库操作等, 只要出现了错误你想进行重试, 就可以使用gretry. # 安装 ```shell go get gitee.com/kaylee595/gretry/v2 ``` # 快速开始 ```go package main import ( "context" "fmt" "gitee.com/kaylee595/gretry/v2" "io" "net/http" ) func main() { resp, err := gretry.DoWithValue(context.Background(), func(ctx context.Context) (*http.Response, error) { return http.Get("https://www.google.com") }, ) if err != nil { panic(err) } defer resp.Body.Close() body, err := io.ReadAll(resp.Body) if err != nil { panic(err) } fmt.Println(string(body)) } ``` 默认的retry最多会调用目标函数7次(在所有情况都失败时), 并且每次重试将会采用以下间隔策略: ```go // DefaultDelayCalculator 指数退避+抖动. // 第一次尝试等待 200ms + random(50 - 150)ms, // 第二次尝试等待 200ms + random(50 - 150)ms, // 第三次尝试等待 400ms + random(50 - 150)ms, ... // 最大延迟不超过 2.15s. var DefaultDelayCalculator = DCWithJitter( DCExponential(200*time.Millisecond, 2*time.Second), 50*time.Millisecond, 150*time.Millisecond, ) ``` # 自定义retry的行为 你可以在`Do`函数添加`Option`来改变默认行为: ```go resp, err := gretry.DoWithValue(context.Background(), func(ctx context.Context) (*http.Response, error) { return http.Get("https://www.google.com") }, gretry.WithAttempts(2), // 这将调用目标函数最多3次 gretry.WithDelayCalculator(gretry.DCFixed(time.Second)), // 每次尝试的间隔固定1秒 gretry.WithRetryIf(func(err error) bool { // 当发生超时错误时, 不再进行尝试 return !errors.Is(err, context.DeadlineExceeded) }), ) ``` # 注意 你需要关注Attempts的设定是否符合预期. ```go // WithAttempts 实际函数被调用次数是attempts+1, 因为首次调用不被认为是尝试, 只有在之后调用出错时, 才会被开始计数, // 因此attempts为1时, 目标函数会被调用2次; attempts为2时, 目标函数会被调用3次. // 当attempts为0时, 目标函数将会被一直尝试直到成功. func WithAttempts(attempts uint) Option { return optionFunc(func(c configurableRetester) { c.setAttempts(attempts) }) } ```