love-oss/resiliency

该软件包已被弃用,不再维护。没有建议的替代软件包。

PHP 7.4+ 的断路器实现

维护者

详细信息

github.com/loveOSS/resiliency

源代码

安装: 16,808

依赖项: 0

建议者: 0

安全: 0

星星: 76

关注者: 4

分支: 6

2.3 2022-01-25 22:12 UTC

This package is auto-updated.

Last update: 2022-08-25 23:32:20 UTC


README

codecov PHPStan Psalm Build Status

主要原则

circuit breaker

该库与PHP 7.4+兼容。

安装

composer require love-oss/resiliency

使用

您需要为断路器配置一个系统

  • 失败次数:定义我们尝试访问服务的次数;
  • 超时:定义我们等待多长时间(以毫秒为单位)后才认为服务不可达;
  • 半开状态下的超时:定义我们等待多长时间(以毫秒为单位)后才认为服务不可达;
  • 阈值:定义我们等待多长时间(以毫秒为单位)后才尝试再次访问服务;
  • 将要用于访问服务的(HTTP|HTTPS)客户端;
  • 当断路器开启时(即“被使用”),如果远程服务不可达,将使用回退回调。

您最好返回与您的远程调用预期的相同类型的响应。

use Resiliency\MainCircuitBreaker;
use Resiliency\Systems\MainSystem;
use Resiliency\Storages\SimpleArray;
use Resiliency\Clients\SymfonyClient;
use Symfony\Component\HttpClient\HttpClient;

$client = new SymfonyClient(HttpClient::create());

$mainSystem = MainSystem::createFromArray([
    'failures' => 2,
    'timeout' => 100,
    'stripped_timeout' => 200,
    'threshold' => 10000,
], $client);

$storage = new SimpleArray();

// Any PSR-14 Event Dispatcher implementation.
$dispatcher = new Symfony\Component\EventDispatcher\EventDispatcher;

$circuitBreaker = new MainCircuitBreaker(
    $mainSystem,
    $storage,
    $dispatcher
);

/**
 * @var Service $service
 */
$fallbackResponse = function ($service) {
    return '{}';
};

$circuitBreaker->call(
    'https://api.domain.com',
    $fallbackResponse,
    [
        'query' => [
            '_token' => '123456789',
        ]
    ]
);

客户端

Resiliency库支持Guzzle (v6 & v7)和来自Symfony (v4 & v5)的HttpClient组件。

监控

此库提供了一个简约的系统,以帮助您监控您的电路。

$monitor = new SimpleMonitor();

// Collect information while listening
// to some circuit breaker events...
function listener(Event $event) {
    $monitor->add($event);
};

// Retrieve a complete report for analysis or storage
$report = $monitor->getReport();

测试

composer test

代码质量

该库具有高质量标准

composer cs-fix && composer phpstan && composer psalm && composer phpqa

我们还使用PHPQA在CI管理贡献期间检查代码质量。

composer phpqa

我听说PrestaShop的断路器:我应该使用哪个库?

欢迎,这是一个有趣的问题!

首先,我必须说我曾是PrestaShop Circuit Breaker库的前作者,我决定将我的库分叉以提高它,而不受PrestaShop CMS主项目的约束。

截至2021年6月,这些库有很多共同之处!

它们几乎共享相同的API,PrestaShop核心团队创建了多个断路器接口工厂实现。

  • SimpleCircuitBreaker
  • AdvancedCircuitBreaker
  • 局部断路器
  • Symfony断路器
  1. 它们维护与PHP 7.2+和Symfony 4兼容的版本,但(尚未?)与PHP 8和Symfony 5不兼容;
  2. 它们依赖于自己的名为 php-dev-tools 的包;
  3. 它们使用Doctrine Cache库实现了一个存储
  4. 它们没有实现Symfony HttpClient;
  5. 对于事件,我不确定,因为它们的实现使得列表难以建立;
  6. 它们没有提供重置和恢复断路器的机制;
  7. 它们没有提供监控断路器活动性的机制;
  8. 它们已从CI中移除Psalm,并且不使用PHPQA
  9. 它们在所有文件中添加了 declare(strict_types=1);
  10. 它们没有声明.gitattributes文件,这意味着当我们需要它们的库时,会下载所有测试;

好了……但这并没有告诉我应该在项目中使用哪个库!

  • 如果您需要PHP 5.6,请使用断路器v3;
  • 如果您需要PHP 7.2,请使用断路器v4;
  • 如果您需要PHP 7.4+,请使用弹性库;
  • 如果您需要一个由开发者团队维护的库,请使用PrestaShop;
  • 如果您相信几乎独自维护这个包,请使用弹性库!