los/cerberus

PHP 中的断路器模式实现

1.0.0 2019-06-24 18:48 UTC

This package is auto-updated.

Last update: 2024-09-25 07:32:51 UTC


README

Build Status Coverage Status Latest Stable Version Total Downloads

简介

这是一个 PHP 中的断路器模式实现。

这个库可以帮助你处理外部服务的超时和故障。

需求

  • PHP >= 7.2
  • 任何实现了 psr/simple-cache 的缓存库

安装

composer require los/cerberus:^1.0

配置

你可以手动创建一个 Cerberus 实例或者使用一个工厂

工厂

'factories' => [
    Los\Cerberus\Cerberus::class => Los\Cerberus\CerberusFactory::class
],

并将配置文件 config/cerberus.global.php.dist 复制到 config/autoload/cerberus.global.php,然后根据需要进行更改。

return [
    'cerberus' => [
        'max_failures' => 5,
        'timeout' => 60,
    ]
];

maxFailure 参数是在断路器打开并且服务不可用之前发生的失败次数。

timeout 到达时,断路器变为半打开状态,可以进行一次尝试,并更新状态。

工厂使用以下方式从容器中拉取缓存

$container->get(\Psr\SimpleCache\CacheInterface::class)

因此你需要有一个实现。

手动

你可以手动创建一个 Cerberus 实例

$storage = new Cache(); // Any psr/simple-cache implementation
$cerberus = new Cerberus($storage, 5, 60);

用法

用法很简单。每次访问远程资源(如 Web 服务)时,检查其可用性并报告其成功或失败

if ($cerberus->isAvailable()) {
    try {
        $http->makeRequest();
        $cerberus->reportSuccess();
    } catch (\Exception $ex) {
        $cerberus->reportFailure();
    }
}

你可以使用 Cerberus 来控制多个服务。在这种情况下,使用传递服务名称的方法

if ($cerberus->isAvailable('service-one')) {
    try {
        $http->makeRequest();
        $cerberus->reportSuccess('service-one');
    } catch (\Exception $ex) {
        $cerberus->reportFailure('service-one');
    }
}

if ($cerberus->isAvailable('service-two')) {
    try {
        $http->makeRequest();
        $cerberus->reportSuccess('service-two');
    } catch (\Exception $ex) {
        $cerberus->reportFailure('service-two');
    }
}