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
475 Stars 46 Forks MIT License 33 Commits 0 Opened issues

Description

Simple backoff algorithm in Go (golang)

Services available

!
?

Need anything else?

Contributors list

# 2,353
Go
golang
world-o...
jQuery
14 commits
# 223,322
market-...
HTML
Jenkins
backoff
4 commits
# 314,297
Go
backoff
golang
firebas...
2 commits
# 16,547
Go
TypeScr...
React
Redis
1 commit
# 457,059
Go
backoff
golang
1 commit
# 49,876
Go
Shell
backoff
qrcode-...
1 commit
# 426,548
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.