Gesehen
Programmierung
Google
Gemini 2.5 Pro
VS
OpenAI
GPT-5.2
Implementieren Sie einen nebenläufigen Ratenbegrenzer mit gleitendem Fenster und Prioritätswarteschlangen
Entwerfen und implementieren Sie einen Thread-sicheren Ratenbegrenzer in Python, der folgende Funktionen unterstützt:
1. **Gleitende Fenster-Ratenbegrenzung**: Anstatt feste Zeitfenster zu verwenden, implementieren Sie einen echten gleitenden Fenster-Algorithmus. Jeder Client (identifiziert durch einen String-Schlüssel) darf höchstens `max_requests` Anfragen innerhalb eines beliebigen rollenden Fensters von `window_seconds` Sekunden stellen.
2. **Prioritätsstufen**: Jede Anfrage hat eine Prioritätsstufe (Ganzzahl 1-5, wobei 1 die höchste Priorität ist). Wenn das Ratenlimit für einen Client erreicht ist, sollten Anfragen mit niedrigerer Priorität (größere Zahl) zuerst abgelehnt werden. Konkret: Wenn eine neue Anfrage mit Priorität P eintrifft und das Fenster voll ist, sollte der Limiter prüfen, ob irgendeine Anfrage im aktuellen Fenster eine streng niedrigere Priorität (größere Zahl) als P hat. Falls ja, wird der Platz der niedrigstpriorisierten (höchstnummerierten) Anfrage "widerrufen" und die neue, höher priorisierte Anfrage zugelassen. Die widerrufene Anfrage sollte protokolliert werden, damit sie gemeldet werden kann. Existiert keine niedrigere Priorität zum Widerruf, wird die neue Anfrage abgelehnt.
3. **Burst-Zulage**: Jeder Client kann optional eine Burst-Zulage `burst` haben (Standard 0). Diese erlaubt bis zu `burst` zusätzliche Anfragen über `max_requests` hinaus in einem Fenster, aber nur, wenn seit der ersten Anfrage des Clients im aktuellen Fenster mindestens die Hälfte der Fensterdauer vergangen ist.
4. **Thread-Sicherheit**: Der Ratenbegrenzer muss sicher aus mehreren Threads gleichzeitig verwendbar sein. Demonstrieren Sie dies mit einem Testszenario.
5. **Statistiken**: Der Limiter muss pro Client Statistiken führen: insgesamt zugelassene Anfragen, insgesamt abgelehnte Anfragen, insgesamt widerrufene Anfragen (durch Anfragen mit höherer Priorität verdrängt) und die aktuelle Fensterauslastung (als Float 0.0 bis 1.0).
Implementieren Sie die folgende Schnittstelle:
```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:
"""Überschreibe die Burst-Zulage für einen bestimmten Client."""
...
def allow(self, client_id: str, priority: int = 3, timestamp: float = None) -> bool:
"""
Prüft, ob eine Anfrage zugelassen wird. Falls timestamp None ist, verwende die aktuelle Zeit.
Gibt True zurück, wenn die Anfrage zugelassen wird, False wenn sie abgelehnt wird.
"""
...
def get_stats(self, client_id: str) -> dict:
"""
Gibt ein dict mit den Schlüsseln zurück: 'admitted', 'rejected', 'revoked', 'utilization'
"""
...
def get_revoked_log(self, client_id: str) -> list:
"""
Gibt eine Liste von (timestamp, priority)-Tupeln für widerrufene Anfragen
für den gegebenen Client in chronologischer Reihenfolge zurück.
"""
...
```
Liefern Sie eine vollständige, ausführbare Implementierung zusammen mit einem Demonstrationsskript, das:
- Einen Limiter mit max_requests=5, window_seconds=10.0, default_burst=2 erstellt
- Eine Sequenz von Anfragen von zwei Clients mit variierenden Prioritäten und Zeitstempeln simuliert, die alle Funktionen abdeckt (Ablauf im gleitenden Fenster, Prioritäts-Widerruf, Burst-Aktivierung und Ablehnung)
- Am Ende die Statistiken und die Widerrufsprotokolle für jeden Client ausgibt
- Einen kurzen Multithread-Test enthält mit mindestens 4 Threads, die gleichzeitig Anfragen stellen
Stellen Sie sicher, dass Randfälle behandelt werden wie:
- Validierung der Prioritätswerte (muss 1-5 sein)
- Anfragen, die genau an den Fenstergrenzen ankommen
- Mehrfache Widerrufe in Folge
- Burst-Zulage, die präzise beim Halbfenstermark aktiviert
- Leere oder unbekannte Client-IDs in Statistikabfragen