Maison développement back-end tutoriel php Modèles de conception et bonnes pratiques pour les files d'attente de messages PHP

Modèles de conception et bonnes pratiques pour les files d'attente de messages PHP

Jul 08, 2023 pm 05:54 PM
设计模式 消息队列 最佳实践

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();
Copier après la connexion

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();
Copier après la connexion

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();
Copier après la connexion

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();
Copier après la connexion

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!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Quelles sont les meilleures pratiques pour le framework golang ? Quelles sont les meilleures pratiques pour le framework golang ? Jun 01, 2024 am 10:30 AM

Lorsque vous utilisez des frameworks Go, les meilleures pratiques incluent : Choisissez un framework léger tel que Gin ou Echo. Suivez les principes RESTful et utilisez des verbes et des formats HTTP standard. Tirez parti du middleware pour simplifier les tâches telles que l’authentification et la journalisation. Gérez correctement les erreurs, en utilisant des types d’erreurs et des messages significatifs. Écrire des tests unitaires et d'intégration pour garantir le bon fonctionnement de l'application.

Comparaison approfondie : meilleures pratiques entre les frameworks Java et d'autres frameworks de langage Comparaison approfondie : meilleures pratiques entre les frameworks Java et d'autres frameworks de langage Jun 04, 2024 pm 07:51 PM

Les frameworks Java conviennent aux projets où la multiplateforme, la stabilité et l'évolutivité sont cruciales. Pour les projets Java, Spring Framework est utilisé pour l'injection de dépendances et la programmation orientée aspect, et les meilleures pratiques incluent l'utilisation de SpringBean et SpringBeanFactory. Hibernate est utilisé pour le mappage objet-relationnel, et la meilleure pratique consiste à utiliser HQL pour les requêtes complexes. JakartaEE est utilisé pour le développement d'applications d'entreprise et la meilleure pratique consiste à utiliser EJB pour la logique métier distribuée.

La différence entre les modèles de conception et les modèles architecturaux dans le framework Java La différence entre les modèles de conception et les modèles architecturaux dans le framework Java Jun 02, 2024 pm 12:59 PM

Dans le framework Java, la différence entre les modèles de conception et les modèles architecturaux réside dans le fait que les modèles de conception définissent des solutions abstraites aux problèmes courants de conception de logiciels, en se concentrant sur l'interaction entre les classes et les objets, tels que les modèles d'usine. Les modèles architecturaux définissent la relation entre les structures et les modules du système, en se concentrant sur l'organisation et l'interaction des composants du système, tels que l'architecture en couches.

Meilleures pratiques d'utilisation du C++ dans l'IoT et les systèmes embarqués Meilleures pratiques d'utilisation du C++ dans l'IoT et les systèmes embarqués Jun 02, 2024 am 09:39 AM

Introduction aux meilleures pratiques d'utilisation du C++ dans l'IoT et les systèmes embarqués C++ est un langage puissant largement utilisé dans l'IoT et les systèmes embarqués. Cependant, l’utilisation de C++ dans ces environnements restreints nécessite de suivre des bonnes pratiques spécifiques pour garantir performances et fiabilité. La gestion de la mémoire utilise des pointeurs intelligents : les pointeurs intelligents gèrent automatiquement la mémoire pour éviter les fuites de mémoire et les pointeurs suspendus. Pensez à utiliser des pools de mémoire : les pools de mémoire offrent un moyen plus efficace d'allouer et de libérer de la mémoire que le malloc()/free() standard. Minimiser l'allocation de mémoire : dans les systèmes embarqués, les ressources mémoire sont limitées. La réduction de l'allocation de mémoire peut améliorer les performances. Les threads et le multitâche utilisent le principe RAII : RAII (l'acquisition des ressources est l'initialisation) garantit que l'objet est libéré à la fin de son cycle de vie.

Modèles de conception PHP : développement piloté par les tests en pratique Modèles de conception PHP : développement piloté par les tests en pratique Jun 03, 2024 pm 02:14 PM

TDD est utilisé pour écrire du code PHP de haute qualité. Les étapes comprennent : l'écriture de cas de test, la description des fonctionnalités attendues et leur échec. Écrivez du code de manière à ce que seuls les cas de test réussissent sans optimisation excessive ni conception détaillée. Une fois les cas de test réussis, optimisez et refactorisez le code pour améliorer la lisibilité, la maintenabilité et l’évolutivité.

Quels sont les avantages et les inconvénients de l'utilisation de modèles de conception dans le framework Java ? Quels sont les avantages et les inconvénients de l'utilisation de modèles de conception dans le framework Java ? Jun 01, 2024 pm 02:13 PM

Les avantages de l'utilisation de modèles de conception dans les frameworks Java incluent : une lisibilité, une maintenabilité et une évolutivité améliorées du code. Les inconvénients incluent la complexité, la surcharge de performances et la courbe d'apprentissage abrupte due à une utilisation excessive. Cas pratique : Le mode proxy permet de charger des objets paresseusement. Utilisez les modèles de conception à bon escient pour tirer parti de leurs avantages et minimiser leurs inconvénients.

Application des modèles de conception dans le cadre Guice Application des modèles de conception dans le cadre Guice Jun 02, 2024 pm 10:49 PM

Le framework Guice applique un certain nombre de modèles de conception, notamment : Modèle Singleton : garantir qu'une classe n'a qu'une seule instance via l'annotation @Singleton. Modèle de méthode d'usine : créez une méthode d'usine via l'annotation @Provides et obtenez l'instance d'objet lors de l'injection de dépendances. Mode stratégie : encapsulez l'algorithme dans différentes classes de stratégie et spécifiez la stratégie spécifique via l'annotation @Named.

Comment Go WebSocket implémente-t-il la file d'attente des messages ? Comment Go WebSocket implémente-t-il la file d'attente des messages ? Jun 02, 2024 am 10:03 AM

GoWebSocket implémente les files d'attente de messages à l'aide de canaux. Les étapes d'implémentation sont les suivantes : 1. Créez un canal de file d'attente de messages. 2. Démarrez une goroutine pour écouter les messages entrants. 3. Dans le gestionnaire, écrivez le message dans la file d'attente des messages. 4. Lorsqu'un message doit être envoyé, écrivez-le dans la file d'attente. Cette approche peut être utilisée pour créer des applications en temps réel telles que le chat, les éditeurs collaboratifs et les mises à jour des stocks en temps réel.

See all articles