GithubHelp home page GithubHelp logo

backoff's Introduction

backoff

A simple exponential backoff counter.

The algorithm is based on google.

Github issues Github forks Github stars

LOGO

install

go get github.com/kskumgk63/backoff

Examples

no options

Repeat alwaysErr() at intervals of backoff time until the timeout occurs.

func alwaysErr() error {
	return errors.New("internal server error")
}

func main() {
	cmd := backoff.NewCommander()
	if timeoutErr := cmd.Exec(alwaysErr); timeoutErr != nil {
		fmt.Println(timeoutErr)
	}
}

After 65s, this message is printed. No messages during exponential backoff loop.

Ends the exponential backoff because of timeout

change timeout

Change the timeout value to 10 seconds.

func alwaysErr() error {
	return errors.New("internal server error")
}

func main() {
	cmd := backoff.NewCommander(
		backoff.Timeout(5 * time.Second),
	)
	if timeoutErr := cmd.Exec(alwaysErr); timeoutErr != nil {
		fmt.Println(timeoutErr)
	}
}

After 5s, this message is printed. No messages during exponential backoff loop.

Ends the exponential backoff because of timeout

abort backoff loop

The backoff loop is aborted when a specific error occurs.

This example below prints nothing, exit 0.

func alwaysErr() error {
	return errors.New("internal server error")
}

func main() {
	cmd := backoff.NewCommander(
		backoff.AbortLoop(func(err error) {
			return err.Error() == "internal server error"
		}),
	)
	if timeoutErr := cmd.Exec(alwaysErr); timeoutErr != nil {
		fmt.Println(timeoutErr)
	}
}

debug mode on

if debug mode is on, prints errors when repeating alwaysErr()

func alwaysErr() error {
	return errors.New("internal server error")
}

func main() {
	cmd := backoff.NewCommander(
		backoff.DebugModeOn(),
	)
	cmd.Exec(alwaysErr)
}
internal server error
waiting 2.020000s...
internal server error
waiting 4.564000s...
internal server error
waiting 8.586000s...
internal server error
waiting 16.869000s...
.
.
.

change debug printer

func alwaysErr() error {
	return errors.New("internal server error")
}

func main() {
	cmd := backoff.NewCommander(
		backoff.Timeout(10*time.Second),
		backoff.DebugModeOn(),
		backoff.DebugPrint(func(err error) {
			fmt.Printf("[ERR] %+v\n", err)
		}),
	)
	if timeoutErr := cmd.Exec(alwaysErr); timeoutErr != nil {
		fmt.Println(timeoutErr)
	}
}

You can change a debug printer!

[ERR] internal server error
waiting 2.088000s...
[ERR] internal server error
waiting 4.904000s...
[ERR] internal server error
waiting 8.212000s...
Ends the exponential backoff because of timeout

See more options.

backoff's People

Contributors

keisku avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.