Sobes.tech
Middle+

Kuidas rakendada API jaoks Waiter mustrit?

sobes.tech AI

Vastus AI-lt

Waiter muster API jaoks realiseeritakse perioodilise päringute saatmise teel teenusele, kuni täidetakse teatud tingimus või aegumistähtaeg saab läbi.

Peamised komponendid:

  1. Sihtpäring (Target Request): Päring, mida täidetakse ja mille tulemust kontrollitakse.
  2. Lõpetamise tingimus (Completion Condition): Loogiline avaldis, mis määrab, millal ooteaeg tuleb lõpetada. See võib olla teatud vastuse staatus (näiteks 200 OK), vastuse kehas olev väärtus, ressursi olemasolu või puudumine jne.
  3. Päringu intervall (Polling Interval): Aeg kahe järjestikuse sihtpäringu vahel.
  4. Aegumistähtaeg (Timeout): Maksimaalne aeg, mille jooksul Waiter saadab päringuid enne, kui see lõpetab vea.

Python näide kasutades requests raamatukogu:

import time
import requests

def wait_for_resource(url, expected_status=200, interval=5, timeout=60):
    """
    API jaoks Waiter mustri realiseerimine.

    Args:
        url (str): Ressursi URL, milleks oodata.
        expected_status (int): Oodatav HTTP vastuse staatus.
        interval (int): Ooteintervall sekundites.
        timeout (int): Maksimaalne ooteaeg sekundites.

    Raises:
        TimeoutError: Kui aegumistähtaeg saab läbi enne oodatud oleku saavutamist.
        Exception: Kui päringul tekib viga.
    """
    start_time = time.time()

    while time.time() - start_time < timeout:
        try:
            response = requests.get(url)
            if response.status_code == expected_status:
                print(f"Resurss aadressil {url} on saadaval oodatud staatuses {expected_status}.")
                return response
            else:
                print(f"Resurss aadressil {url} ei ole saadaval. Praegune staatus: {response.status_code}. Ootan...")
        except requests.exceptions.RequestException as e:
            print(f"Viga päringul {url}: {e}. Ootan...")
        
        time.sleep(interval)

    raise TimeoutError(f"Ooteaeg {url} jaoks on lõppenud.")

# Näide kasutamisest:
# try:
#     wait_for_resource("http://example.com/some_resource", expected_status=200, interval=10, timeout=120)
# except (TimeoutError, Exception) as e:
#     print(f"Waiter viga: {e}")

Variatsioonid:

  • Vastuskeha sisu põhjal ooteaeg: Kontrollib teatud väärtust või struktuuri JSON/XML vastuses.
  • Eksponentsiaalne tagasikäik: Intervalli suurendamine, et vähendada koormust teenusele sagedaste тайм-аутide korral.
  • Parameetritega Waiter: Võimalus edastada parameetreid sihtpäringusse.
  • Tingimuslik Waiter: Kasutatakse keerulisemaid tingimusi, näiteks staatuse ja vastuse sisu kombinatsiooni.

Waiter muster on kasulik asünkroonsete operatsioonide lõpetamise, teenuse valmisoleku pärast juurutamist või teiste protsesside poolt genereeritud andmete ilmumise ootamiseks.