Middle+
Kaip įgyvendinti Waiter modelį API?
sobes.tech AI
Atsakymas iš AI
Waiter šablonas API atveju įgyvendinamas periodiškai siunčiant užklausas į paslaugą, kol bus įvykdyta tam tikra sąlyga arba nepasibaigs laiko limitas.
Pagrindiniai komponentai:
- Tiksli užklausa (Target Request): Užklausa, kuri vykdoma ir kurios rezultatas tikrinamas.
- Užbaigimo sąlyga (Completion Condition): Loginė išraiška, kuri nustato, kada turi būti nutrauktas laukimas. Tai gali būti tam tikras atsakymo statusas (pvz., 200 OK), reikšmė atsakymo kūne, ištekliaus buvimas ar nebuvimas ir kt.
- Paklausos intervalas (Polling Interval): Laikas tarp nuoseklių tikslių užklausų.
- Laiko limitas (Timeout): Maksimalus laikas, kurį Waiter siųs užklausas prieš baigdamas su klaida.
Python pavyzdys naudojant requests biblioteką:
import time
import requests
def wait_for_resource(url, expected_status=200, interval=5, timeout=60):
"""
Waiter šablono įgyvendinimas API.
Args:
url (str): Laukiamas ištekliaus URL.
expected_status (int): Laukiamas HTTP atsakymo statusas.
interval (int): Laukimo intervalas sekundėmis.
timeout (int): Maksimalus laukimo laikas sekundėmis.
Raises:
TimeoutError: Jei laiko limitas pasibaigia iki norimo būsenos pasiekimo.
Exception: Jei įvyksta klaida vykdant užklausą.
"""
start_time = time.time()
while time.time() - start_time < timeout:
try:
response = requests.get(url)
if response.status_code == expected_status:
print(f"Išteklis adresu {url} pasiekiamas su laukiamu statusu {expected_status}.")
return response
else:
print(f"Išteklis adresu {url} nėra pasiekiamas. Dabartinis statusas: {response.status_code}. Laukiama...")
except requests.exceptions.RequestException as e:
print(f"Klaida {url} užklausoje: {e}. Laukiama...")
time.sleep(interval)
raise TimeoutError(f"Laukimo laikas {url} pasibaigė.")
# Pavyzdys naudojimo:
# try:
# wait_for_resource("http://example.com/some_resource", expected_status=200, interval=10, timeout=120)
# except (TimeoutError, Exception) as e:
# print(f"Waiter klaida: {e}")
Variacijos:
- Atsako turinio pagrindu laukimas: Tikrinama tam tikra reikšmė ar struktūra JSON/XML atsake.
- Eksponentinis didinimas: Didinamas intervalas tarp bandymų, siekiant sumažinti apkrovą paslaugai dažnų тайм-аутų atveju.
- Parametrizuotas Waiter: Galimybė perduoti parametrus į tikslią užklausą.
- Sąlygų Waiter: Naudojamos sudėtingesnės sąlygos, pvz., statuso ir turinio derinys.
Waiter šablonas naudingas laukiančiam asinchroninių operacijų pabaigos, paslaugos paruošimo po diegimo ar duomenų, kuriuos generuoja kiti procesai, pasirodymo.