Maison  >  Article  >  développement back-end  >  La pratique consistant à combiner la file d'attente de messages PHP et l'architecture de microservices

La pratique consistant à combiner la file d'attente de messages PHP et l'architecture de microservices

WBOY
WBOYoriginal
2023-07-08 11:10:46984parcourir

Pratique consistant à combiner la file d'attente de messages PHP avec l'architecture de microservices

Introduction :
Avec la complexité croissante des applications modernes, l'adoption de l'architecture de microservices est devenue un moyen nécessaire pour renforcer l'évolutivité et la flexibilité. En tant que mode de communication asynchrone, la file d'attente de messages peut aider à découpler différents modules de l'application et à améliorer la fiabilité et les performances du système. Cet article explique comment utiliser les files d'attente de messages en PHP pour prendre en charge l'architecture des microservices et fournit des exemples de code.

1. Qu'est-ce qu'une file d'attente de messages ?
La file d'attente de messages est un modèle de communication asynchrone utilisé pour découpler la communication entre différents composants ou services d'application. L'expéditeur du message envoie le message à la file d'attente et le destinataire récupère le message de la file d'attente et le traite. La file d'attente des messages fournit un mécanisme de communication fiable. Même si un composant du système n'est pas disponible, les messages peuvent s'accumuler dans la file d'attente et attendre d'être traités une fois le composant restauré.

2. Scénario d'application de file d'attente de messages dans l'architecture de microservices
Dans l'architecture de microservices, la communication et la collaboration entre différents services sont nécessaires. La file d'attente de messages peut être appliquée aux scénarios suivants :

  1. Communication asynchrone : envoyez la demande à la file d'attente de messages, puis traitez-la de manière asynchrone par le consommateur.
  2. Découplage du système : améliorez la fiabilité et les performances du système en convertissant la communication entre les services dépendants en files d'attente de messages.
  3. Planification des tâches : placez les tâches qui doivent être retardées ou programmées pour être exécutées dans la file d'attente des messages et qui seront traitées par le consommateur selon les règles de priorité et de planification.

3. Introduction à l'extension de file d'attente de messages PHP
En PHP, il existe de nombreuses extensions de file d'attente de messages matures parmi lesquelles choisir, telles que RabbitMQ, ActiveMQ et Kafka, etc. Cet article présentera RabbitMQ à titre d'exemple.

RabbitMQ est un système de file d'attente de messages open source qui implémente le protocole AMQP (Advanced Message Queuing Protocol) et offre une fiabilité et une évolutivité élevées. Vous trouverez ci-dessous un exemple simple qui montre comment utiliser l'extension PHP de RabbitMQ pour créer une file d'attente de messages.

<?php

require_once __DIR__ . '/vendor/autoload.php';

use PhpAmqpLibConnectionAMQPStreamConnection;
use PhpAmqpLibMessageAMQPMessage;

// 连接RabbitMQ服务器
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
$channel = $connection->channel();

// 声明一个名为hello的队列
$channel->queue_declare('hello', false, false, false, false);

// 发送消息到队列
$message = new AMQPMessage('Hello RabbitMQ!');
$channel->basic_publish($message, '', 'hello');

echo " [x] Sent 'Hello RabbitMQ!'
";

// 关闭连接
$channel->close();
$connection->close();
?>

4. Pratique de la file d'attente de messages dans l'architecture de microservices
Ce qui suit prend un système de commerce électronique simple comme exemple pour présenter comment combiner la file d'attente de messages avec l'architecture de microservices.

Scénario : une fois que l'utilisateur a passé une commande, des opérations telles que la déduction des stocks, le calcul des points et les modifications du statut de la commande doivent être effectuées.

  1. Service d'inventaire
    Créez un service d'inventaire, écoutez les événements de réussite des commandes et gérez la logique de déduction des stocks.
<?php

require_once __DIR__ . '/vendor/autoload.php';

use PhpAmqpLibConnectionAMQPStreamConnection;
use PhpAmqpLibMessageAMQPMessage;

$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
$channel = $connection->channel();

$channel->queue_declare('order_success_event', false, false, false, false);

$callback = function ($message) {
    echo " [x] Order success event received: " . $message->body . "
";
    
    // 处理库存扣减逻辑
    
    $message->delivery_info['channel']->basic_ack($message->delivery_info['delivery_tag']);
};

$channel->basic_consume('order_success_event', '', false, false, false, false, $callback);

while ($channel->is_consuming()) {
    $channel->wait();
}

$channel->close();
$connection->close();
?>
  1. Service Points
    Créez un service de points, écoutez les événements de réussite des commandes et gérez la logique de calcul des points.
<?php

require_once __DIR__ . '/vendor/autoload.php';

use PhpAmqpLibConnectionAMQPStreamConnection;
use PhpAmqpLibMessageAMQPMessage;

$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
$channel = $connection->channel();

$channel->queue_declare('order_success_event', false, false, false, false);

$callback = function ($message) {
    echo " [x] Order success event received: " . $message->body . "
";
    
    // 处理积分计算逻辑
    
    $message->delivery_info['channel']->basic_ack($message->delivery_info['delivery_tag']);
};

$channel->basic_consume('order_success_event', '', false, false, false, false, $callback);

while ($channel->is_consuming()) {
    $channel->wait();
}

$channel->close();
$connection->close();
?>
  1. Service de commande
    Créez un service de commande pour gérer la logique métier liée aux commandes, notamment la réception des demandes de commande des utilisateurs et l'envoi d'événements de réussite de commande.
<?php

require_once __DIR__ . '/vendor/autoload.php';

use PhpAmqpLibConnectionAMQPStreamConnection;
use PhpAmqpLibMessageAMQPMessage;

$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
$channel = $connection->channel();

$channel->queue_declare('order_success_event', false, false, false, false);

// 接收用户下单请求
$request = $_POST; // 假设为用户的下单请求数据
$orderInfo = createOrder($request);

// 处理订单相关的业务逻辑

// 发送订单成功事件到消息队列
$message = new AMQPMessage(json_encode($orderInfo));
$channel->basic_publish($message, '', 'order_success_event');

echo "Order placed successfully!";

$channel->close();
$connection->close();

function createOrder($request) {
    // 创建订单的逻辑
    // ...
    
    return $orderInfo;
}
?>

5. Résumé
Cet article explique comment utiliser les files d'attente de messages en PHP pour prendre en charge l'architecture des microservices et fournit des exemples de code RabbitMQ. En utilisant des files d'attente de messages, nous pouvons réaliser un découplage et une communication asynchrone entre les microservices, améliorant ainsi la fiabilité et les performances du système. Pour les applications complexes, l’adoption d’une architecture de microservices et de files d’attente de messages constitue une approche de conception architecturale efficace. J'espère que cet article sera utile aux lecteurs dans la pratique.

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:
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