Sobes.tech
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:

  1. Solicitare țintă (Target Request): Solicitarea efectuată și al cărei rezultat este verificat.
  2. 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.
  3. Interval de sondare (Polling Interval): Timpul dintre solicitările succesive.
  4. 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.