PHP および MySQL でメッセージの重複排除とキューの冪等性に対処する方法
実際の開発では、システムのパフォーマンスを向上させるために、非同期タスクを処理するためにメッセージ キューを使用することがよくあります。そして信頼性。ただし、キューを使用すると、メッセージの重複排除と冪等処理に関する問題が発生することがよくあります。この記事では、PHP および MySQL でメッセージの重複排除とメッセージの冪等性を処理するための一般的な方法をいくつか紹介し、具体的なコード例を示します。
メッセージ重複排除とは、同じメッセージがメッセージ キューにすでに存在する場合、繰り返し処理されないことを意味します。メッセージの重複排除を処理するにはいくつかの方法があります。 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 つだけであることを意味します。メッセージの冪等性を処理するにはいくつかの方法があります。以下は、データベースベースの冪等処理方法です:
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 サイトの他の関連記事を参照してください。