Maison >développement back-end >tutoriel php >Application de la technologie de file d'attente à la déduplication des messages et à l'idempotence des messages en PHP et MySQL

Application de la technologie de file d'attente à la déduplication des messages et à l'idempotence des messages en PHP et MySQL

王林
王林original
2023-10-15 12:18:191366parcourir

Application de la technologie de file dattente à la déduplication des messages et à lidempotence des messages en PHP et MySQL

Application de la technologie de file d'attente dans la déduplication et l'idempotence des messages en PHP et MySQL

Résumé : Avec le développement continu des applications Internet, les files d'attente de messages sont devenues l'un des outils importants pour gérer les opérations à haute concurrence et asynchrones. En PHP et MySQL, comment utiliser les files d'attente pour résoudre les problèmes de déduplication des messages et d'idempotence des messages ? Cet article présentera des exemples de code spécifiques utilisant Redis et MySQL pour implémenter ces deux fonctions.

  1. Introduction
    La file d'attente de messages est une méthode de transmission de messages entre applications, ce qui peut améliorer l'évolutivité et la fiabilité du système. Il existe de nombreux outils de file d'attente de messages matures dans le domaine PHP, tels que RabbitMQ, Kafka et Redis, tandis que MySQL est une base de données relationnelle courante.
  2. Déduplication des messages
    Dans la file d'attente des messages, des messages en double apparaissent parfois. En raison de la répétitivité des messages, certaines opérations peuvent être répétées, provoquant une confusion des données ou d'autres problèmes. Afin de résoudre ce problème, nous pouvons utiliser la structure de données Set de Redis pour dédupliquer les messages.

L'exemple de code est le suivant :

// 连接Redis
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);

// 消息去重
function deduplicate($message) {
    if ($redis->sismember('processed_messages', $message)) {
        return false; // 已处理过的消息,不再处理
    }
    
    // 处理消息的逻辑...
    
    $redis->sadd('processed_messages', $message);
    return true;
}

Dans le code ci-dessus, nous utilisons les méthodes sismember et sadd de Redis pour déterminer si le message a été traité. Si le message existe déjà dans la collection Redis Processed_messages, cela signifie que le message a été traité et false sera renvoyé directement. Sinon, traitez le message et ajoutez-le à la collection.

  1. Idempotence des messages
    Dans un système distribué, en raison du réseau et d'autres raisons, les messages peuvent être consommés à plusieurs reprises. Afin de garantir l'exactitude du système, les messages doivent être traités de manière idempotente, c'est-à-dire que traiter le même message plusieurs fois a le même effet que de le traiter une seule fois. Dans MySQL, nous pouvons utiliser des index uniques pour obtenir l'idempotence des messages.

L'exemple de code est le suivant :

CREATE TABLE messages (
    id INT AUTO_INCREMENT PRIMARY KEY,
    message VARCHAR(255) NOT NULL
    UNIQUE KEY message_index (message)
);

Dans le code ci-dessus, nous créons une table de messages, dans laquelle le champ de message définit un index unique via UNIQUE KEY. Ensuite, avant d'insérer le message, nous devons déterminer si le message existe déjà.

L'exemple de code est le suivant :

// 连接MySQL
$mysqli = new mysqli('localhost', 'username', 'password', 'database');

// 消息幂等性处理
function handle_message($message) {
    $escaped_message = $mysqli->real_escape_string($message);
    
    $select_query = "SELECT id FROM messages WHERE message = '$escaped_message'";
    
    $result = $mysqli->query($select_query);
    if ($result->num_rows > 0) {
        return; // 消息已存在,不再处理
    }
    
    // 处理消息的逻辑...
    
    $insert_query = "INSERT INTO messages (message) VALUES ('$escaped_message')";
    $mysqli->query($insert_query);
}

Dans le code ci-dessus, nous utilisons la méthode real_escape_string de mysqli pour échapper au message et empêcher les attaques par injection SQL. Ensuite, nous interrogeons la table des messages pour déterminer si le message existe déjà. Si le nombre de lignes dans le jeu de résultats est supérieur à 0, cela signifie que le message existe déjà et peut être renvoyé directement. Sinon, traitez le message et insérez-le dans le tableau.

  1. Conclusion
    En utilisant Redis et MySQL, nous pouvons réaliser l'application de la technologie de file d'attente dans la déduplication des messages et l'idempotence des messages en PHP et MySQL. Grâce à la déduplication des messages, nous pouvons éviter le traitement répété des messages et améliorer les performances et la fiabilité du système ; en réalisant l'idempotence des messages, nous pouvons garantir l'exactitude du système et éviter les effets secondaires du traitement répété du même message. Dans les applications pratiques, les messages peuvent également être traités de manière plus flexible en fonction des besoins de l'entreprise.

Matériaux de référence :

  • Documentation officielle Redis : https://redis.io/documentation
  • Documentation officielle MySQL : https://dev.mysql.com/doc/

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