Maison  >  Article  >  développement back-end  >  Comment implémenter la garantie des messages de file d'attente et la persistance des messages en PHP et MySQL

Comment implémenter la garantie des messages de file d'attente et la persistance des messages en PHP et MySQL

王林
王林original
2023-10-15 16:16:41984parcourir

Comment implémenter la garantie des messages de file dattente et la persistance des messages en PHP et MySQL

Comment implémenter la garantie des messages de file d'attente et la persistance des messages en PHP et MySQL

[Introduction]
À l'ère d'Internet, avec l'augmentation du nombre d'utilisateurs et l'augmentation de la complexité du système, la file d'attente des messages est devenue un élément important composant un. La file d'attente de messages peut réaliser des fonctions telles que le découplage, le traitement asynchrone, l'écrêtage des pics et le remplissage des vallées, etc., améliorant ainsi la stabilité et l'évolutivité du système. Dans les applications pratiques, nous devons souvent prendre en compte la fiabilité et le stockage persistant des messages. Cet article explique comment implémenter la garantie des messages de file d'attente et la persistance des messages dans PHP et MySQL.

[Concept de file d'attente de messages]
La file d'attente de messages est un mode de communication asynchrone qui est souvent utilisé pour résoudre les problèmes de couplage temporel et spatial entre les systèmes. La file d'attente des messages se compose de trois parties : l'expéditeur, le destinataire et la file d'attente des messages. L'expéditeur produit des messages et les envoie à la file d'attente des messages, et le destinataire récupère les messages de la file d'attente des messages pour les consommer. La file d'attente des messages peut garantir l'ordre, la fiabilité et le stockage durable des messages.

[Mise en œuvre de la garantie des messages]
La garantie des messages fait principalement référence à la garantie de fiabilité dans le processus de livraison des messages afin d'éviter la perte de messages ou la livraison répétée.

  1. Mode Transaction
    En PHP, les transactions de base de données peuvent être utilisées pour assurer une livraison fiable des messages. Lors de l'envoi d'un message, le message est inséré dans la base de données et une transaction de base de données est lancée. Une fois le message reçu, la transaction est soumise une fois le traitement de confirmation terminé. Si la réception échoue, la transaction est annulée et le message réintègre la file d'attente des messages.

L'exemple de code est le suivant :

<?php
// 发送消息
$pdo = new PDO("mysql:host=127.0.0.1;dbname=test", "username", "password");
$pdo->beginTransaction();
$stmt = $pdo->prepare("INSERT INTO message_queue(content) VALUES(:content)");
$content = "Hello, Message Queue!";
$stmt->bindParam(':content', $content);
$stmt->execute();
$pdo->commit();

// 接收消息
$pdo->beginTransaction();
$stmt = $pdo->prepare("SELECT * FROM message_queue LIMIT 1");
$stmt->execute();
$message = $stmt->fetch(PDO::FETCH_ASSOC);
echo $message['content'];
$stmt = $pdo->prepare("DELETE FROM message_queue WHERE id=:id");
$stmt->bindParam(':id', $message['id']);
$stmt->execute();
$pdo->commit();
?>
  1. Mécanisme de confirmation du message
    Le mécanisme de confirmation du message signifie qu'une fois que le destinataire a traité le message, il envoie un message de confirmation à la file d'attente des messages pour informer que le message a été traité avec succès. Si le traitement du message échoue, vous pouvez choisir de ne pas envoyer de message de confirmation et le message sera renvoyé dans la file d'attente des messages.

L'exemple de code est le suivant :

<?php
// 发送消息
$channel = new AMQPChannel(new AMQPConnection());
$queue = new AMQPQueue($channel);
$message = "Hello, Message Queue!";
$queue->setName('test_queue');
$queue->setFlags(AMQP_DURABLE);
$queue->declare();
$queue->publish($message, '', AMQP_DURABLE);

// 接收消息
$channel = new AMQPChannel(new AMQPConnection());
$queue = new AMQPQueue($channel);
$queue->setName('test_queue');
$queue->setFlags(AMQP_DURABLE);
$queue->declare();
$message = $queue->get();
if ($message !== false) {
    echo $message->getBody();
    $queue->ack($message->getDeliveryTag());
}
?>

[Mise en œuvre de la persistance des messages]
La persistance des messages fait référence à la garantie de fiabilité des messages pendant la transmission ou lorsqu'ils sont stockés dans la file d'attente des messages.

  1. Stockage de base de données
    Stockez les messages dans la base de données MySQL et utilisez les capacités de persistance de la base de données pour garantir la fiabilité des messages. Vous pouvez utiliser des tables de base de données pour représenter les files d'attente de messages et enregistrer l'état et le contenu des messages.

L'exemple de code est le suivant :

<?php
// 发送消息
$pdo = new PDO("mysql:host=127.0.0.1;dbname=test", "username", "password");
$stmt = $pdo->prepare("INSERT INTO message_queue(content, status) VALUES(:content, :status)");
$content = "Hello, Message Queue!";
$status = 0; // 0:未处理,1:已处理
$stmt->bindParam(':content', $content);
$stmt->bindParam(':status', $status);
$stmt->execute();

// 接收消息
$pdo = new PDO("mysql:host=127.0.0.1;dbname=test", "username", "password");
$stmt = $pdo->prepare("SELECT * FROM message_queue WHERE status=0 LIMIT 1");
$stmt->execute();
$message = $stmt->fetch(PDO::FETCH_ASSOC);
echo $message['content'];
$stmt = $pdo->prepare("UPDATE message_queue SET status=1 WHERE id=:id");
$stmt->bindParam(':id', $message['id']);
$stmt->execute();
?>
  1. Persistance de la file d'attente des messages
    Avant que la file d'attente des messages ne stocke le message, définissez l'indicateur de persistance du message et réglez la file d'attente des messages en mode persistance pour vous assurer que le message ne sera pas perdu. après le redémarrage du service.

L'exemple de code est le suivant :

<?php
// 发送消息
$channel = new AMQPChannel(new AMQPConnection());
$queue = new AMQPQueue($channel);
$message = "Hello, Message Queue!";
$queue->setName('test_queue');
$queue->setFlags(AMQP_DURABLE);
$queue->declare();
$queue->publish($message, '', AMQP_DURABLE);

// 接收消息
$channel = new AMQPChannel(new AMQPConnection());
$queue = new AMQPQueue($channel);
$queue->setName('test_queue');
$queue->setFlags(AMQP_DURABLE);
$queue->declare();
$message = $queue->get();
if ($message !== false) {
    echo $message->getBody();
    $queue->ack($message->getDeliveryTag());
}
?>

[Résumé]
Cet article présente comment implémenter la garantie des messages de file d'attente et la persistance des messages en PHP et MySQL. Grâce au mode de transaction et au mécanisme de confirmation des messages, une livraison fiable des messages peut être assurée. Grâce au stockage de base de données et à la persistance de la file d'attente des messages, un stockage persistant des messages peut être obtenu. Ces méthodes peuvent aider les développeurs à créer un système de file d'attente de messages stable et fiable et à améliorer la fiabilité et l'évolutivité du système.

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