So implementieren Sie die verteilte Aufgabenzuweisung und -planung in PHP-Microservices
Die verteilte Aufgabenzuweisung und -planung ist eine häufige Anforderung beim Erstellen umfangreicher Anwendungen. Als häufig verwendete Webentwicklungssprache kann PHP auch zum Aufbau einer Microservice-Architektur und zur Implementierung der verteilten Aufgabenzuweisung und -planung verwendet werden. In diesem Artikel wird die Implementierung der verteilten Aufgabenzuweisung und -planung in PHP-Mikrodiensten vorgestellt und spezifische Codebeispiele bereitgestellt.
1. Verteilte Aufgabenzuweisung
Bei der verteilten Aufgabenzuweisung gibt es einen Aufgabenherausgeber, der Aufgaben in der Aufgabenwarteschlange veröffentlicht, und dann verarbeiten mehrere Aufgabenkonsumenten diese Aufgaben. In PHP können Warteschlangen zur Implementierung der Aufgabenverteilung verwendet werden. Zu den häufig verwendeten Warteschlangendiensten gehören RabbitMQ und Redis.
Beispiel für einen Aufgabencode veröffentlichen:
<?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(); ?>
Beispiel für einen Aufgabencode empfangen:
<?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(); ?>
Beispiel für einen Aufgabencode veröffentlichen:
<?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 "; ?>
Beispiel für einen Aufgabencode empfangen:
<?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 "; } ?>
Das obige Codebeispiel kann Aufgaben in der Warteschlange veröffentlichen und diese Aufgaben dann von mehreren Verbrauchern verarbeiten. Die Anzahl der Verbraucher kann je nach tatsächlichem Bedarf erhöht werden, um eine verteilte Aufgabenverarbeitung zu erreichen.
2. Verteilte Aufgabenplanung
Verteilte Aufgabenplanung bedeutet, dass in einem verteilten System Aufgaben den entsprechenden Knoten zur Ausführung gemäß den spezifischen Regeln der Aufgabe zugewiesen werden. In PHP können Sie den Taskplaner verwenden, um eine verteilte Aufgabenplanung zu implementieren. Zu den häufig verwendeten Aufgabenplanern gehören der Aufgabenplaner von Laravel und Cron.
Definition eines Aufgabencodebeispiels:
<?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() { // 处理任务的代码 } }
Legen Sie die Ausführungshäufigkeit der Aufgabe im Aufgabenplaner fest:
<?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'); } }
Schreiben Sie die Skriptdatei:
#!/bin/bash php /path/to/task.php
Legen Sie den Cron-Ausdruck fest:
* * * * * /path/to/script.sh
Das obige Codebeispiel kann Aufgaben regelmäßig ausführen und die Aufgaben basierend auf der Aufgabenausführungszeit den entsprechenden Knoten zur Ausführung zuweisen.
Zusammenfassend lässt sich sagen, dass durch die Verwendung von Warteschlangendiensten und Aufgabenplanern in PHP-Mikrodiensten eine verteilte Aufgabenzuweisung und -planung erreicht werden kann. Entwickler können den geeigneten Warteschlangendienst und Aufgabenplaner basierend auf den tatsächlichen Anforderungen auswählen und basierend auf dem Beispielcode konfigurieren und entwickeln. Durch verteilte Aufgabenzuweisung und -planung können die gleichzeitigen Verarbeitungsfähigkeiten und die Effizienz der Aufgabenausführung des Systems verbessert werden.
Das obige ist der detaillierte Inhalt vonSo implementieren Sie die verteilte Aufgabenzuweisung und -planung in PHP-Microservices. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!