yriveiro / php-backoff
简单的回退/重试功能
2.1.1
2020-12-24 18:16 UTC
Requires
- php: >=7.0
Requires (Dev)
- php-coveralls/php-coveralls: ~2.1
- phpstan/phpstan: ^0.9.2
- phpunit/phpunit: ~6.5.8
README
注意:要在PHP 5.x中使用php-backoff,请使用1.x分支的最新版本
API
getDefaultOptions()
此方法为静态方法,返回一个包含默认选项的数组
cap
:允许的最大持续时间(以微秒为单位)。如果回退持续时间大于cap,则返回cap,默认为1000000
微秒。maxAttempts
:抛出Yriveiro\Backoff\BackoffException之前的尝试次数。默认为0
,无限制。
exponential($attempt)
此方法使用指数函数E(attempt) = (2**attempt - 1)
来计算回退时间。
参数
attempt
:表示当前重试次数的递增值。
equalJitter($attempt);
指数回退有一个缺点。在高并发情况下,由于时间与当前尝试高度相关,可能会出现多个调用具有相同的回退时间,因为不同的调用可能在同一尝试中。
为了解决这个问题,我们可以添加一个抖动值以允许一些随机化。
equalJitter
使用以下函数:E(attempt) = min(((2**attempt - 1) / 2), random(0, ((2**attempt - 1) / 2)))
。
参数
attempt
:表示当前重试次数的递增值。
fullJitter($attempt);
全抖动行为类似于equalJitter
方法,它们之间的主要区别在于抖动值的计算方式。
fullJitter
使用以下函数:E(attempt) = min(random(0, (2**attempt - 1) / 2))
。
参数
attempt
:表示当前重试次数的递增值。
用法
无配置示例
在无配置的情况下,我们将永不停止尝试获取数据。退出条件是您的责任。
$attempt = 1; $backoff = new Backoff(); $response = $http->get('http://myservice.com/user/1'); while (!$response) { $time = $backoff->exponential($attempt); $attempt++; usleep($time); $response = $http->get('http://myservice.com/user/1'); }
配置示例
$attempt = 1; $options = Backoff::getDefaultOptions(); $options['maxAttempts'] = 3; $backoff = new Backoff($options); $response = $http->get('http://myservice.com/user/1'); try while (!$response) { $time = $backoff->fullJitter($attempt); $attempt++; usleep($time); $response = $http->get('http://myservice.com/user/1'); } } catch (Yriveiro\Backoff\BackoffException $e) { // Handle the exception }
安装
推荐通过 Composer 安装此包。
php composer.phar require "yriveiro/php-backoff"
测试
测试使用 phpunit
库进行,要运行它们
php vendor/bin/phpunit tests
已知问题
无。
如何贡献
有想法吗?发现了错误?欢迎贡献 :)
许可
Backoff采用MIT许可。