Sobes.tech
Middle+

Hogyan valósítsuk meg a Waiter mintát az API-hoz?

sobes.tech MI

Válasz az MI-től

A Waiter minta minta API-hoz periodikus kérés küldésével valósítható meg, amíg egy adott feltétel nem teljesül, vagy nem telik el a timeout.

Fő komponensek:

  1. Célzott kérés (Target Request): A kérés, amelyet végrehajtanak, és amelynek eredményét ellenőrzik.
  2. Befejezési feltétel (Completion Condition): Logikai kifejezés, amely meghatározza, mikor kell megszakítani a várakozást. Ez lehet egy adott válasz státuszkód (pl. 200 OK), a válasz törzsében lévő érték, erőforrás megléte vagy hiánya, stb.
  3. Várakozási intervallum (Polling Interval): Az idő a két egymást követő célzott kérés között.
  4. Timeout: A maximális idő, ameddig a Waiter kérésokat küld, mielőtt hibával leáll.

Python példakód a requests könyvtár használatával:

import time
import requests

def wait_for_resource(url, expected_status=200, interval=5, timeout=60):
    """
    A Waiter minta megvalósítása API-hoz.

    Args:
        url (str): A várakozó erőforrás URL-je.
        expected_status (int): Várt HTTP státuszkód.
        interval (int): Várakozási idő másodpercben kérésenként.
        timeout (int): Maximális várakozási idő másodpercben.

    Raises:
        TimeoutError: Ha a timeout lejár a várt állapot eléréséig.
        Exception: Ha kérés közben hiba történik.
    """
    start_time = time.time()

    while time.time() - start_time < timeout:
        try:
            response = requests.get(url)
            if response.status_code == expected_status:
                print(f"A {url} erőforrás elérhető a várt státusszal {expected_status}.")
                return response
            else:
                print(f"A {url} erőforrás nem elérhető. Jelenlegi státusz: {response.status_code}. Várakozás...")
        except requests.exceptions.RequestException as e:
            print(f"Hiba a kérés során {url}: {e}. Várakozás...")
        
        time.sleep(interval)

    raise TimeoutError(f"A {url} erőforrás várakozási ideje lejárt.")

# Használati példa
# try:
#     wait_for_resource("http://example.com/some_resource", expected_status=200, interval=10, timeout=120)
# except (TimeoutError, Exception) as e:
#     print(f"Waiter hiba: {e}")

Variációk:

  • Válasz törzs alapján való várakozás: Egy adott érték vagy struktúra ellenőrzése a JSON/XML válaszban.
  • Exponenciális visszaesés: A próbálkozások közötti idő növelése a szerver terhelésének csökkentése érdekében.
  • Paraméterezett Waiter: A célzott kérés paramétereinek átadása.
  • Feltételes várakozás: Bonyolultabb feltételek használata, például státusz és válasz tartalmának kombinációja.

A Waiter minta hasznos az aszinkron műveletek befejezésének, a szolgáltatás készenlétének vagy más folyamatok által generált adatok megjelenésének várakozására.