PHP および MySQL におけるキュー メッセージの重複排除とメッセージ冪等性のアプリケーション シナリオ
はじめに:
インターネット テクノロジの継続的な発展により、キューは次の 1 つになりました。さまざまな分散システムにおける重要な基本コンポーネント。キューのアプリケーション プロセスでは、特に同時実行性が高いシナリオでは、メッセージの重複排除とメッセージの冪等性が 2 つの一般的な問題になります。この記事では、PHP および MySQL におけるキュー メッセージの重複排除とメッセージ冪等性のアプリケーション シナリオを詳細に紹介し、具体的なコード例を示します。
1. キューでのメッセージ重複排除の概要
メッセージ重複排除とは、キュー システムでは、同じメッセージを 1 回だけ処理して、処理の繰り返しを避けることを意味します。キューイング システムでは、ネットワークの異常や再試行メカニズムなどの要因により、メッセージが繰り返し送信されることが避けられないことが多く、メッセージの重複が発生する可能性があります。したがって、コンシューマ側でメッセージの重複排除処理を実行する必要があります。
1.1 重複排除方法
一般的なメッセージ重複排除方法には、Redis ベースの重複排除とデータベース ベースの重複排除の 2 つがあります。 Redis ベースの重複排除は、コレクション データ構造を通じて実装されます。メッセージが消費されるたびに、Redis は最初にメッセージが処理されたかどうかをクエリします。処理された場合はスキップします。それ以外の場合は、対応するビジネス ロジックが実行され、メッセージは処理されます。 Redis コレクションに追加されました。データベースベースの重複排除は、データベース内に一意のインデックスを確立することによって実現されます。メッセージが消費されるたびに、最初にデータベースがクエリされて、メッセージのレコードがすでに存在するかどうかが確認されます。存在する場合は、スキップされます。それ以外の場合は、対応するレコードが存在するかどうかが確認されます。ビジネス ロジックが実行され、メッセージ レコードがデータベースに挿入されます。
1.2 PHP コード例
メッセージ重複排除のストレージ メディアとして Redis を使用すると仮定します。以下はサンプル コードです:
<?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. キュー メッセージ冪等性の概要
メッセージの冪等性とは、同じメッセージが複数回処理され、最終的な処理結果が一貫したままであることを意味します。分散システムではメッセージの冪等性が非常に重要です。同時実行性が高い状況では、同じメッセージが複数のコンシューマによって同時に処理される可能性があるためです。冪等性が保証されていない場合、データの不整合が発生します。
2.1 冪等性の実装方法
冪等性を実装するには、シリアル番号冪等テーブル、冪等カスタム アノテーション、および一意制約の 3 つの一般的な方法があります。このうち、シーケンス番号冪等テーブルは、データベース内に冪等テーブルを作成することによって作成されます。メッセージを処理する前に、まず冪等テーブルにクエリを実行して、メッセージが処理されたかどうかを確認します。処理済みの場合はスキップし、そうでない場合は実行します。対応するビジネス ロジックを作成し、メッセージ レコードを冪等テーブルに挿入します。冪等のカスタム アノテーションは、カスタム アノテーションを通じて冪等の操作を識別します。メソッドが実行される前に、まずメソッドが実行されたかどうかが判断されます。実行されている場合はスキップされます。実行されていない場合は、対応するビジネス ロジックが実行されます。一意制約は、データベース内に一意のインデックスを確立することで実現され、メッセージ処理中に重複レコードが生成されると、データベースは自動的に重複レコードを除外します。
2.2 MySQL コード例
次に、MySQL を使用してメッセージ冪等性を実現するコード例を示します:
<?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);
結論:
キュー アプリケーションでは、メッセージ重複排除とメッセージ冪等性は 2 つあります。非常に重要な問題。この記事で紹介する Redis と MySQL に基づく具体的なコード例を通じて、繰り返しのメッセージ処理とデータの一貫性の問題を効果的に解決し、システムの信頼性と安定性を向上させることができます。実際のアプリケーションでは、特定のビジネス シナリオに基づいて適切な重複排除およびべき等ソリューションを選択し、必要に応じて対応するチューニングと最適化を実行する必要があります。
以上がPHP および MySQL におけるキュー メッセージの重複排除とメッセージ冪等性のアプリケーション シナリオの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。