toplan/task-balancer

轻量级且强大的任务负载均衡。

0.5.0 2017-05-15 03:19 UTC

README

Latest Stable Version Total Downloads

轻量级且强大的任务负载均衡。

就像nginx负载均衡😄

特性

  • 支持每个任务的多驱动。
  • 根据驱动的权重值自动选择执行任务的驱动。
  • 支持多个备用驱动。
  • 任务生命周期和钩子系统。

安装

composer require toplan/task-balancer:~0.5

用法

//define a task
Balancer::task('task1', function($task){
    //define a driver for current task like this:
    $task->driver('driver_1 100 backup', function ($driver, $data) {
        //do something here
        ...
        //set whether run success/failure at last
        if ($success) {
            $driver->success();
        } else {
            $driver->failure();
        }
        //return some data you need
        return 'some data you need';
    });

    //or like this:
    $task->driver('driver_2', 90, function ($driver, $data) {
        //...same as above..
    })->data(['this is data 2']);

    //or like this:
    $task->driver('driver_3')
    ->weight(0)->backUp()
    ->data(['this is data 3'])
    ->work(function ($driver, $data) {
        //...same as above..
    });
});

//run the task
$result = Balancer::run('task1');

$result结构

[
    'success' => true,
    'time' => [
        'started_at' => timestamp,
        'finished_at' => timestamp
    ],
    'logs' => [
        '0' => [
            'driver' => 'driver_1',
            'success' => false,
            'time' => [
                'started_at' => timestamp,
                'finished_at' => timestamp
            ],
            'result' => 'some data you need'
        ],
        ...
    ]
]

API

均衡器

Balancer::task($name[, $data][, Closure $ready]);

创建一个任务实例,并返回它。闭包$ready立即用参数$task调用。

Balancer::task('taskName', $data, function($task){
    //task's ready work, such as create drivers.
});

$data将存储在任务实例中。

Balancer::run($name[, array $options])

通过名称运行任务,并返回结果数据。

$options的键

  • data
  • driver

Task

name($name)

设置任务名称。

data($data)

设置任务数据。

driver($config[, $weight][, 'backup'], Closure $work)

为任务创建一个驱动程序。闭包$work将用参数$driver和$data调用。

期望$weight是一个整数,默认值为1。

$task->driver('driverName 80 backup', function($driver, $data){
    //driver's job content.
});

hasDriver($name)

是否具有指定的驱动程序。

getDriver($name)

通过名称获取驱动程序。

removeDriver($name)

通过名称从驱动程序池中删除驱动程序。

Driver

weight($weight)

设置驱动程序的权重值。

backup($is)

设置是否为备用驱动程序。

期望$is为布尔值,默认为true。

data($data)

设置驱动程序的数据。

$data将存储在驱动程序实例中。

work(Closure $work);

设置驱动程序的工作内容。

$data等于$driver->getData()

reset($config[, $weight][, 'backup'], Closure $work)

重置驱动程序的权重值、工作内容和重置是否为备用。

destroy()

从属于任务中删除驱动程序。

failure()

设置驱动程序运行失败。

success()

设置驱动程序运行成功。

getDriverData()

获取存储在驱动程序实例中的数据。

getTaskData()

获取存储在任务实例中的数据。

生命周期 & 钩子

支持每个钩子的多个处理器!

钩子

用法

  • $task->hook($hookName, $handler, $override)

  • $task->beforeCreateDriver($handler, $override)

  • $task->afterCreateDriver($handler, $override)

  • $task->beforeRun($handler, $override)

  • $task->beforeDriverRun($handler, $override)

  • $task->afterDriverRun($handler, $override)

  • $task->afterRun($handler, $override)

$override默认为false

//example
$task->beforeRun(function($task, $index, $handlers, $prevReturn){
    //what is $prevReturn?
    echo $prevReturn == null; //true
    //what is $index?
    echo $index == 0; //true
    //what is $handlers?
    echo count($handlers); //2
    //do something..
    return 'beforeRun_1';
}, false);

$task->beforeRun(function($task, $index, $handlers, $prevReturn){
    //what is $prevReturn?
    echo $prevReturn == 'beforeRun_1'; //true
    //what is $index?
    echo $index == 1; //true
    //what is $handlers?
    echo count($handlers); //2
    //do other something..
}, false);

依赖项

许可证

MIT