Middle+
Hoe implementeer je het Waiter-patroon voor de API?
sobes.tech AI
Antwoord van AI
Het Waiter-patroon voor API wordt geïmplementeerd door periodiek verzoeken naar de service te sturen totdat aan een bepaalde voorwaarde is voldaan of de timeout is bereikt.
Belangrijkste componenten:
- Doelverzoek (Target Request): Het verzoek dat wordt uitgevoerd en waarvan het resultaat wordt gecontroleerd.
- Voltooiingsvoorwaarde (Completion Condition): Logische uitdrukking die bepaalt wanneer het wachten moet eindigen. Dit kan een specifieke antwoordstatus (bijvoorbeeld 200 OK), een waarde in de antwoordtekst, de aanwezigheid of afwezigheid van een resource, enzovoort zijn.
- Polling-interval (Polling Interval): Tijd tussen opeenvolgende verzoeken.
- Timeout: Maximale tijd waarin de Waiter verzoeken zal uitvoeren voordat hij stopt met een fout.
Voorbeeld van implementatie in Python met behulp van de requests-bibliotheek:
import time
import requests
def wait_for_resource(url, expected_status=200, interval=5, timeout=60):
"""
Implementatie van het Waiter-patroon voor API.
Args:
url (str): URL van de resource om op te wachten.
expected_status (int): Verwachte HTTP-status.
interval (int): Interval tussen verzoeken in seconden.
timeout (int): Maximale wachttijd in seconden.
Raises:
TimeoutError: Als de timeout wordt overschreden voordat de verwachte toestand is bereikt.
Exception: Als er een fout optreedt tijdens het verzoek.
"""
start_time = time.time()
while time.time() - start_time < timeout:
try:
response = requests.get(url)
if response.status_code == expected_status:
print(f"De resource op {url} is beschikbaar met de verwachte status {expected_status}.")
return response
else:
print(f"De resource op {url} is niet beschikbaar. Huidige status: {response.status_code}. Wachten...")
except requests.exceptions.RequestException as e:
print(f"Fout bij verzoek naar {url}: {e}. Wachten...")
time.sleep(interval)
raise TimeoutError(f"Timeout voor resource {url} is bereikt.")
# Voorbeeld van gebruik
# try:
# wait_for_resource("http://example.com/some_resource", expected_status=200, interval=10, timeout=120)
# except (TimeoutError, Exception) as e:
# print(f"Fout in Waiter: {e}")
Variaties in implementatie:
- Wachten op basis van de antwoordtekst: Controleren van een specifieke waarde of structuur in de JSON/XML-antwoordtekst.
- Exponentiële backoff: Verhogen van het interval tussen pogingen om de belasting op de service te verminderen bij frequente timeouts.
- Parametriseerde Waiter: Mogelijkheid om parameters door te geven aan het doelverzoek.
- Voorwaardelijke Waiter: Gebruik van complexere voorwaarden, bijvoorbeeld combinatie van status en inhoud van het antwoord.
Het Waiter-patroon is nuttig om te wachten op het einde van asynchrone operaties, de beschikbaarheid van de service na een deployment of het verschijnen van gegevens die door andere processen zijn gegenereerd.