Middle+
Jak zaimplementować wzorzec Waiter dla API?
sobes.tech AI
Odpowiedź od AI
Wzorzec Waiter dla API realizuje się poprzez okresowe wysyłanie zapytań do serwisu aż do spełnienia określonego warunku lub wygaśnięcia limitu czasu.
Główne komponenty:
- Zadanie docelowe (Target Request): Zapytanie, które jest wykonywane i którego wynik jest sprawdzany.
- Warunek zakończenia (Completion Condition): Wyrażenie logiczne określające, kiedy oczekiwanie powinno się zakończyć. Może to być określony status odpowiedzi (np. 200 OK), wartość w ciele odpowiedzi, obecność lub brak zasobu itp.
- Interwał odpytywania (Polling Interval): Czas pomiędzy kolejnymi zapytaniami.
- Limit czasu (Timeout): Maksymalny czas, w którym Waiter będzie wykonywał zapytania przed zakończeniem z błędem.
Przykład implementacji w Pythonie z użyciem biblioteki requests:
import time
import requests
def wait_for_resource(url, expected_status=200, interval=5, timeout=60):
"""
Implementacja wzorca Waiter dla API.
Args:
url (str): URL zasobu do oczekiwania.
expected_status (int): Oczekiwany status HTTP.
interval (int): Interwał oczekiwania między zapytaniami w sekundach.
timeout (int): Maksymalny czas oczekiwania w sekundach.
Raises:
TimeoutError: Jeśli limit czasu zostanie przekroczony przed osiągnięciem oczekiwanego stanu.
Exception: Jeśli wystąpi błąd podczas wykonywania zapytania.
"""
start_time = time.time()
while time.time() - start_time < timeout:
try:
response = requests.get(url)
if response.status_code == expected_status:
print(f"Zasób pod adresem {url} jest dostępny z oczekiwanym statusem {expected_status}.")
return response
else:
print(f"Zasób pod adresem {url} jest niedostępny. Aktualny status: {response.status_code}. Oczekiwanie...")
except requests.exceptions.RequestException as e:
print(f"Błąd podczas zapytania do {url}: {e}. Oczekiwanie...")
time.sleep(interval)
raise TimeoutError(f"Przekroczono limit czasu oczekiwania dla zasobu {url}.")
# Przykład użycia
# try:
# wait_for_resource("http://example.com/some_resource", expected_status=200, interval=10, timeout=120)
# except (TimeoutError, Exception) as e:
# print(f"Błąd w Waiterze: {e}")
Warianty implementacji:
- Oczekiwanie na podstawie treści odpowiedzi: Sprawdzanie określonej wartości lub struktury w ciele odpowiedzi JSON/XML.
- Eksponencjalne wycofywanie (Backoff): Zwiększanie interwału oczekiwania między próbami w celu zmniejszenia obciążenia serwisu przy częstych limitach czasu.
- Parametryzowany Waiter: Możliwość przekazywania parametrów do zapytania docelowego.
- Warunkowe oczekiwanie: Użycie bardziej złożonych warunków, np. kombinacji statusu i zawartości odpowiedzi.
Wzorzec Waiter jest przydatny do oczekiwania na zakończenie operacji asynchronicznych, dostępność serwisu po wdrożeniu lub pojawienie się danych wygenerowanych przez inne procesy.