MCPcopy Index your code
hub / github.com/jpillora/backoff

github.com/jpillora/backoff @1.0.0

Chat with this repo
repository ↗ · DeepWiki ↗ · release 1.0.0 ↗ · + Follow
14 symbols 53 edges 2 files 5 documented · 36% 74 cross-repo links
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

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

Core symbols most depended-on inside this repo

Duration
called by 22
backoff.go
Reset
called by 6
backoff.go
Attempt
called by 6
backoff.go
ForAttempt
called by 5
backoff.go

Shape

Function 9
Method 4
Struct 1

Languages

Go100%

Modules by API surface

backoff_test.go9 symbols
backoff.go5 symbols

For agents

$ claude mcp add backoff \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact

Ask about this repo answers extend the page