Middle+
Cum se implementează pattern-ul Waiter pentru API?
sobes.tech AI
Răspuns de la AI
Modelul Waiter pentru API se implementează prin trimiterea periodică a solicitărilor către serviciu până când o anumită condiție este îndeplinită sau expiră timeout-ul.
Componente principale:
- Solicitare țintă (Target Request): Solicitarea efectuată și al cărei rezultat este verificat.
- Condiție de finalizare (Completion Condition): Expresie logică care determină când trebuie să se oprească așteptarea. Poate fi un anumit statut de răspuns (de exemplu, 200 OK), o valoare în corpul răspunsului, prezența sau absența unei resurse etc.
- Interval de sondare (Polling Interval): Timpul dintre solicitările succesive.
- Timeout: Timpul maxim în care Waiter va efectua solicitări înainte de a se încheia cu o eroare.
Exemplu de implementare în Python folosind biblioteca requests:
import time
import requests
def wait_for_resource(url, expected_status=200, interval=5, timeout=60):
"""
Implementarea modelului Waiter pentru API.
Args:
url (str): URL-ul resursei pentru care se așteaptă.
expected_status (int): Statutul HTTP așteptat.
interval (int): Intervalul de așteptare între solicitări în secunde.
timeout (int): Timpul maxim de așteptare în secunde.
Raises:
TimeoutError: Dacă timpul de așteptare expiră înainte de atingerea stării așteptate.
Exception: Dacă apare o eroare în timpul solicitării.
"""
start_time = time.time()
while time.time() - start_time < timeout:
try:
response = requests.get(url)
if response.status_code == expected_status:
print(f"Resursa de la {url} este disponibilă cu starea așteptată {expected_status}.")
return response
else:
print(f"Resursa de la {url} nu este disponibilă. Starea curentă: {response.status_code}. Așteptare...")
except requests.exceptions.RequestException as e:
print(f"Eroare la solicitarea către {url}: {e}. Așteptare...")
time.sleep(interval)
raise TimeoutError(f"Timpul de așteptare pentru resursa {url} a expirat.")
# Exemplu de utilizare
# try:
# wait_for_resource("http://example.com/some_resource", expected_status=200, interval=10, timeout=120)
# except (TimeoutError, Exception) as e:
# print(f"Eroare în Waiter: {e}")
Variații de implementare:
- Așteptare bazată pe corpul răspunsului: Verificarea unei valori sau structuri specifice în corpul răspunsului JSON/XML.
- Backoff exponențial: Creșterea intervalului de așteptare între încercări pentru reducerea încărcării asupra serviciului în caz de timeout-uri frecvente.
- Waiter parametrizat: Posibilitatea de a transmite parametri în solicitarea țintă.
- Așteptare condiționată: Utilizarea unor condiții mai complexe, de exemplu, combinație de stare și conținut al răspunsului.
Modelul Waiter este util pentru a aștepta finalizarea operațiunilor asincrone, disponibilitatea serviciului după o implementare sau apariția datelor generate de alte procese.