Middle+
Wie implementiert man das Waiter-Muster für die API?
sobes.tech KI
Antwort von AI
Das Waiter-Muster für APIs wird implementiert, indem periodisch Anfragen an den Dienst gesendet werden, bis eine bestimmte Bedingung erfüllt ist oder die Zeit abläuft.
Hauptkomponenten:
- Zielanfrage (Target Request): Die Anfrage, die ausgeführt wird und deren Ergebnis überprüft wird.
- Abschlussbedingung (Completion Condition): Logischer Ausdruck, der bestimmt, wann das Warten beendet werden soll. Dies kann ein bestimmter Antwortstatus (z.B. 200 OK), ein Wert im Antwortkörper, die Präsenz oder Abwesenheit einer Ressource usw. sein.
- Polling-Intervall (Polling Interval): Zeit zwischen aufeinanderfolgenden Zielanfragen.
- Timeout (Timeout): Maximale Zeit, in der der Waiter Anfragen ausführt, bevor er mit einem Fehler beendet wird.
Beispiel für eine Implementierung in Python unter Verwendung der Bibliothek requests:
import time
import requests
def wait_for_resource(url, expected_status=200, interval=5, timeout=60):
"""
Implementierung des Waiter-Musters für APIs.
Args:
url (str): URL der Ressource, auf die gewartet wird.
expected_status (int): Erwarteter HTTP-Statuscode.
interval (int): Warteintervall zwischen den Anfragen in Sekunden.
timeout (int): Maximale Wartezeit in Sekunden.
Raises:
TimeoutError: Wenn die Wartezeit vor Erreichen des erwarteten Zustands abläuft.
Exception: Wenn ein Fehler bei der Anfrage auftritt.
"""
start_time = time.time()
while time.time() - start_time < timeout:
try:
response = requests.get(url)
if response.status_code == expected_status:
print(f"Die Ressource bei {url} ist mit dem erwarteten Status {expected_status} verfügbar.")
return response
else:
print(f"Die Ressource bei {url} ist nicht verfügbar. Aktueller Status: {response.status_code}. Warte...")
except requests.exceptions.RequestException as e:
print(f"Fehler bei der Anfrage an {url}: {e}. Warte...")
time.sleep(interval)
raise TimeoutError(f"Wartezeit für die Ressource {url} ist abgelaufen.")
# Beispiel für die Verwendung
# try:
# wait_for_resource("http://example.com/some_resource", expected_status=200, interval=10, timeout=120)
# except (TimeoutError, Exception) as e:
# print(f"Fehler im Waiter: {e}")
Variationen der Implementierung:
- Warten basierend auf dem Antwortkörper: Überprüfung eines bestimmten Wertes oder einer Struktur im JSON/XML-Antwortkörper.
- Exponentieller Backoff: Erhöhung des Warteintervalls zwischen den Versuchen, um die Last auf den Dienst bei häufigen Timeouts zu verringern.
- Parametrisierter Waiter: Möglichkeit, Parameter in die Zielanfrage zu übergeben.
- Bedingter Waiter: Verwendung komplexerer Bedingungen, z.B. Kombination aus Status und Inhalt der Antwort.
Das Waiter-Muster ist nützlich, um auf das Ende asynchroner Operationen zu warten, die Verfügbarkeit des Dienstes nach einem Deployment oder das Auftreten von Daten, die von anderen Prozessen generiert wurden.