Gesehen
Programmierung
Google
Gemini 2.5 Flash-Lite
VS
OpenAI
GPT-5 mini
Einen nebenläufigen Rate Limiter mit gleitendem Fenster und Prioritätswarteschlangen implementieren
Designen und implementieren Sie einen thread-sicheren Rate Limiter in Python, der die folgenden Funktionen unterstützt:
1. **Sliding Window Rate Limiting**: Der Limiter sollte einen Sliding-Window-Algorithmus (keine festen Fenster) verwenden, um Anfragezahlen zu verfolgen. Bei einem Maximum von `max_requests`, das innerhalb eines Zeitraums von `window_seconds` erlaubt ist, muss er zu jedem beliebigen Zeitpunkt korrekt bestimmen können, ob eine neue Anfrage erlaubt ist.
2. **Multiple Tiers**: Der Rate Limiter muss mehrere benannte Tiers unterstützen (z. B. `"free"`, `"standard"`, `"premium"`), jeweils mit eigener Konfiguration für `max_requests` und `window_seconds`. Clients werden bei der Registrierung einem Tier zugewiesen.
3. **Priority Queue for Deferred Requests**: Wenn eine Anfrage gedrosselt wird, sollte der Limiter sie nicht einfach ablehnen, sondern in eine pro-Tier-Prioritätswarteschlange einreihen. Jede Anfrage hat eine Ganzzahl-Priorität (kleinere Zahl = höhere Priorität). Der Limiter sollte eine Methode bereitstellen, die, wenn Kapazität frei wird, die wartende Anfrage mit der höchsten Priorität für einen gegebenen Client aus der Warteschlange entnimmt und verarbeitet.
4. **Thread Safety**: Alle Operationen (`allow_request`, `enqueue`, `dequeue`, `register_client`) müssen sicher sein, von mehreren Threads gleichzeitig aufgerufen zu werden.
5. **Cleanup**: Stellen Sie eine Methode bereit, um abgelaufene Tracking-Daten für Clients zu entfernen, die in den letzten `cleanup_threshold_seconds` (konfigurierbar) keine Anfragen gestellt haben.
Ihre Implementierung sollte Folgendes enthalten:
- Eine `RateLimiter`-Klasse mit der beschriebenen Schnittstelle.
- Eine `Request`-Dataclass oder ein named tuple, das mindestens enthält: `client_id`, `timestamp`, `priority` und `payload`.
- Korrekte Behandlung von Randfällen: doppelte Client-Registrierung, Anfragen für nicht registrierte Clients, leere Prioritätswarteschlangen, gleichzeitige Änderungen und Probleme mit der Genauigkeit der Uhr.
Schreiben Sie außerdem ein Demonstrationsskript (im Block `if __name__ == "__main__"`), das:
- Einen Rate Limiter mit mindestens zwei Tiers erstellt.
- Mehrere Clients registriert.
- Einen Burst von Anfragen aus mehreren Threads simuliert, wobei einige zugelassen und andere in die Warteschlange gestellt werden.
- Zeigt, wie aufgeschobene Anfragen verarbeitet werden, wenn Kapazität frei wird.
- Eine klare Ausgabe druckt, die die Abfolge der Ereignisse deutlich darstellt.
Erläutern Sie Ihre Designentscheidungen in Kommentaren, insbesondere bezüglich Ihrer Implementierung des Sliding Window, Ihrer Wahl der Synchronisationsprimitiven und etwaiger Abwägungen, die Sie zwischen Genauigkeit und Leistung getroffen haben.