Sobes.tech
Middle+

Ako implementovať vzor Waiter pre API?

sobes.tech AI

Odpoveď od AI

Vzor Waiter pre API realizuje sa periodickým odosielaním požiadaviek na službu, kým nie je splnená určitá podmienka alebo nevyprší časový limit.

Hlavné komponenty:

  1. Cieľová požiadavka (Target Request): Požiadavka, ktorá sa vykonáva a jej výsledok sa kontroluje.
  2. Podmienka ukončenia (Completion Condition): Logický výraz určujúci, kedy má byť čakanie ukončené. Môže to byť určitý stav odpovede (napríklad 200 OK), hodnota v tele odpovede, prítomnosť alebo neprítomnosť zdroja atď.
  3. Interval čakania (Polling Interval): Čas medzi po sebe nasledujúcimi cieľovými požiadavkami.
  4. Timeout: Maximálny čas, počas ktorého bude Waiter odosielať požiadavky, než skončí s chybou.

Príklad implementácie v Pythone s použitím knižnice requests:

import time
import requests

def wait_for_resource(url, expected_status=200, interval=5, timeout=60):
    """
    Implementácia vzoru Waiter pre API.

    Args:
        url (str): URL zdroja na čakanie.
        expected_status (int): Očakávaný HTTP stav odpovede.
        interval (int): Interval čakania medzi požiadavkami v sekundách.
        timeout (int): Maximálny čas na čakanie v sekundách.

    Raises:
        TimeoutError: Ak časový limit vyprší pred dosiahnutím očakávaného stavu.
        Exception: Ak dôjde k chybe pri vykonávaní požiadavky.
    """
    start_time = time.time()

    while time.time() - start_time < timeout:
        try:
            response = requests.get(url)
            if response.status_code == expected_status:
                print(f"Zdroj na adrese {url} je dostupný s očakávaným stavom {expected_status}.")
                return response
            else:
                print(f"Zdroj na adrese {url} nie je dostupný. Aktuálny stav: {response.status_code}. Čakám...")
        except requests.exceptions.RequestException as e:
            print(f"Chyba pri požiadavke na {url}: {e}. Čakám...")
        
        time.sleep(interval)

    raise TimeoutError(f"Časový limit čakania na zdroj {url} vypršal.")

# Príklad použitia
# try:
#     wait_for_resource("http://example.com/some_resource", expected_status=200, interval=10, timeout=120)
# except (TimeoutError, Exception) as e:
#     print(f"Chyba v Waiterovi: {e}")

Variácie realizácie:

  • Čakanie na základe obsahu odpovede: Kontrola určitej hodnoty alebo štruktúry v tele odpovede JSON/XML.
  • Exponenciálne zvyšovanie intervalu: Zvyšovanie intervalu medzi pokusmi na zníženie záťaže na službu pri častých timeoutoch.
  • Parametrizovaný Waiter: Možnosť odovzdávať parametre do cieľovej požiadavky.
  • Podmienený Waiter: Použitie zložitejších podmienok, napríklad kombinácie stavu a obsahu odpovede.

Vzorec Waiter je užitočný na čakanie na dokončenie asynchrónnych operácií, pripravenosť služby po nasadení alebo na zobrazenie dát generovaných inými procesmi.