Tryagain

Simple golang module using retry pattern.
Features
- Max retries
- Max time in ms
- Time between retries in ms
- Linear backoff
- Exponential backoff
- Random backoff
Installation
go get github.com/mcoup/tryagain
Usage
Simple try:
url := "https://127.0.0.1"
err := tryagain.Try().
MaxTries(3).
MaxTime(400). // ms
TimeBetween(50). // ms
LinearBackoff().
Do(func() error {
_, err := http.Get(url)
if err != nil {
return err
}
return nil
})
if err != nil {
fmt.Println(err)
}
// Get https://127.0.0.1: dial tcp 127.0.0.1:443: connect: connection refused
// Get https://127.0.0.1: dial tcp 127.0.0.1:443: connect: connection refused
// Get https://127.0.0.1: dial tcp 127.0.0.1:443: connect: connection refused
// max retries reached
Or reuse:
r := tryagain.
Try().
MaxTries(3).
MaxTime(400).
TimeBetween(50)
// first
err = r.Do(func() error {
return fmt.Errorf("an err")
})
if err != nil {
fmt.Println(err)
}
// second
err = r.Do(func() error {
return fmt.Errorf("an err")
})
if err != nil {
fmt.Println(err)
}
Backoff strategies:
// linear
r := tryagain.Try().
MaxTries(3).
MaxTime(400).
TimeBetween(50).
LinearBackoff()
// exponential
r := tryagain.Try().
MaxTries(3).
MaxTime(400).
TimeBetween(50).
ExponentialBackoff()
// random
r := tryagain.Try().
MaxTries(3).
MaxTime(400).
TimeBetween(50).
RandomBackoff()
Contributing
PRs are always welcome.
Why
Quite a few go modules implement some retry mechanism but so far I have not found one that is as straightforward as I would like it to be.
Some references: