PHP マイクロサービスで分散タスクの割り当てとスケジューリングを実装する方法
分散タスクの割り当てとスケジューリングは、大規模なアプリケーションを構築する場合の一般的な要件です。一般的に使用される Web 開発言語として、PHP を使用してマイクロサービス アーキテクチャを構築し、分散タスクの割り当てとスケジューリングを実装することもできます。この記事では、PHP マイクロサービスで分散タスクの割り当てとスケジューリングを実装する方法を紹介し、具体的なコード例を示します。
1. 分散タスク割り当て
分散タスク割り当てでは、タスクをタスク キューに公開するタスク パブリッシャがあり、複数のタスク コンシューマがこれらのタスクを処理します。 PHP では、キューを使用してタスク分散を実装できます。一般的に使用されるキュー サービスには、RabbitMQ や Redis などがあります。
パブリッシュ タスク コードの例:
<?php require_once __DIR__ . '/vendor/autoload.php'; use PhpAmqpLibConnectionAMQPStreamConnection; use PhpAmqpLibMessageAMQPMessage; $connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest'); $channel = $connection->channel(); $channel->queue_declare('task_queue', false, true, false, false); $data = implode(' ', array_slice($argv, 1)); if (empty($data)) { $data = "Hello World!"; } $msg = new AMQPMessage($data, ['delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT]); $channel->basic_publish($msg, '', 'task_queue'); echo " [x] Sent $data "; $channel->close(); $connection->close(); ?>
受信タスク コードの例:
<?php require_once __DIR__ . '/vendor/autoload.php'; use PhpAmqpLibConnectionAMQPStreamConnection; $connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest'); $channel = $connection->channel(); $channel->queue_declare('task_queue', false, true, false, false); echo " [*] Waiting for messages. To exit, press CTRL+C "; $callback = function ($msg) { echo ' [x] Received ', $msg->body, " "; sleep(substr_count($msg->body, '.')); echo " [x] Done "; $msg->delivery_info['channel']->basic_ack($msg->delivery_info['delivery_tag']); }; $channel->basic_qos(null, 1, null); $channel->basic_consume('task_queue', '', false, false, false, false, $callback); while ($channel->is_consuming()) { $channel->wait(); } $channel->close(); $connection->close(); ?>
パブリッシュ タスクのコード例:
<?php $redis = new Redis(); $redis->connect('127.0.0.1', 6379); $data = implode(' ', array_slice($argv, 1)); if (empty($data)) { $data = "Hello World!"; } $redis->lPush('task_queue', $data); echo " [x] Sent $data "; ?>
受信タスクのコード例:
<?php $redis = new Redis(); $redis->connect('127.0.0.1', 6379); echo " [*] Waiting for messages. To exit, press CTRL+C "; while (true) { $data = $redis->brPop('task_queue', 0); echo ' [x] Received ', $data[1], " "; sleep(substr_count($data[1], '.')); echo " [x] Done "; } ?>
上記のコード例は、タスクをキューにパブリッシュし、次のタスクで使用できます。複数のコンシューマーがこれらのタスクを処理します。実際のニーズに応じてコンシューマーの数を増やして、分散タスク処理を実現できます。
2. 分散タスク スケジューリング
分散タスク スケジューリングとは、分散システムにおいて、タスクの特定のルールに従って、タスクが実行のために適切なノードに割り当てられることを意味します。 PHP では、タスク スケジューラを使用して分散タスク スケジューリングを実装できます。一般的に使用されるタスク スケジューラには、Laravel のタスク スケジューラや Cron などがあります。
タスク コードの例を定義します:
<?php namespace AppConsoleCommands; use IlluminateConsoleCommand; class ProcessTask extends Command { protected $signature = 'task:process'; protected $description = 'Process tasks'; public function __construct() { parent::__construct(); } public function handle() { // 处理任务的代码 } }
タスク スケジューラでタスクの実行頻度を設定します:
<?php namespace AppConsole; use IlluminateConsoleSchedulingSchedule; use IlluminateFoundationConsoleKernel as ConsoleKernel; class Kernel extends ConsoleKernel { protected $commands = [ CommandsProcessTask::class, ]; protected function schedule(Schedule $schedule) { $schedule->command('task:process')->everyMinute(); } protected function commands() { $this->load(__DIR__.'/Commands'); require base_path('routes/console.php'); } }
スクリプト ファイルを作成します:
#!/bin/bash php /path/to/task.php
Cron 式を設定します:
* * * * * /path/to/script.sh
上記のコード例では、タスクを定期的に実行し、その実行に基づいてタスクをタスクに割り当てることができます。対応するノードを実行する時間。
要約すると、PHP マイクロサービスでキュー サービスとタスク スケジューラを使用すると、分散タスクの割り当てとスケジューリングを実現できます。開発者は、実際のニーズに基づいて適切なキュー サービスとタスク スケジューラを選択し、サンプル コードに基づいて構成および開発できます。分散タスクの割り当てとスケジューリングにより、システムの同時処理能力とタスクの実行効率が向上します。
以上がPHP マイクロサービスで分散タスクの割り当てとスケジューリングを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。