1

IP ごとに 10 秒で 30 リクエストという新しいリクエスト制限を持つ tmdb API を使用しています。過去 10 秒あたりのリクエスト数を保持するテーブルを MySQL に持つことで、これらの呼び出しを追跡できますが、異なる IP アドレスを使用してこれを達成するにはどうすればよいでしょうか?

私のアプリの仕組みは次のとおりです。

  1. デスクトップ アプリからアプリケーション サーバーに対して要求が行われます。次に、サーバー側の php が検索を行い、データを返します。

  2. 次に、デスクトップ アプリはアプリ サーバーに対して別の呼び出しを行い、次に tmdb (4-7) および他の API に対して複数の API 呼び出しを行います。

場合によっては、数件から数千件の検索要求が発生する可能性があります。API呼び出しを追跡して遅延させて制限を下回る最善の方法は何ですか?

4

3 に答える 3

2

サーバーがレート制限のある別のサーバーにリクエストを送信している場合、どのクライアントがサーバーにリクエストを行っているかに関係なく、サーバーからのリクエストを追跡するグローバルな方法が必要になります。

私はフラット ファイルを使用し、リクエストごとに UNIX 時間と区切り文字を節約します。ファイルにそれらが 10 個含まれている場合は、10 個のリクエストを実行したことになり、ファイルをクリーンアップして古いタイムスタンプを削除する必要があります。 10 秒よりも短く、それが最も単純な形式の PHP レート リミッタを提供します。

もちろん、これにはもっと高度な方法がありますが、私はそこから始めて、API アクセスなどを失わないように必ずテストしてください。

于 2012-11-05T17:52:00.743 に答える
1

php sleep関数を使用して、リクエストを行う速度を制限できます。または、実際にusleep関数のようなものを使用して、遅延が必要なマイクロ秒数を指定して停止します。

于 2012-11-05T17:34:32.730 に答える
0

トークン バケット アルゴリズムはレート制限を行うことができます。共有ストレージを使用してスレッドセーフな実装を作成しました: bandwidth-throttle/token-bucket

この例では、アプリケーションを 1 秒あたり 3 リクエストのグローバル消費率に調整します。

use bandwidthThrottle\tokenBucket\Rate;
use bandwidthThrottle\tokenBucket\TokenBucket;
use bandwidthThrottle\tokenBucket\BlockingConsumer;
use bandwidthThrottle\tokenBucket\storage\PDOStorage;

$storage  = new PDOStorate("tmdb", $pdo);
$rate     = new Rate(3, Rate::SECOND);
$bucket   = new TokenBucket(30, $rate, $storage);
$consumer = new BlockingConsumer($bucket);
$bucket->bootstrap(30);

$consumer->consume(1);
$api->foo();
于 2015-07-12T19:11:21.643 に答える