Middle
Kaip įgyvendinti laukimo (Waiter) modelį API?
sobes.tech AI
Atsakymas iš AI
„Waiter“ modelio įgyvendinimas API apima ciklinį būsenos patikrinimą ištekliaus ar operacijos vykdymo, kol bus pasiektas laukiamas sąlyga arba pasibaigs nustatytas laiko limitas.
Pagrindiniai žingsniai:
- Patikrinamos sąlygos apibrėžimas: Aiškiai suprasti, kokia API ar išteklia būklė laikoma "paruošta" (pvz., užklausos būsena pasikeitė, atsirado naujas įrašas, grąžinti tikėtini duomenys).
- Patikros mechanizmo pasirinkimas: Nustatyti, kaip bus vykdoma būsenos patikra. Tai gali būti pakartotinis užklausos siuntimas į tą patį galinį tašką, užklausos siuntimas į specialų būsenos galinį tašką arba atsakymo turinio patikra.
- Laukiamų parametrų nustatymas: Nustatyti maksimalų laukimo laiką (timeout) ir intervalą tarp patikrinimų.
- Ciklo įgyvendinimas: Sukurti ciklą, kuris vykdys būsenos patikrą su nurodytu intervalu.
- Išeities sąlygų apdorojimas:
- Išeiti, kai pasiekiama laukta sąlyga.
- Išeiti, kai pasibaigia timeout, su išimtimi arba klaida.
- Klaidų apdorojimas patikros metu: Numatyti galimų klaidų apdorojimą ciklo viduje (pvz., laikina API neprieinamumas).
Pavyzdinis pseudokodas:
# wait_for_resource_ready(api_endpoint, expected_condition, timeout_seconds, interval_seconds)
start_time = current_time
while current_time - start_time < timeout_seconds:
response = make_api_request(api_endpoint) # API užklausos vykdymas
if check_condition(response, expected_condition): # Paruošimo sąlygos patikra
return True # Sąlyga įvykdyta
sleep(interval_seconds) # Laukti prieš kitą patikrą
current_time = current_time # Atnaujinti dabartinį laiką
raise TimeoutError("Išteklis neparuoštas per nustatytą laiką") # Laiko limitas pasibaigė
# check_condition(response, expected_condition):
# Logika, patikrinanti paruošimo sąlygą pagal API atsaką
# Pvz., return response['status'] == 'ready'
Python pavyzdys naudojant requests biblioteką:
import requests
import time
def wait_for_status(url, expected_status, timeout=60, interval=5):
"""
Laukia, kol galinis taškas grąžins tam tikrą būseną.
"""
start_time = time.time()
while time.time() - start_time < timeout:
try:
response = requests.get(url)
if response.status_code == expected_status:
print(f"[{time.strftime('%H:%M:%S')}] Gauta būsena {expected_status}.")
return True
except requests.exceptions.RequestException as e:
print(f"[{time.strftime('%H:%M:%S')}] Užklausos klaida: {e}. Bandysime dar kartą po {interval} sekundžių.")
time.sleep(interval)
raise TimeoutError(f"Nepavyko gauti būsenos {expected_status} per {timeout} sekundžių.")
# Pavyzdys naudojimui
# try:
# wait_for_status("http://api.example.com/status", 200)
# except TimeoutError as e:
# print(e)
Konkretaus įgyvendinimo pasirinkimas priklauso nuo API specifikos ir testavimo reikalavimų. Svarbu užtikrinti lankstumą nustatant timeout'us ir intervalus, taip pat informatyvias žinutes apie timeout pabaigą.