sparkcentral/backoff

带有重试(回退)功能的实用特质

v1.1.0 2016-11-10 02:17 UTC

This package is not auto-updated.

Last update: 2024-09-14 17:21:14 UTC


README

这是一个简单的实用特质,它提供了回退/重试功能。

Build Status

功能

  • 两种不同的策略:backoffOnExceptionbackoffOnCondition
  • 您可以提供异常类列表,以便只有在列表中的某个异常被抛出时才会进行重试。
  • 您可以将自定义函数传递给backoffOnCondition,该函数定义是否重试操作。
  • 重试带有延迟发生,延迟线性增长(y=x*2),您还可以传递自定义的起始延迟。

有关详细信息,请参阅backoffOnException()backoffOnCondition()方法的文档。

依赖项

  • PHP >= 5.6 (可变参数)

基本示例

<?php

use Sparkcentral\Backoff\Backoff;

class ExternalServiceWrapper
{
    use Backoff;

    private $externalApiClient;

    public function __construct(ExternalApiClient $client)
    {
        $this->externalApiClient = $client;
    }

    public function getById($id)
    {
        $result = $this->backoffOnException(
            [$this->externalApiClient, 'get'], // call 'get' method on externalApiClient
            [$id], // pass this argument to 'get'
            5, // try up to 5 times
            [ConnectException::class] // only retry on ConnectExceptions, will re-throw everything else
        );

        return $result->getObject();
    }
}

类似地,如果尝试执行的代码没有抛出任何异常,但(例如)在失败时返回null,则可以使用backoffOnCondition()

<?php

use Sparkcentral\Backoff\Backoff;

class ExternalServiceWrapper
{
    use Backoff;

    private $externalApiClient;

    public function __construct(ExternalApiClient $client)
    {
        $this->externalApiClient = $client;
    }

    public function getById($id)
    {
        $result = $this->backoffOnCondition(
            [$this->externalApiClient, 'get'],
            [$id],
            5,
            function ($result) {
                return !is_null($result);
            }
        );

        return $result->getObject();
    }
}