ホームページ > PHPフレームワーク > Swoole > Swoole に基づいて可用性の高いエンタープライズ レベルのスケジュールされたタスク スケジューリング システムを構築する

Swoole に基づいて可用性の高いエンタープライズ レベルのスケジュールされたタスク スケジューリング システムを構築する

王林
リリース: 2023-06-13 19:13:05
オリジナル
1220 人が閲覧しました

インターネット業界の継続的な発展とテクノロジーの継続的な進歩に伴い、スケジュールされたタスク スケジューリング システムは、さまざまな大規模なエンタープライズ レベルのアプリケーション シナリオにおいてますます重要になっています。企業は、システムの安定性と信頼性を確保するために、データのバックアップ、電子メールの送信、定期的な統計などの日常のビジネス プロセスを定期的に処理する、可用性が高く、拡張が容易なスケジュールされたタスク スケジューリング システムを必要としています。この記事では、Swoole フレームワークに基づいて可用性の高いエンタープライズ レベルのスケジュールされたタスク スケジューリング システムを構築する方法を紹介します。

Swoole は、PHP 言語に基づくコルーチン ネットワーク通信エンジンで、PHP プログラムに Node.js と同じ高い同時実行性と高性能機能を持たせることができます。 Swoole は豊富なネットワーク通信と非同期 IO 機能を提供し、エンタープライズ レベルのアプリケーションを強力にサポートします。以下では、Swoole を使用して、可用性の高いエンタープライズ レベルのスケジュールされたタスク スケジューリング システムを構築する方法を詳しく紹介します。

1. 設計アイデア

スケジュールされたタスク スケジューリング システムを設計するときは、次の側面を考慮する必要があります:

1. タスク管理: すべてのタスクの管理とスケジュールを担当します。タスクには、タスクの作成、タスクの変更、タスクの削除、タスクの実行状況管理などが含まれます。

2. タスクの実行: 指定されたビジネス ロジック コードの呼び出し、タスク実行ログの記録、タスク例外の処理など、特定のタスクの実行を担当します。

3. タスクのスケジューリング: あらかじめ決められた時間間隔とルールに従って、対応する実行者にタスクを割り当てる責任を負います。

4. タスク監視: すべてのタスクの実行状態を監視し、異常な問題をタイムリーに発見して処理し、システムの安定性と信頼性を確保する責任を負います。

上記の考え方に基づいて、システム全体を次の層に分割できます。

タスク スケジューリング層: タスクのスケジュールと分散、および対応する実行者へのタスクの割り当てを担当します。

メッセージ キュー層: システムの処理能力と安定性を向上させるために、タスク情報と実行結果を保存するために使用されます。

実行層: 特定のタスク実行者は、指定されたタスクを実行し、結果をメッセージ キューに書き込む責任があります。

監視層:システム全体の稼働状況を監視し、タイムリーに異常を検知・対処します。

2. 技術アーキテクチャ

1. タスク スケジューリング

タスク スケジューリングはシステム全体の中核部分であり、タスクはあらかじめ決められたルールに従ってスケジュールされ、割り当てられる必要があります。時間間隔。 Swoole のタイマーとコルーチンを使用して、タスク スケジュール機能を実装できます。まず、スケジュールされたタスクのスケジューリング ロジックを実行するために Swoole プロセスを開始する必要があります。

$scheduler = new Scheduler();
$scheduler->add(function () use ($taskManager) {

$taskManager->assignTask();
ログイン後にコピー

}, '', SWOOLE_TIMER_INTERVAL * 1000);

その中で、$taskManager はタスク管理オブジェクトです。その assignTask() 関数では、タスクから適切なタスクを選択することから開始できます。タスクリストを作成し、対応する実行者に割り当てます。

public function assignTask()
{

$now = time();
foreach ($this->tasks as $task) {
    if ($task->nextExecTime == 0) {
        $task->nextExecTime = strtotime($task->cron);
    }
    if ($task->nextExecTime <= $now) {
        $task->nextExecTime = strtotime($task->cron, $now);
        $this->executeTask($task);
    }
}
ログイン後にコピー

}

executeTask( ) 関数にタスクを配置できます。情報をメッセージ キューに追加し、実行プログラムが処理するのを待ちます:

public functionexecuteTask($task)
{

// 将任务信息放入消息队列中
$this->queue->push($task);
ログイン後にコピー

}

# #2. タスクの実行

タスク実行もシステム全体の中核部分であり、タスク情報に基づいて対応するビジネスロジックコードを呼び出し、実行結果をメッセージキューに書き込む必要があります。タスクの実行中に例外が発生する可能性があるため、実行中に例外を処理し、実行ログを記録する必要があります。 Swoole のコルーチンと非同期 IO 関数を使用して、高パフォーマンスのタスク実行機能を実現できます。まず、いくつかの Swoole サブプロセスをタスク実行者として開始する必要があります:

for ($i = 0; $i < SWOOLE_PROCESS_NUM; $i ) {

$worker = new Worker();
$worker->onWorkerStart = function ($worker) use ($queue) {
    while (true) {
        // 从消息队列中获取任务信息
        $task = $queue->pop();
        if (!$task) continue;
        // 执行任务
        $result = $this->execute($task);
        // 将执行结果写入消息队列中
        $this->queue->push($result);
    }
};
$worker->listen();
ログイン後にコピー

}

execute() 関数では、タスク情報に基づいて対応するビジネス ロジック コードを呼び出し、例外処理とログを実行できます。

public functionexecute($task)

{

// 调用业务逻辑代码
try {
    $result = $this->doTask($task);
    return $result;
} catch (Exception $e) {
    // 异常处理
    $errMsg = sprintf("Task failed: %s, error message: %s", $task->name, $e->getMessage());
    $this->log($errMsg);
    return false;
}
ログイン後にコピー

}

3. メッセージ キュー

メッセージ キューはシステム全体の通信ハブであり、タスク情報と実行結果を保存し、システムの処理能力と安定性を向上させるために使用されます。 Swoole が提供するコルーチンと非同期 IO 関数を使用して、高パフォーマンスのメッセージ キュー関数を実装できます。まず、Swoole プロセスをメッセージ キューとして開始する必要があります。

$queue = new Channel();

$server = new Server('0.0.0.0', 9501, SWOOLE_PROCESS, SWOOLE_SOCK_TCP);
$server->on('receive', function ($server, $fd, $from_id, $data) use ($queue) {

// 将消息放入消息队列中
$queue->push($data);
ログイン後にコピー

});

$server- > start();

特定のタスクの実行プロセス中に、タスク情報と実行結果をメッセージ キューに書き込み、他のコンポーネントが処理するのを待つことができます:

//タスク情報 メッセージ キューを入力します

$this->queue->push($task);

4. 監視システム

監視システムは、メッセージ キュー全体の不可欠な部分です。用途 システム全体の稼働状況を監視し、異常な問題をタイムリーに検出して対処し、システムの安定性と信頼性を確保するために使用されます。 Swooleのプロセス管理機能や信号処理機能を利用して監視システムの機能を実現できます。 Swoole プロセスを監視プロセスとして開始できます:

$monitor = new Monitor();

$monitor->start();

の start() 関数内Monitor クラスでは、Swoole のプロセス管理関数と信号処理関数を使用して監視システムの機能を実装できます。

public function start()

{

// 注册信号处理函数
pcntl_signal(SIGUSR1, array($this, 'handleSignal'));
while (true) {
    $cpuUsage = $this->getCpuUsage();
    $memUsage = $this->getMemUsage();
    $this->log(sprintf('CPU usage: %.2f%%, Memory usage: %.2fMB', $cpuUsage, $memUsage));
    sleep(MONITOR_INTERVAL);
}
ログイン後にコピー

}

其中,getCpuUsage()函数用于获取当前进程的CPU使用率,getMemUsage()函数用于获取当前进程的内存使用情况,handleSignal()函数用于处理信号并进行相应的处理。

三、系统部署

在系统部署方面,我们可以使用Docker容器化的方式,来实现系统的快速部署和迁移。首先,我们需要构建一组Docker镜像:

docker build -t task-scheduler:latest .
docker build -t task-executor:latest .
docker build -t task-queue:latest .
docker build -t task-monitor:latest .

其中,task-scheduler镜像用于运行任务调度进程,task-executor镜像用于运行任务执行进程,task-queue镜像用于运行消息队列进程,task-monitor镜像用于运行监控进程。

接着,我们可以使用docker-compose来启动和管理整个系统:

version: '3'
services:
scheduler:

image: task-scheduler:latest
restart: always
ログイン後にコピー

executor:

image: task-executor:latest
restart: always
scale: 5
ログイン後にコピー

queue:

image: task-queue:latest
restart: always
ログイン後にコピー

monitor:

image: task-monitor:latest
restart: always
ログイン後にコピー

其中,scheduler服务用于启动任务调度进程,executor服务用于启动任务执行进程,queue服务用于启动消息队列进程,monitor服务用于启动监控进程。可以根据实际情况,调整服务的数量和启动参数。

四、总结

本文介绍了如何基于Swoole框架构建一套高可用的企业级定时任务调度系统,其中涵盖了任务调度、任务执行、消息队列和监控等方面。Swoole的高性能和异步IO特性,为企业级应用提供了强大的支持,能够满足各种大规模应用的需求。通过本文的介绍,相信读者可以更好地了解Swoole框架的应用和实践。

以上がSwoole に基づいて可用性の高いエンタープライズ レベルのスケジュールされたタスク スケジューリング システムを構築するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート