0%

go 重试机制

在日常编码中,有很多不确定结果,比如网络请求,不确定什么时候能够成功,这就需要我们有一种重试机制,保证服务的高可用性.

重试分为以下几种情况:

  • 重试固定次数
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // 重试固定次数
    func RetryCount(count int, fn func() error) bool {
    for i := 0; i < count; i++ {
    err := fn()
    if err == nil {
    return true
    }
    }
    return false
    }

  • 在特定时间内重试不定次数,失败后休眠一段时间后继续重试
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// 在 duration 内,一直调用 fn,直到成功,失败后等待 sleep
func RetryToTimeOut(duration time.Duration, sleep time.Duration, fn func() error) bool {
ch := make(chan struct{})
isEnd := false
go func() {
for {
if isEnd {
break
}
err := fn()
if err == nil {
break
}
time.Sleep(sleep)
}
ch <- struct{}{}
}()
select {
case <-ch:
return true
case <-time.After(duration):
isEnd = true
return false
}
}

如果自定义的函数不是返回error,需要使用闭包再包一下.