Entwurfsmuster und Best Practices für PHP-Nachrichtenwarteschlangen
Einführung:
Mit der Popularität des Internets und der Entwicklung der Technologie sind Nachrichtenwarteschlangen nach und nach zu einem wichtigen Bestandteil moderner Anwendungen geworden. Nachrichtenwarteschlangen können verwendet werden, um Aufgaben asynchron zu verarbeiten, verschiedene Anwendungsmodule zu entkoppeln und die Skalierbarkeit und Zuverlässigkeit des Systems zu verbessern. In diesem Artikel stellen wir die Entwurfsmuster und Best Practices von Nachrichtenwarteschlangen in PHP vor und stellen Codebeispiele bereit, um den Lesern zu helfen, sie besser zu verstehen und anzuwenden.
1. Das Grundkonzept der Nachrichtenwarteschlange: Nachrichtenwarteschlange ist eine Art Middleware, die zur Übermittlung von Nachrichten zwischen Anwendungen verwendet wird. Sie ermöglicht die asynchrone Verarbeitung von Aufgaben, das Senden von Nachrichten an eine Warteschlange und das anschließende Entfernen und Verarbeiten von Verbrauchern. Zu den gängigen Nachrichtenwarteschlangensystemen gehören RabbitMQ, Kafka, ActiveMQ usw.
1. Publish-Subscribe-Muster ist ein häufig verwendetes Nachrichtenwarteschlangen-Entwurfsmuster, das den Nachrichtensender (Herausgeber) und die Nachrichtenempfänger (Abonnenten) durch Veröffentlichung entkoppelt Nachrichten in der Nachrichtenwarteschlange können Abonnenten auswählen, ob sie Nachrichten von Interesse entsprechend ihren eigenen Bedürfnissen abonnieren möchten. Das Folgende ist ein Beispielcode, der RabbitMQ verwendet, um das Publish-Subscribe-Muster zu implementieren:
Publisher.php:
<?php require_once __DIR__ . '/vendor/autoload.php'; use PhpAmqpLibConnectionAMQPStreamConnection; use PhpAmqpLibMessageAMQPMessage; $connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest'); $channel = $connection->channel(); $channel->exchange_declare('logs', 'fanout', false, false, false); $message = new AMQPMessage('Hello, subscribers!'); $channel->basic_publish($message, 'logs'); $channel->close(); $connection->close();
Subscriber.php:
<?php require_once __DIR__ . '/vendor/autoload.php'; use PhpAmqpLibConnectionAMQPStreamConnection; use PhpAmqpLibMessageAMQPMessage; $connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest'); $channel = $connection->channel(); $channel->exchange_declare('logs', 'fanout', false, false, false); list($queue_name,,) = $channel->queue_declare('', false, false, true, false); $channel->queue_bind($queue_name, 'logs'); $channel->basic_consume($queue_name, '', false, true, false, false, function ($msg) { echo 'Received: ' . $msg->body . PHP_EOL; }); while (count($channel->callbacks)) { $channel->wait(); } $channel->close(); $connection->close();
2. Punkt-zu-Punkt-Muster
Punkt-zu-Punkt-Muster ist ein Allgemein Das Entwurfsmuster für Nachrichtenwarteschlangen entkoppelt Nachrichtensender (Produzenten) und Nachrichtenempfänger (Konsumenten), indem Nachrichten an eine Warteschlange gesendet und dann aus der Warteschlange entnommen und von bestimmten Konsumenten verarbeitet werden. Das Folgende ist ein Beispielcode, der RabbitMQ verwendet, um den Punkt-zu-Punkt-Modus zu implementieren:
Producer.php:
<?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); $message = new AMQPMessage('Hello, consumer!', ['delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT]); $channel->basic_publish($message, '', 'task_queue'); $channel->close(); $connection->close();
Consumer.php:
<?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); $channel->basic_qos(null, 1, null); $channel->basic_consume('task_queue', '', false, false, false, false, function ($msg) { echo 'Received: ' . $msg->body . PHP_EOL; sleep(1); $msg->delivery_info['channel']->basic_ack($msg->delivery_info['delivery_tag']); }); while (count($channel->callbacks)) { $channel->wait(); } $channel->close(); $connection->close();
3. Best Practices für Nachrichtenwarteschlangen in PHP
1 NachrichtenIm Produzenten sollten beim Veröffentlichen einer Nachricht die Persistenzeigenschaften der Nachricht festgelegt werden, um sicherzustellen, dass die Nachricht auch im Falle einer Warteschlangenausnahme nicht verloren geht. Wenn ein Konsument eine Nachricht verarbeitet, sollte er explizit bestätigen, ob die Nachricht konsumiert wurde, um einen wiederholten Konsum der Nachricht zu verhindern.
2. Fehlerbehandlungs- und Wiederholungsmechanismus
3. Optimieren Sie die Parallelitätsleistung von Verbrauchern.
Fazit:
Das obige ist der detaillierte Inhalt vonEntwurfsmuster und Best Practices für PHP-Nachrichtenwarteschlangen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!