Die Leistung Ihrer FastAPI-Anwendung unter Last testen
In der heutigen schnelllebigen digitalen Welt ist die Gewährleistung der Leistung und Zuverlässigkeit von Webanwendungen unter hoher Last von größter Bedeutung. Dieser Artikel befasst sich mit dem Prozess des Stresstestens einer FastAPI-Anwendung, die ein Machine-Learning-Modell für die Vorhersage von Hauspreisen in Kalifornien nutzt. Durch die Simulation einer großen Anzahl von Benutzern können Entwickler Engpässe identifizieren und die Kapazität ihres Systems sicherstellen.
Einrichtung und Abhängigkeiten
Das Projekt erfordert die Einrichtung einer spezifischen Umgebung mit wichtigen Python-Paketen. Dazu gehören FastAPI für die Webentwicklung, Uvicorn als ASGI-Server, Locust für Lasttests, Scikit-learn für das Machine-Learning-Modell sowie NumPy, Pandas und Pydantic für Datenverarbeitung und -validierung. Die Installation erfolgt über eine requirements.txt-Datei, nachdem eine virtuelle Umgebung erstellt und aktiviert wurde.
Aufbau der FastAPI-Anwendung
Die Anwendung besteht aus mehreren Kernkomponenten:
ml_model.py: Diese Datei verwaltet das Machine-Learning-Modell. Sie verwendet ein Singleton-Muster, um sicherzustellen, dass nur eine Instanz des Modells geladen wird. Das Modell, ein Random Forest Regressor, wird auf dem kalifornischen Hausdatensatz trainiert. Wenn keine vortrainierten Modelle vorhanden sind, werden diese erstellt und gespeichert.pydantic_models.py: Hier werden Pydantic-Modelle für die Validierung und Serialisierung von Anforderungs- und Antwortdaten definiert, insbesondere für die Vorhersageanfragen.main.py: Dies ist die Hauptdatei der FastAPI-Anwendung. Sie definiert die API-Endpunkte wie/healthfür den Gesundheitscheck,/model-infofür Modellmetadaten und/predictfür Hauspreisvorhersagen. Einlifespan-Manager stellt sicher, dass das ML-Modell beim Start der Anwendung vorgeladen wird. Die Verwendung vonasyncio.to_threadist entscheidend, um die CPU-intensivepredict-Methode von Scikit-learn auszuführen, ohne die asynchrone Ereignisschleife von FastAPI zu blockieren.run_server.py: Dieses Skript startet die FastAPI-Anwendung mit Uvicorn und ermöglicht die Konfiguration von Host, Port und Worker-Anzahl.
Schreiben des Locust-Stresstests
Der Stresstest wird mit Locust durchgeführt, einem Open-Source-Tool für Lasttests. Die Datei tests/locustfile.py definiert das Verhalten der simulierten Benutzer. Jeder Benutzer generiert realistische zufällige Merkmalsdaten für Vorhersageanfragen und interagiert mit den Endpunkten /model-info und /predict. Die Aufgaben sind so gewichtet, dass der /predict-Endpunkt häufiger aufgerufen wird.
Ausführen des Stresstests
Um die Leistung zu bewerten, wird zuerst die FastAPI-Anwendung mit python run_server.py gestartet. Anschließend wird Locust im Terminal mit locust -f tests/locustfile.py --host http://localhost:8000 ausgeführt. Über die Locust-Weboberfläche unter http://localhost:8089 können dann die Anzahl der Benutzer, die Spawn-Rate und die Testdauer konfiguriert werden. Alternativ kann Locust im Headless-Modus mit --headless und der Option zur Generierung eines HTML-Berichts (--html report.html) ausgeführt werden, um die Ergebnisse nach Abschluss des Tests zu analysieren.
Fazit
Die durchgeführten Tests zeigen, dass die Anwendung eine beträchtliche Anzahl von Benutzern bewältigen kann, insbesondere aufgrund des effizienten Machine-Learning-Modells und der korrekten Implementierung von asynchronen Operationen. Die Antwortzeiten für den /model-info-Endpunkt sind zwar höher als für den /predict-Endpunkt, aber insgesamt ist die Leistung beeindruckend. Dies stellt ein optimales Szenario für lokale Tests dar, bevor die Anwendung in die Produktion überführt wird. Das Projekt und die vollständigen Anweisungen sind auf GitHub verfügbar.