Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/rican7/retry
A simple, stateless, functional mechanism to perform actions repetitively until successful.
https://github.com/rican7/retry
backoff delay exponential fibonacci functional go incremental jitter limit linear retry stateless wait
Last synced: 5 days ago
JSON representation
A simple, stateless, functional mechanism to perform actions repetitively until successful.
- Host: GitHub
- URL: https://github.com/rican7/retry
- Owner: Rican7
- License: mit
- Created: 2016-06-28T07:34:15.000Z (over 8 years ago)
- Default Branch: master
- Last Pushed: 2023-02-14T20:49:40.000Z (almost 2 years ago)
- Last Synced: 2025-01-24T13:05:35.276Z (12 days ago)
- Topics: backoff, delay, exponential, fibonacci, functional, go, incremental, jitter, limit, linear, retry, stateless, wait
- Language: Go
- Homepage: https://pkg.go.dev/github.com/Rican7/retry
- Size: 54.7 KB
- Stars: 475
- Watchers: 10
- Forks: 28
- Open Issues: 3
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# retry
[![Build Status](https://github.com/Rican7/retry/actions/workflows/main.yml/badge.svg?branch=master)](https://github.com/Rican7/retry/actions/workflows/main.yml)
[![Coverage Status](https://coveralls.io/repos/github/Rican7/retry/badge.svg)](https://coveralls.io/github/Rican7/retry)
[![Go Report Card](https://goreportcard.com/badge/Rican7/retry)](http://goreportcard.com/report/Rican7/retry)
[![Go Reference](https://pkg.go.dev/badge/github.com/Rican7/retry.svg)](https://pkg.go.dev/github.com/Rican7/retry)
[![Latest Stable Version](https://img.shields.io/github/release/Rican7/retry.svg?style=flat)](https://github.com/Rican7/retry/releases)A simple, stateless, functional mechanism to perform actions repetitively until successful.
## Project Status
This project is currently in "pre-release". While the code is heavily tested, the API may change.
Use a tagged version or vendor this dependency if you plan on using it.That said, this code has been used in production without issue for years, and has been used by some relatively
[high-profile projects/codebases](https://pkg.go.dev/github.com/Rican7/retry?tab=importedby).## Examples
### Basic
```go
retry.Retry(func(attempt uint) error {
return nil // Do something that may or may not cause an error
})
```### File Open
```go
const logFilePath = "/var/log/myapp.log"var logFile *os.File
err := retry.Retry(func(attempt uint) error {
var err errorlogFile, err = os.Open(logFilePath)
return err
})if err != nil {
log.Fatalf("Unable to open file %q with error %q", logFilePath, err)
}logFile.Chdir() // Do something with the file
```### HTTP request with strategies and backoff
```go
var response *http.Responseaction := func(attempt uint) error {
var err errorresponse, err = http.Get("https://api.github.com/repos/Rican7/retry")
if err == nil && response != nil && response.StatusCode > 200 {
err = fmt.Errorf("failed to fetch (attempt #%d) with status code: %d", attempt, response.StatusCode)
}return err
}err := retry.Retry(
action,
strategy.Limit(5),
strategy.Backoff(backoff.Fibonacci(10*time.Millisecond)),
)if err != nil {
log.Fatalf("Failed to fetch repository with error %q", err)
}
```### Retry with backoff jitter
```go
action := func(attempt uint) error {
return errors.New("something happened")
}seed := time.Now().UnixNano()
random := rand.New(rand.NewSource(seed))retry.Retry(
action,
strategy.Limit(5),
strategy.BackoffWithJitter(
backoff.BinaryExponential(10*time.Millisecond),
jitter.Deviation(random, 0.5),
),
)
```