Heim  >  Artikel  >  Backend-Entwicklung  >  Entwurfsmuster und Best Practices für PHP-Nachrichtenwarteschlangen

Entwurfsmuster und Best Practices für PHP-Nachrichtenwarteschlangen

PHPz
PHPzOriginal
2023-07-08 17:54:07863Durchsuche

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.

2. Nachrichtenwarteschlangen-Entwurfsmuster in PHP

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 Nachrichten

Im 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

Wenn Verbraucher Nachrichten verarbeiten, können verschiedene Fehler auftreten, die dazu führen, dass die Nachrichten nicht normal verarbeitet werden. Um die Zuverlässigkeit der Nachricht sicherzustellen, können Sie einen Wiederholungsmechanismus verwenden, d. h. die Nachricht erneut übermitteln, wenn die Nachrichtenverarbeitung fehlschlägt, und die maximale Anzahl von Wiederholungsversuchen festlegen an die Warteschlange für unzustellbare Nachrichten gesendet werden.


3. Optimieren Sie die Parallelitätsleistung von Verbrauchern.

In Szenarien mit hoher Parallelität kann dies durch Erhöhen der Anzahl der Verbraucher erreicht werden, um den Durchsatz von Verbrauchern zu verbessern. Gleichzeitig kann der Nachrichten-Prefetch-Mechanismus (Prefetch) verwendet werden, dh auf der Verbraucherseite werden mehrere Nachrichten gleichzeitig aus der Warteschlange genommen, um jedes Mal eine Netzwerkkommunikation zu vermeiden.


Fazit:

Dieser Artikel stellt die Entwurfsmuster und Best Practices von Nachrichtenwarteschlangen in PHP vor und bietet Beispielcode für die Implementierung des Publish-Subscribe-Modus und des Punkt-zu-Punkt-Modus mit RabbitMQ. Durch die ordnungsgemäße Gestaltung und Anwendung von Nachrichtenwarteschlangen können Sie die Systemzuverlässigkeit, Skalierbarkeit und Leistung verbessern und asynchrone Verarbeitungsprobleme in Anwendungen lösen. Ich hoffe, dieser Artikel bietet den Lesern Hinweise und Hilfe bei der Verwendung von Nachrichtenwarteschlangen in tatsächlichen Projekten.

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn