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

  1. Tiksli užklausa (Target Request): Užklausa, kuri vykdoma ir kurios rezultatas tikrinamas.
  2. 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.
  3. Paklausos intervalas (Polling Interval): Laikas tarp nuoseklių tikslių užklausų.
  4. 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.