Modèles de conception et meilleures pratiques pour les files d'attente de messages PHP
Introduction :
Avec la popularité d'Internet et le développement de la technologie, les files d'attente de messages sont progressivement devenues un élément important des applications modernes. Les files d'attente de messages peuvent être utilisées pour traiter des tâches de manière asynchrone, découpler divers modules d'application et améliorer l'évolutivité et la fiabilité du système. Dans cet article, nous présenterons les modèles de conception et les meilleures pratiques des files d'attente de messages en PHP, et fournirons des exemples de code pour aider les lecteurs à mieux les comprendre et les appliquer.
1. Le concept de base de la file d'attente de messages
La file d'attente de messages est une sorte de middleware utilisé pour transmettre des messages entre les applications. Elle permet le traitement asynchrone des tâches, l'envoi de messages à une file d'attente, puis la suppression et le traitement des consommateurs de la file d'attente. Les systèmes de file d'attente de messages courants incluent RabbitMQ, Kafka, ActiveMQ, etc.
2. Modèle de conception de file d'attente de messages en PHP
1. Modèle de publication-abonnement
Le modèle de publication-abonnement est un modèle de conception de file d'attente de messages couramment utilisé qui combine l'expéditeur du message (éditeur) et les destinataires du message (abonnés) sont découplés par la publication. messages dans la file d'attente des messages, les abonnés peuvent choisir de s'abonner aux messages qui les intéressent en fonction de leurs propres besoins. Voici un exemple de code qui utilise RabbitMQ pour implémenter le modèle de publication-abonnement :
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. Modèle point à point
Le modèle point à point est un commun Le modèle de conception de file d'attente de messages découple les expéditeurs de messages (producteurs) et les récepteurs de messages (consommateurs) en envoyant des messages à une file d'attente, puis en les sortant de la file d'attente et en les traitant par des consommateurs spécifiques. Voici un exemple de code qui utilise RabbitMQ pour implémenter le mode point à point :
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. Meilleures pratiques pour les files d'attente de messages en PHP
1. messages
Dans le producteur Lors de la publication d'un message, les propriétés de persistance du message doivent être définies pour garantir que le message ne sera pas perdu même en cas d'exception de file d'attente. Lorsqu'un consommateur traite un message, il doit confirmer explicitement si le message a été consommé pour éviter une consommation répétée du message.
2. Mécanisme de gestion des erreurs et de nouvelle tentative
Lorsque les consommateurs traitent les messages, divers échecs peuvent survenir, empêchant le traitement normal des messages. Afin de garantir la fiabilité du message, vous pouvez utiliser un mécanisme de nouvelle tentative, c'est-à-dire restituer le message lorsque le traitement du message échoue et définir le nombre maximum de tentatives. Une fois le nombre de tentatives dépassé, le message peut. être envoyé dans la file d'attente des lettres mortes.
3. Optimiser les performances de concurrence des consommateurs
Dans les scénarios de concurrence élevée, afin d'améliorer le débit des consommateurs, cela peut être réalisé en augmentant le nombre de consommateurs. Dans le même temps, le mécanisme de prélecture des messages (Prefetch) peut être utilisé, c'est-à-dire que plusieurs messages sont retirés de la file d'attente en même temps du côté du consommateur pour éviter toute communication réseau à chaque fois.
Conclusion :
Cet article présente les modèles de conception et les meilleures pratiques des files d'attente de messages en PHP, et fournit un exemple de code pour implémenter le mode publication-abonnement et le mode point à point à l'aide de RabbitMQ. En concevant et en appliquant correctement les files d'attente de messages, vous pouvez améliorer la fiabilité, l'évolutivité et les performances du système, et résoudre les problèmes de traitement asynchrone dans les applications. J'espère que cet article fournira des références et une aide aux lecteurs pour utiliser les files d'attente de messages dans des projets réels.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!