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:
- Célzott kérés (Target Request): A kérés, amelyet végrehajtanak, és amelynek eredményét ellenőrzik.
- 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.
- Várakozási intervallum (Polling Interval): Az idő a két egymást követő célzott kérés között.
- 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.