閲覧済み
プログラミング
Google
Gemini 2.5 Pro
VS
OpenAI
GPT-5.2
スライディングウィンドウと優先度付きキューを備えた同時実行レートリミッタを実装する
Pythonで、次の機能をサポートするスレッドセーフなレートリミッタを設計・実装してください。
1. **スライディングウィンドウによるレート制限**: 固定時間ウィンドウを使うのではなく、真のスライディングウィンドウアルゴリズムを実装してください。各クライアント(文字列キーで識別)は、任意の連続する window_seconds 秒の間に最大で max_requests 件のリクエストを許容されます。
2. **優先度レベル**: 各リクエストには優先度レベル(整数 1-5、1 が最も高い優先度)が付与されます。クライアントのレート上限に達した場合、低優先度(数値が大きい)なリクエストが優先的に拒否されるべきです。具体的には、優先度 P の新しいリクエストが到着しウィンドウが満杯である場合、リミッタは現在のウィンドウ内に P より厳密に低い優先度(すなわち数値が P より大きい)を持つリクエストが存在するかを確認します。存在する場合は、最も低優先度(数値が最大)のリクエストのスロットを「取り上げ(revoked)」て、新しい高優先度リクエストを受け入れます。取り上げられたリクエストは報告できるよう記録されるべきです。取り上げ可能な低優先度のリクエストが存在しない場合は、新しいリクエストは拒否されます。
3. **バースト許容**: 各クライアントはオプションで burst(デフォルトは 0)というバースト許容量を持てます。これはウィンドウ内で max_requests に加えて最大 burst 件まで追加のリクエストを許容します。ただし、これはクライアントの現在のウィンドウにおける最初のリクエストから半分以上のウィンドウ時間が経過している場合に限ります。
4. **スレッドセーフ**: レートリミッタは複数のスレッドから同時に使用しても安全でなければなりません。これをテストシナリオで実証してください。
5. **統計**: リミッタはクライアントごとの統計を追跡する必要があります: 許可された(admitted)合計リクエスト数、拒否された(rejected)合計、取り上げられた(revoked、より高優先度のリクエストにより追い出された)合計、現在のウィンドウ利用率(0.0〜1.0 の浮動小数点)を追跡してください。
次のインターフェースを実装してください:
```python
class RateLimiter:
def __init__(self, max_requests: int, window_seconds: float, default_burst: int = 0):
...
def set_client_burst(self, client_id: str, burst: int) -> None:
"""Override burst allowance for a specific client."""
...
def allow(self, client_id: str, priority: int = 3, timestamp: float = None) -> bool:
"""
Check if a request is allowed. If timestamp is None, use current time.
Returns True if the request is admitted, False if rejected.
"""
...
def get_stats(self, client_id: str) -> dict:
"""
Return a dict with keys: 'admitted', 'rejected', 'revoked', 'utilization'
"""
...
def get_revoked_log(self, client_id: str) -> list:
"""
Return a list of (timestamp, priority) tuples for revoked requests
for the given client, in chronological order.
"""
...
```
完全かつ実行可能な実装を提供し、次を含むデモスクリプトを添付してください:
- max_requests=5, window_seconds=10.0, default_burst=2 でリミッタを作成
- 2 人のクライアントからの優先度とタイムスタンプが異なる一連のリクエストをシミュレートし、すべての機能(スライディングウィンドウの期限切れ、優先度による取り上げ、バーストの発動、拒否)を網羅する
- 最後に各クライアントの統計と取り上げログを表示
- 少なくとも 4 スレッドを使った簡潔なマルチスレッドテストを含め、同時実行を確認する
次のようなエッジケースにも対応してください:
- 優先度値検証(1-5 の範囲でなければならない)
- ウィンドウ境界でちょうど到着するリクエスト
- 連続した複数の取り上げが発生する場合
- バースト許容がちょうどウィンドウ半分の時点で発動する場合
- 空または未知のクライアント ID に対する統計問い合わせ