Hyperf開發的任務排程系統.
基於 Hyperf + Nsq 的一個非同步佇列庫.支援投遞任務,DAG任務編排.多個任務使用同一個事務。
特性
- 預設 Nsq 驅動
- 秒級延時任務
- 自定義重試次數和時間
- 自定義錯誤回撥
- 支援任務執行中介軟體
- 自定義佇列快照事件
- 彈性多程式消費
- 協程支援
- 漂亮的儀表盤
- 任務編排協程安全的單連線模式(事務保持、多路複用等條件下,有時必須使用一個連線)
- dag任務編排
環境
- PHP 7.4+
- Swoole 4.6+
- Redis 5.0+ (redis 驅動)
- Nsq 1.2.0
TODO
- 分散式支援
案例
1.投遞任務
use App\Model\Task;
use App\Job\SimpleJob;
use App\Kernel\Nsq\Queue;
class Example{
/**
* @desc 測試job佇列功能
*/
public function queue() : void
{
$task = Task::find(1);
$job = new SimpleJob($task);
$queue = new Queue('queue');
$queue->push($job);
}
}
2.任務編排協程安全的單連線模式(事務保持、多路複用等條件下,有時必須使用一個連線)
use App\Kernel\Concurrent\ConcurrentMySQLPattern;
use App\Dag\Task\Task1;
use App\Dag\Task\Task2;
use App\Dag\Task\Task3;
class Example{
public function conCurrentMySQL() : void
{
$dsn = 'DSN';
$user = 'USER';
$password = 'PWD';
try {
$pdo = new \PDO($dsn, $user, $password);
$pdo->setAttribute(\PDO::ATTR_EMULATE_PREPARES, true);
$c = new ConcurrentMySQLPattern($pdo, $this->logger);
$c->beginTransaction();
$dag = new \Hyperf\Dag\Dag();
$a = \Hyperf\Dag\Vertex::make(function () use ($c)
{
$task = new Task1();
return $task->Run($c);
}, 'a');
$b = \Hyperf\Dag\Vertex::make(function ($results) use ($c)
{
$task = new Task2();
return $task->Run($c);
}, 'b');
$d = \Hyperf\Dag\Vertex::make(function ($results) use ($c, $a, $b)
{
if ($results[$a->key] && $results[$b->key]) {
return $c->commit();
}
return $c->rollback();
}, 'd');
$e = \Hyperf\Dag\Vertex::make(function ($results) use ($c)
{
$c->close();
}, 'e');
$results = $dag
->addVertex($a)
->addVertex($b)
->addVertex($d)
->addVertex($e)
->addEdge($a, $b)
->addEdge($b, $d)
->addEdge($d, $e)
->run();
} catch (\PDOException $exception) {
echo 'Connection failed: ' . $exception->getMessage();
}
}
}
儀表盤
github.com/Hyperf-Glory/Task-Sched...
參考:github.com/Littlesqx/aint-queue/
本作品採用《CC 協議》,轉載必須註明作者和本文連結