Maison  >  Article  >  développement back-end  >  Scénarios d'application de déduplication de messages de file d'attente et d'idempotence de messages en PHP et MySQL

Scénarios d'application de déduplication de messages de file d'attente et d'idempotence de messages en PHP et MySQL

WBOY
WBOYoriginal
2023-10-15 12:06:121395parcourir

Scénarios dapplication de déduplication de messages de file dattente et didempotence de messages en PHP et MySQL

Scénarios d'application de déduplication de messages de file d'attente et d'idempotence de messages en PHP et MySQL

Introduction :
Avec le développement continu de la technologie Internet, les files d'attente sont devenues l'un des composants de base importants dans divers systèmes distribués . Dans le processus d'application des files d'attente, la déduplication des messages et l'idempotence des messages sont deux problèmes courants, en particulier dans les scénarios de concurrence élevée. Cet article présentera en détail les scénarios d'application de la déduplication des messages de file d'attente et de l'idempotence des messages dans PHP et MySQL, et fournira des exemples de code spécifiques.

1. Présentation de la déduplication des messages dans les files d'attente
La déduplication des messages signifie que dans le système de file d'attente, le même message ne peut être traité qu'une seule fois pour éviter un traitement répété. Pour les systèmes de file d'attente, les messages sont souvent inévitablement envoyés à plusieurs reprises. Par exemple, des anomalies du réseau, des mécanismes de nouvelle tentative et d'autres facteurs peuvent entraîner une duplication des messages. Par conséquent, nous devons effectuer un traitement de déduplication des messages du côté du consommateur.

1.1 Méthodes de déduplication
Il existe deux méthodes de déduplication de messages courantes : la déduplication basée sur Redis et la déduplication basée sur la base de données. La déduplication basée sur Redis est implémentée via une structure de données de collecte. Chaque fois qu'un message est consommé, Redis demande d'abord si le message a été traité, sinon, la logique métier correspondante est exécutée et le message est exécuté. ajouté à la collection Redis au milieu. La déduplication basée sur la base de données est réalisée en établissant un index unique dans la base de données. Chaque fois qu'un message est consommé, la base de données est d'abord interrogée pour voir si un enregistrement du message existe déjà. S'il existe, il est ignoré. la logique métier est exécutée et insère les enregistrements de messages dans la base de données.

1.2 Exemple de code PHP
Supposons que nous utilisions Redis comme support de stockage pour la déduplication des messages. Voici un exemple de code :

<?php
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);

// 判断消息是否已经处理过
function isMessageProcessed($message)
{
    global $redis;
    return $redis->sIsMember('processed_messages', $message);
}

// 处理消息并进行去重操作
function processMessage($message)
{
    global $redis;
    if (!isMessageProcessed($message)) {
        // 执行业务逻辑
        // ...

        // 将消息加入到已处理消息集合中
        $redis->sAdd('processed_messages', $message);
    }
}

// 消费消息
function consumeMessage($message)
{
    processMessage($message);
}

$message = 'example_message';
consumeMessage($message);

2 Aperçu de l'idempotence des messages dans les files d'attente
L'impuissance des messages signifie que pour le même message, plusieurs traités. plusieurs fois, les résultats finaux du traitement restent cohérents. L'idempotence des messages est très importante dans les systèmes distribués, car dans des situations de concurrence élevée, le même message peut être traité par plusieurs consommateurs en même temps. S'il n'y a pas de garantie d'idempotence, une incohérence des données se produira.

2.1 Façons d'implémenter l'idempotence
Il existe trois façons courantes d'implémenter l'idempotence : numéro de série + table idempotente, annotations personnalisées idempotentes et contraintes d'unicité. Parmi eux, le numéro de séquence + table idempotente est créé en créant une table idempotente dans la base de données. Avant de traiter le message, interrogez d'abord la table idempotente pour déterminer si le message a été traité, ignorez-le, sinon exécutez. l'entreprise correspondante. Logique et insérer les enregistrements de messages dans la table idempotente. Les annotations personnalisées idempotentes identifient les opérations idempotentes via des annotations personnalisées. Avant que la méthode ne soit exécutée, il est d'abord déterminé si la méthode a été exécutée, sinon la logique métier correspondante sera exécutée. La contrainte d'unicité est obtenue en établissant un index unique dans la base de données. Lorsque des enregistrements en double sont générés lors du traitement des messages, la base de données filtrera automatiquement les enregistrements en double.

2.2 Exemple de code MySQL
Ce qui suit est un exemple de code qui utilise MySQL pour implémenter l'idempotence des messages :

<?php
$pdo = new PDO('mysql:host=localhost;dbname=test', 'root', 'password');

// 判断消息是否已经处理过
function isMessageProcessed($message)
{
    global $pdo;
    $stmt = $pdo->prepare('SELECT COUNT(*) FROM processed_messages WHERE message = :message');
    $stmt->execute([':message' => $message]);
    return $stmt->fetchColumn() > 0;
}

// 处理消息并实现幂等性
function processMessage($message)
{
    global $pdo;
    if (!isMessageProcessed($message)) {
        // 执行业务逻辑
        // ...

        // 插入处理过的消息记录
        $stmt = $pdo->prepare('INSERT INTO processed_messages (message) VALUES (:message)');
        $stmt->execute([':message' => $message]);
    }
}

// 消费消息
function consumeMessage($message)
{
    processMessage($message);
}

$message = 'example_message';
consumeMessage($message);

Conclusion :
Dans l'application des files d'attente, la déduplication des messages et l'idempotence des messages sont deux problèmes très importants . Grâce aux exemples de code spécifiques basés sur Redis et MySQL présentés dans cet article, le problème du traitement répété des messages et de la cohérence des données peut être résolu efficacement, et la fiabilité et la stabilité du système peuvent être améliorées. Dans les applications pratiques, il est nécessaire de sélectionner des solutions de déduplication et d'idempotence appropriées en fonction de scénarios commerciaux spécifiques, et d'effectuer les réglages et optimisations correspondants si nécessaire.

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