PHP および MySQL におけるキュー メッセージの重複排除とメッセージべき等性の処理方法

王林
リリース: 2023-10-15 10:42:02
オリジナル
1036 人が閲覧しました

PHP および MySQL におけるキュー メッセージの重複排除とメッセージべき等性の処理方法

PHP および MySQL でメッセージの重複排除とキューの冪等性に対処する方法

実際の開発では、システムのパフォーマンスを向上させるために、非同期タスクを処理するためにメッセージ キューを使用することがよくあります。そして信頼性。ただし、キューを使用すると、メッセージの重複排除と冪等処理に関する問題が発生することがよくあります。この記事では、PHP および MySQL でメッセージの重複排除とメッセージの冪等性を処理するための一般的な方法をいくつか紹介し、具体的なコード例を示します。

  1. メッセージ重複排除の処理方法

メッセージ重複排除とは、同じメッセージがメッセージ キューにすでに存在する場合、繰り返し処理されないことを意味します。メッセージの重複排除を処理するにはいくつかの方法があります。 Redis ベースの重複排除処理方法は次のとおりです。

a) Redis 順序付きコレクション ZADD

を使用する まず、Redis の順序付きコレクションを使用してメッセージ重複排除処理を実行できます。メッセージの一意の識別子を順序付きセットのメンバーとして使用し、メッセージのタイムスタンプを順序付きセットのスコアとして使用します。新しいメッセージを受信すると、ZADD コマンドを使用して、メッセージの一意の識別子とタイムスタンプを順序付けられたコレクションに追加できます。次に、ZSCORE コマンドを使用してメッセージのタイムスタンプを照会します。タイムスタンプが特定のしきい値の範囲内にある場合、メッセージはすでに存在すると見なされ、処理されなくなります。

以下は、Redis に基づくメッセージ重複排除処理のコード例です。

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

function processMessage($message) {
    $messageId = generateUniqueId($message);
    $timestamp = time();

    // 判断消息是否已经存在
    $existingTimestamp = $redis->zscore('message:deduplication', $messageId);

    // 如果消息存在并且时间戳在一定范围内,则不进行处理
    if ($existingTimestamp && $timestamp - $existingTimestamp <= 60) {
        return;
    }

    // 处理消息
    // ...

    // 将消息的唯一标识和时间戳添加到有序集合中
    $redis->zadd('message:deduplication', $timestamp, $messageId);
}

function generateUniqueId($message) {
    // 生成消息的唯一标识
    // ...
    return $uniqueId;
}
ログイン後にコピー

上記のコードでは、まず generateUniqueId を通じてメッセージの一意の識別子を生成します。関数。次に、zscore コマンドを使用してメッセージのタイムスタンプをクエリし、メッセージがすでに存在し、タイムスタンプが特定の範囲内であるかどうかを判断します。メッセージがすでに存在する場合、処理は実行されません。それ以外の場合、メッセージは処理され、メッセージの一意の識別子とタイムスタンプが順序付きセットに追加されます。

b) MySQL テーブルの一意のインデックスを使用する

Redis に加えて、MySQL テーブルの一意のインデックスを使用してメッセージの重複を排除することもできます。メッセージの一意の識別子を格納する一意のインデックス フィールドを含むメッセージ テーブルを作成できます。新しいメッセージを受信すると、メッセージ テーブルにレコードを挿入しようとします。挿入に失敗した場合、メッセージはすでに存在しているため、処理されなくなります。それ以外の場合は、メッセージを処理します。

次は、MySQL に基づくメッセージ重複排除処理のコード例です。

<?php
$mysqli = new mysqli('localhost', 'username', 'password', 'database');

function processMessage($message) {
    $messageId = generateUniqueId($message);

    $sql = "INSERT IGNORE INTO message_deduplication (message_id) VALUES ('$messageId')";

    if ($mysqli->query($sql)) {
        // 插入成功,处理消息
        // ...
    } else {
        // 消息已经存在,不再处理
    }
}

function generateUniqueId($message) {
    // 生成消息的唯一标识
    // ...
    return $uniqueId;
}
ログイン後にコピー

上記のコードでは、generateUniqueId 関数を通じてメッセージの一意の識別子を生成します。 。次に、重複レコードの挿入を避けるために、INSERT IGNORE ステートメントを使用して、message_deduplication テーブルにレコードを挿入してみます。挿入が成功した場合は、メッセージが存在せず、メッセージが処理されることを意味し、そうでない場合は、メッセージがすでに存在し、それ以上の処理は実行されないことを意味します。

  1. メッセージ冪等性の処理方法

メッセージ冪等性とは、同じメッセージの複数の処理がビジネスに与える影響は 1 つだけであることを意味します。メッセージの冪等性を処理するにはいくつかの方法があります。以下は、データベースベースの冪等処理方法です:

a) メッセージを処理する前にデータベースのステータスをクエリします。

メッセージを処理するときに、データベースにステータス テーブルを作成できます。メッセージの処理ステータスを記録します。新しいメッセージを受信すると、まずステータス テーブルが照会されて、メッセージが処理されたかどうかが判断されます。メッセージが処理されている場合は処理は実行されませんが、そうでない場合はメッセージが処理され、ステータス テーブル内のメッセージの処理ステータスが更新されます。

次は、MySQL に基づくメッセージ冪等性処理のコード例です。

<?php
$mysqli = new mysqli('localhost', 'username', 'password', 'database');

function processMessage($message) {
    $messageId = generateUniqueId($message);

    // 查询处理状态
    $sql = "SELECT status FROM message_processing WHERE message_id = '$messageId'";
    $result = $mysqli->query($sql);

    if ($result && $result->num_rows > 0) {
        $row = $result->fetch_assoc();
        $status = $row['status'];

        // 如果处理状态为已处理,则不再处理
        if ($status == 1) {
            return;
        }
    }

    // 处理消息
    // ...

    // 更新处理状态
    $sql = "INSERT INTO message_processing (message_id, status) VALUES ('$messageId', 1) ON DUPLICATE KEY UPDATE status = 1";
    $mysqli->query($sql);
}

function generateUniqueId($message) {
    // 生成消息的唯一标识
    // ...
    return $uniqueId;
}
ログイン後にコピー

上記のコードでは、まず generateUniqueId を通じてメッセージの一意の識別子を生成します。関数 。次に、message_processing テーブルをクエリして、メッセージの処理ステータスを確認します。処理ステータスが処理済みの場合は、それ以上の処理は実行されません。処理ステータスが未処理の場合、メッセージは処理され、処理ステータスは処理済みに更新されます。

概要:

上記は、PHP および MySQL でメッセージの重複排除とメッセージの冪等性を処理するための一般的な方法の一部です。実際の開発では、特定のニーズとシステム アーキテクチャに基づいて適切な方法を選択できます。 Redis ベースの重複排除処理であっても、MySQL ベースの冪等処理であっても、キュー内のメッセージをより適切に処理し、システムの信頼性とパフォーマンスを向上させるのに役立ちます。

以上がPHP および MySQL におけるキュー メッセージの重複排除とメッセージべき等性の処理方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート