Middle+
Jak implementovat vzor Waiter pro API?
sobes.tech AI
Odpověď od AI
Vzor Waiter pro API se realizuje opakovaným odesíláním požadavků na službu, dokud není splněna určitá podmínka nebo nevyprší časový limit.
Hlavní komponenty:
- Cílový požadavek (Target Request): Požadavek, který se provádí a jehož výsledek se kontroluje.
- Podmínka ukončení (Completion Condition): Logický výraz určující, kdy má být čekání ukončeno. Může to být určitý stav odpovědi (například 200 OK), hodnota v těle odpovědi, přítomnost nebo nepřítomnost zdroje atd.
- Interval čekání (Polling Interval): Čas mezi po sobě jdoucími cílovými požadavky.
- Časový limit (Timeout): Maximální doba, po kterou bude Waiter odesílat požadavky, než skončí s chybou.
Příklad implementace v Pythonu s knihovnou requests:
import time
import requests
def wait_for_resource(url, expected_status=200, interval=5, timeout=60):
"""
Implementace vzoru Waiter pro API.
Args:
url (str): URL zdroje k čekání.
expected_status (int): Očekávaný HTTP stav odpovědi.
interval (int): Interval čekání mezi požadavky v sekundách.
timeout (int): Maximální doba čekání v sekundách.
Raises:
TimeoutError: Pokud časový limit vyprší před dosažením očekávaného stavu.
Exception: Pokud dojde k chybě při provádění požadavku.
"""
start_time = time.time()
while time.time() - start_time < timeout:
try:
response = requests.get(url)
if response.status_code == expected_status:
print(f"Zdroj na adrese {url} je dostupný s očekávaným stavem {expected_status}.")
return response
else:
print(f"Zdroj na adrese {url} není dostupný. Aktuální stav: {response.status_code}. Čekám...")
except requests.exceptions.RequestException as e:
print(f"Chyba při požadavku na {url}: {e}. Čekám...")
time.sleep(interval)
raise TimeoutError(f"Časový limit čekání na zdroj {url} vypršel.")
# Příklad použití
# try:
# wait_for_resource("http://example.com/some_resource", expected_status=200, interval=10, timeout=120)
# except (TimeoutError, Exception) as e:
# print(f"Chyba v Waiterovi: {e}")
Variace realizace:
- Čekání na základě těla odpovědi: Kontrola určité hodnoty nebo struktury v těle odpovědi JSON/XML.
- Exponenciální zpětné zvyšování intervalu: Zvyšování intervalu mezi pokusy ke snížení zátěže na službu při častých timeoutech.
- Parametrizovaný Waiter: Možnost předávat parametry do cílového požadavku.
- Podmíněný Waiter: Použití složitějších podmínek, například kombinace stavu a obsahu odpovědi.
Vzorek Waiter je užitečný pro čekání na dokončení asynchronních operací, připravenost služby po nasazení nebo na zobrazení dat generovaných jinými procesy.