backoff

package module
v0.0.0-...-6f00f4f Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Feb 5, 2016 License: MIT Imports: 3 Imported by: 5

README

Backoff

A simple backoff algorithm in Go (Golang)

GoDoc Build Status

Install

$ go get -v github.com/dnaeon/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 and 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 the 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

Credits

Ported from some JavaScript written by @tj This package is a fork of https://github.com/jpillora/backoff

License

backoff is open source and licensed under the MIT License.

Please refer to the included LICENSE file for more details.

Documentation

Index

Constants

This section is empty.

Variables

View Source
var DefaultBackoff = &Backoff{
	Min:    100 * time.Millisecond,
	Max:    10 * time.Second,
	Factor: 2.0,
	Jitter: false,
}

Functions

This section is empty.

Types

type Backoff

type Backoff struct {
	// Factor is the multiplying factor for each increment step
	Factor float64

	// Jitter eases contention by randomizing backoff steps
	Jitter bool

	// Min and Max are the minimum and maximum values of the counter
	Min, Max time.Duration
	// contains filtered or unexported fields
}

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(). Used in conjunction with the time package.

func (*Backoff) Duration

func (b *Backoff) Duration() time.Duration

Returns the current value of the counter and then multiplies it by Factor

func (*Backoff) Reset

func (b *Backoff) Reset()

Resets the current value of the counter back to Min

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL