ホームページ >バックエンド開発 >PHPチュートリアル >PHP および MySQL におけるキュー メッセージの重複排除とメッセージ冪等性のアプリケーション シナリオ

PHP および MySQL におけるキュー メッセージの重複排除とメッセージ冪等性のアプリケーション シナリオ

WBOY
WBOYオリジナル
2023-10-15 12:06:121464ブラウズ

PHP および MySQL におけるキュー メッセージの重複排除とメッセージ冪等性のアプリケーション シナリオ

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。