yriveiro/php-backoff

简单的回退/重试功能

2.1.1 2020-12-24 18:16 UTC

This package is auto-updated.

Last update: 2024-08-25 23:06:33 UTC


README

License Build Status Coverage Status Total Downloads SensioLabsInsight

注意:要在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许可。