Need help with backoff?
Click the “chat” button below for chat support from the developer who created it, or find similar developers for support.

About the developer

jpillora
503 Stars 51 Forks MIT License 33 Commits 0 Opened issues

Description

Simple backoff algorithm in Go (golang)

Services available

!
?

Need anything else?

Contributors list

# 2,563
Go
golang
world-o...
jQuery
14 commits
# 215,421
market-...
Jenkins
backoff
golang
4 commits
# 317,570
Go
backoff
golang
firebas...
2 commits
# 19,386
TypeScr...
React
Redis
GraphQL
1 commit
# 449,576
Go
backoff
golang
1 commit
# 50,089
Go
Shell
transac...
qrcode-...
1 commit
# 424,034
backoff
golang
C
1 commit

Backoff

A simple exponential backoff counter in Go (Golang)

GoDoc Circle CI

Install

$ go get -v github.com/jpillora/backoff

Usage

Backoff is a

time.Duration
counter. It starts at
Min
. After every call to
Duration()
it is multiplied by
Factor
. It is capped at
Max
. It returns to
Min
on every call to
Reset()
.
Jitter
adds randomness (see below). Used in conjunction with the
time
package.

Simple example

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!
100ms


Example using
net
package

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 }


Example using
Jitter

Enabling

Jitter
adds some randomization to the backoff durations. See Amazon's writeup of performance gains using jitter. Seeding is not necessary but doing so gives repeatable results.
import "math/rand"

b := &backoff.Backoff{ Jitter: true, }

rand.Seed(42)

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()) fmt.Printf("%s\n", b.Duration()) fmt.Printf("%s\n", b.Duration())

100ms
106.600049ms
281.228155ms
Reset!
100ms
104.381845ms
214.957989ms

Documentation

https://godoc.org/github.com/jpillora/backoff

Credits

Forked from some JavaScript written by @tj

We use cookies. If you continue to browse the site, you agree to the use of cookies. For more information on our use of cookies please see our Privacy Policy.