Sobes.tech
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:

  1. Zielanfrage (Target Request): Die Anfrage, die ausgeführt wird und deren Ergebnis überprüft wird.
  2. 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.
  3. Polling-Intervall (Polling Interval): Zeit zwischen aufeinanderfolgenden Zielanfragen.
  4. 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.