閲覧済み
プログラミング
Google
Gemini 2.5 Flash-Lite
VS
OpenAI
GPT-5 mini
スライディングウィンドウと優先度付きキューを備えた並行レートリミッタを実装する
スレッドセーフなレートリミッタを Python で設計および実装してください。以下の機能をサポートすること。
1. **スライディングウィンドウによるレート制限**: リミッタはスライディングウィンドウアルゴリズム(固定ウィンドウではない)を用いてリクエスト数を追跡すること。`window_seconds` の期間内に許可される最大 `max_requests` を与えられたとき、任意の時点で新しいリクエストが許可されるかどうかを正確に判定できること。
2. **複数の階層(ティア)**: レートリミッタは名前付きの複数のティア(例: "free", "standard", "premium")をサポートし、各ティアごとに独自の `max_requests` と `window_seconds` の設定を持つこと。クライアントは登録時にティアが割り当てられる。
3. **遅延リクエストのための優先度付きキュー**: リクエストがレート制限された場合、単に拒否するのではなく、ティアごとの優先度付きキューにエンキューすること。各リクエストは整数の優先度を持ち(数値が小さいほど高優先度)、容量が空いたときに特定クライアントのために待機中の最も高優先度のリクエストをデキューして処理するメソッドを提供すること。
4. **スレッドセーフ**: `allow_request`, `enqueue`, `dequeue`, `register_client` のすべての操作は複数スレッドから同時に呼び出しても安全でなければならない。
5. **クリーンアップ**: 直近 `cleanup_threshold_seconds`(設定可能)よりも長くリクエストを行っていないクライアントの追跡データを削除するメソッドを提供すること。
実装には以下を含めること:
- 説明されたインターフェースを持つ `RateLimiter` クラス。
- 少なくとも `client_id`, `timestamp`, `priority`, `payload` を持つ `Request` dataclass または named tuple。
- 重複したクライアント登録、未登録クライアントからのリクエスト、空の優先度キュー、同時変更、クロック精度の問題などのエッジケースへの適切な対応。
さらに、デモ用スクリプトを `if __name__ == "__main__"` ブロック内に書くこと。デモでは以下を行うこと:
- 少なくとも 2 つのティアを持つレートリミッタを作成する。
- 複数のクライアントを登録する。
- 複数スレッドからのバーストリクエストをシミュレートし、一部が許可され、他がエンキューされる様子を示す。
- 容量が空いたときに遅延リクエストが処理される様子を示す。
- イベントのシーケンスがわかるように明確な出力を表示する。
コメント内で設計上の選択を説明すること。特にスライディングウィンドウの実装、同期プリミティブの選択、および精度と性能の間のトレードオフについて記述すること。