love-oss / resiliency
该软件包已被弃用,不再维护。没有建议的替代软件包。
PHP 7.4+ 的断路器实现
2.3
2022-01-25 22:12 UTC
Requires
- php: ^7.4|^8.0
- ext-json: *
- psr/event-dispatcher: ^1.0
- psr/simple-cache: ^1.0
Requires (Dev)
- edgedesign/phpqa: ^v1.24
- friendsofphp/php-cs-fixer: ^3.5
- guzzlehttp/guzzle: ^6.3|^7.0
- php-parallel-lint/php-parallel-lint: ^1.0
- phpstan/phpstan: ^1.2
- phpstan/phpstan-phpunit: ^1.0
- phpunit/phpunit: ^9.0
- symfony/cache: ~4.4|~5.4|~6.0
- symfony/http-client: ^4.4|~5.4|~6.0
- vimeo/psalm: ^4.3
Suggests
- ext-apcu: Allows use of APCu adapter (performant) to store transactions
- guzzlehttp/guzzle: Allows use of Guzzle 6 HTTP Client
- symfony/cache: Allows use of Symfony Cache adapters to store transactions
- symfony/http-client: Allows use of any Symfony HTTP Clients
README
主要原则
该库与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断路器
- 它们维护与PHP 7.2+和Symfony 4兼容的版本,但(尚未?)与PHP 8和Symfony 5不兼容;
- 它们依赖于自己的名为 php-dev-tools 的包;
- 它们使用Doctrine Cache库实现了一个存储;
- 它们没有实现Symfony HttpClient;
- 对于事件,我不确定,因为它们的实现使得列表难以建立;
- 它们没有提供重置和恢复断路器的机制;
- 它们没有提供监控断路器活动性的机制;
- 它们已从CI中移除Psalm,并且不使用PHPQA;
- 它们在所有文件中添加了
declare(strict_types=1);
; - 它们没有声明
.gitattributes
文件,这意味着当我们需要它们的库时,会下载所有测试;
好了……但这并没有告诉我应该在项目中使用哪个库!
- 如果您需要PHP 5.6,请使用断路器v3;
- 如果您需要PHP 7.2,请使用断路器v4;
- 如果您需要PHP 7.4+,请使用弹性库;
- 如果您需要一个由开发者团队维护的库,请使用PrestaShop;
- 如果您相信我几乎独自维护这个包,请使用弹性库!