mt-olympus/cerberus

该软件包已被弃用且不再维护。作者建议使用 los/cerberus 软件包。

PHP 中断路器模式实现

1.1.0 2016-07-22 14:42 UTC

This package is auto-updated.

Last update: 2022-02-01 12:52:47 UTC


README

Build Status Coverage Status Latest Stable Version Total Downloads Scrutinizer Code Quality SensioLabs Insight

介绍

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

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

它能够检测服务故障并自我适应。

您可以结合这个库与 Metis 来实现可靠的负载均衡服务。

要求

安装

composer require mt-olympus/cerberus:~1.0

配置

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

工厂

如果您使用的是 Container Interopt 兼容的项目,您可以定义一个工厂

'factories' => [
    Cerberus\Cerberus::class => Cerberus\Factory::class
],

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

return [
    'cerberus' => [
        'max_failues' => 5,
        'timeout' => 60,
        'storage' => [
            'adapter' => [
                'name' => 'filesystem',
                'options' => [
                    'cache_dir' => 'data/cache',
                    'namespace' => 'my_project'
                ]
            ],
            'plugins' => [
                // Don't throw exceptions on cache errors
                'exception_handler' => [
                    'throw_exceptions' => false
                ]
            ]
        ]
    ]
];

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

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

存储键是 zend-cache 配置。您可以查看 官方文档

存储内部的 namespace 键非常重要。它定义了 Cerberus 缓存功能的默认命名空间。如果您选择使用服务名称调用 Cerberus 方法(见下文用法),则可以省略此选项,因为它将被忽略。

手动

您可以通过手动方式创建一个 Cerberus 实例

$storage = StorageFactory::factory($storageConfig);
$cerberus = new Cerberus($storage, 5, 60);

$storageConfig 是上面的 zend-cache 配置。

用法

用法很简单。每次您访问远程资源(如 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');
    }
}