Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/Crowdstar/exponential-backoff
Prevent overloading an unavailable service by doubling the timeout each iteration.
https://github.com/Crowdstar/exponential-backoff
Last synced: about 1 month ago
JSON representation
Prevent overloading an unavailable service by doubling the timeout each iteration.
- Host: GitHub
- URL: https://github.com/Crowdstar/exponential-backoff
- Owner: Crowdstar
- License: apache-2.0
- Created: 2018-06-08T20:55:26.000Z (over 6 years ago)
- Default Branch: master
- Last Pushed: 2024-05-19T05:06:26.000Z (7 months ago)
- Last Synced: 2024-11-05T20:04:12.390Z (about 1 month ago)
- Language: PHP
- Homepage:
- Size: 173 KB
- Stars: 14
- Watchers: 6
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE.txt
Awesome Lists containing this project
- awesome-swoole - crowdstar/exponential-backoff - A library to prevent overloading an unavailable service by doubling the timeout each iteration. It works under both Swoole (in non-blocking mode) and PHP-FPM. (Miscellaneous)
README
[![Library Status](https://github.com/Crowdstar/exponential-backoff/workflows/Tests/badge.svg)](https://github.com/Crowdstar/exponential-backoff/actions)
[![Latest Stable Version](https://poser.pugx.org/Crowdstar/exponential-backoff/v/stable.svg)](https://packagist.org/packages/crowdstar/exponential-backoff)
[![Latest Unstable Version](https://poser.pugx.org/Crowdstar/exponential-backoff/v/unstable.svg)](https://packagist.org/packages/crowdstar/exponential-backoff)
[![License](https://poser.pugx.org/Crowdstar/exponential-backoff/license.svg)](https://packagist.org/packages/crowdstar/exponential-backoff)* [Summary](#summary)
* [Installation](#installation)
* [Sample Usage](#sample-usage)
* [1. Retry When Return Value Is Empty](#1-retry-when-return-value-is-empty)
* [2. Retry When Certain Exceptions Thrown Out](#2-retry-when-certain-exceptions-thrown-out)
* [Don't Throw Out an Exception When Finally Failed](#dont-throw-out-an-exception-when-finally-failed)
* [3. Retry When Customized Condition Met](#3-retry-when-customized-condition-met)
* [4. More Options When Doing Exponential Backoff](#4-more-options-when-doing-exponential-backoff)
* [5. To Disable Exponential Backoff Temporarily](#5-to-disable-exponential-backoff-temporarily)
* [Sample Scripts](#sample-scripts)# Summary
Exponential back-offs prevent overloading an unavailable service by doubling the timeout each iteration. This class uses
an exponential back-off algorithm to calculate the timeout for the next request.This library allows doing exponential backoff in non-blocking mode in [Swoole](https://github.com/swoole/swoole-src).
# Installation
```bash
composer require crowdstar/exponential-backoff:~3.0.0
```# Sample Usage
In following code pieces, we assume that you want to store return value of method _MyClass::fetchData()_ in variable
_$result_, and you want to do exponential backoff on that because something unexpected could happen when running method
_MyClass::fetchData()_.## 1. Retry When Return Value Is Empty
Following code is to try to fetch some non-empty data back with method _MyClass::fetchData()_. This piece of code will
try a few more times (by default 4) until either we get some non-empty data back, or we have reached maximum numbers
of retries.
```php
run(
function () {
return MyClass::fetchData();
}
);
?>
```## 2. Retry When Certain Exceptions Thrown Out
Following code is to try to fetch some data back with method _MyClass::fetchData()_, which may throw out exceptions.
This piece of code will try a few more times (by default 4) until either we get some data back, or we have reached
maximum numbers of retries.NOTE: Internal PHP errors (class [Error](https://www.php.net/error)) won't trigger exponential backoff. They should be
fixed manually.```php
run(
function () {
return MyClass::fetchData();
}
);
} catch (Throwable $t) {
// Handle the errors here.
}
?>
```### Don't Throw Out an Exception When Finally Failed
When method call _MyClass::fetchData()_ finally fails with an exception caught, we can silence the exception without
throwing it out by overriding method _AbstractRetryCondition::throwable()_:```php
run(
function () {
return MyClass::fetchData();
}
);
?>
```If needed, you can have more complex logic defined when overriding method _AbstractRetryCondition::throwable()_.
## 3. Retry When Customized Condition Met
Following code is to try to fetch some non-empty data back with method _MyClass::fetchData()_. This piece of code works
the same as the first example, except that here it's implemented with a customized condition class instead of class
_\CrowdStar\Backoff\EmptyValueCondition_.```php
run(
function () {
return MyClass::fetchData();
}
);
?>
```## 4. More Options When Doing Exponential Backoff
Following code is to try to fetch some data back with method _MyClass::fetchData()_. This piece of code works the
same as the second example, except that here it's implemented with a customized condition class instead of class
_\CrowdStar\Backoff\ExceptionBasedCondition_.In this piece of code, we also show what options are available when doing exponential backoff with the package.
```php
setType(ExponentialBackoff::TYPE_SECONDS)
->setType(ExponentialBackoff::TYPE_MICROSECONDS)
->setMaxAttempts(3)
->setMaxAttempts(4);$result = $backoff->run(
function () {
return MyClass::fetchData();
}
);
?>
```## 5. To Disable Exponential Backoff Temporarily
There are two ways to disable exponential backoff temporarily for code piece like following:
```php
```
First, you may disable exponential backoff temporarily by calling method _\CrowdStar\Backoff\ExponentialBackoff::disable()_. For example:
```php
disable();
$result = $backoff->run(function () {return MyClass::fetchData();});
?>
```You may also disable exponential backoff temporarily by using class _\CrowdStar\Backoff\NullCondition_:
```php
setRetryCondition(new NullCondition()) // The method here is for demonstration purpose.
->run(function () {return MyClass::fetchData();});
?>
```All these 3 code piece work the same, having return value of method call _MyClass::fetchData()_ assigned to variable _$result_.
# Sample Scripts
Sample scripts can be found under folder _examples/_. Before running them under CLI, please do a composer update first:
```bash
composer update -n
```