Go(Go语言)中的简单回退算法
Go (Golang) 中的简单指数退避计数器
$ go get -v github.com/jpillora/backoffBackoff 是一个 time.Duration 计数器。它的初始值为 Min。每次调用 Duration() 后,它都会乘以 Factor。它的上限为 Max。每次调用 Reset() 后,它都会回到 Min。Jitter 会添加随机性(参见下面) 。与 time 包一起使用。
b := &backoff.Backoff{
//These are the defaults
Min: 100 * time.Millisecond,
Max: 10 * time.Second,
Factor: 2,
Jitter: false,
}
fmt.Printf("%s\n", b.Duration())
fmt.Printf("%s\n", b.Duration())
fmt.Printf("%s\n", b.Duration())
fmt.Printf("Reset!\n")
b.Reset()
fmt.Printf("%s\n", b.Duration())100ms
200ms
400ms
Reset!
100msnet 包的示例b := &backoff.Backoff{
Max: 5 * time.Minute,
}
for {
conn, err := net.Dial("tcp", "example.com:5309")
if err != nil {
d := b.Duration()
fmt.Printf("%s, reconnecting in %s", err, d)
time.Sleep(d)
continue
}
//connected
b.Reset()
conn.Write([]byte("hello world!"))
// ... Read ... Write ... etc
conn.Close()
//disconnected
}
Jitter 的示例启用 Jitter 会为回退时长添加一些随机性。请参阅 Amazon 关于使用 Jitter 提高性能的说明。种子不必设置,但设置后可获得可重复的结果。
暂无开放 Issues,或尚未同步最近议题。