現在の位置: ホーム> 最新記事一覧> PHPマイクロサービスの並行性コントロールと現在の制限実装ガイド(コードの例を使用)

PHPマイクロサービスの並行性コントロールと現在の制限実装ガイド(コードの例を使用)

M66 2025-07-02

導入

インターネットテクノロジーの急速な進化に伴い、マイクロサービスアーキテクチャは、非常に利用可能で高度にスケーラブルなシステムを構築する重要な方法になりました。高い並行性環境では、サービスの安定性を確保するために、同時性制御と現在の制限メカニズムを合理的に実装することが特に重要です。この記事では、実際のニーズに基づいてPHPマイクロサービスにこれら2つの機能を実装する一般的な方法を紹介し、実装できるコード例を装備します。

同時制御の必要性

従来のモノリシックアプリケーションでは、同時リクエストの管理は比較的簡単です。マイクロサービスアーキテクチャの下で、複数の独立したサービスが互いに通信します。同時にサージを要求すると、システムリソースを使い果たしたり、応答を遅くしたりする可能性が非常に高くなります。この目的のために、サーバーには優れた並行性制御戦略が必要です。

PHPが同時制御を実装する方法

セマフォを使用します

Semaphoreは、同時に実行できるタスクの数を制限するのに適した典型的な並行性制御方法です。 PHPでは、対応する拡張機能を使用してセマフォメカニズムを実装できます。

拡張機能をインストールします:

 $ pecl install sem

サンプルコード:

 // セマフォを初期化します,パラメーターは、同時性の上限を示します
$sem = new Semaphore(10);

// セマフォのリソースを取得します
$sem->acquire();

// ビジネスロジック処理コードはここに記載されています

// 無料のリソース
$sem->release();

リソースの数の上限を設定することにより、同時アクセスの数を効果的に制限し、バックエンドサービスを保護できます。

キューを使用します(例としてRedisを取得)

キューメカニズムは、リクエストを処理するためにリクエストをキューにすることができ、短期間でサービスに同時に影響を与えるための多数のリクエストを回避できます。 Redisは、同時キューの構築に使用できるリストデータ構造を提供します。

インストール依存関係:

 $ pecl install redis
$ composer require predis/predis

サンプルコード:

 // 接続する Redis
$redis = new PredisClient();

// キュー操作に参加してください
$redis->rpush('request_queue', time());

// 出発
$request = $redis->lpop('request_queue');

// ビジネスロジック処理コード

// 処理されたリクエストを削除します(オプション)
$redis->lrem('request_queue', 0, $request);

キューでリクエストを処理することにより、システムは整然とした方法でタスクを実行して瞬間的な圧力を下げることができます。

現在の制限の中心的な重要性

現在の制限は、時間単位内で通過することが許可されているリクエストの数を制限するために使用されるアクティブな制御戦略であり、交通が破裂したときにサービスが押しつぶされるのを防ぐためによく使用されます。

トークンバケットアルゴリズムを使用して、電流制限を達成します

トークンバケットアルゴリズムは、最も広く使用されている現在の制限アルゴリズムの1つです。固定数のトークンは1秒あたり生成され、リクエストはトークンが取得されたときにのみ処理できます。

サンプルの実装(Redisに基づく):

 $redis = new PredisClient();
$rate = 10; // 毎秒生成します 10 トークン
$capacity = 20; // トークンバケット容量
$time = microtime(true);
$tokens = $redis->get('tokens');

if ($tokens === null) {
    $tokens = $capacity;
    $redis->set('tokens', $tokens);
    $redis->set('last_time', $time);
} else {
    $interval = $time - $redis->get('last_time');
    $newTokens = $interval * $rate;
    $tokens = min($tokens + $newTokens, $capacity);
    $redis->set('tokens', $tokens);
    $redis->set('last_time', $time);
}

$allow = $redis->get('tokens') >= 1;

if ($allow) {
    $redis->decr('tokens');
    // ビジネスロジックを実行します
} else {
    // リクエスト処理を拒否します
}

この方法は、単位時間ごとに要求処理頻度を正確に制御でき、インターフェイスアクセス周波数が厳密に制御されるシナリオに適しています。

要約します

PHPマイクロサービスに効果的な並行性制御と電流制限メカニズムを展開することは、システムのパフォーマンスと可用性を改善するために重要です。この記事では、セマフォとRedisに基づいた並行性制御スキーム、およびトークンバケット電流制限アルゴリズムの実装方法を紹介します。これらの戦略を組み合わせたアプリケーションは、高い並行性シナリオでサービスの安定した動作能力を大幅に向上させることができます。