Middle+
როგორ განვახორციელოთ Waiter ნიმუში API-სთვის?
sobes.tech AI
პასუხი AI-სგან
Waiter ნიმუში API-სთვის განახორციელებს სერვისზე პერიოდული მოთხოვნების გაგზავნით, სანამ გარკვეული პირობა შესრულდება ან დროის გასვლის დრო არ დასრულდება.
ძირითადი კომპონენტები:
- მიზნობრივი მოთხოვნა (Target Request): მოთხოვნა, რომელიც ხორციელდება და რომლის შედეგიც შემოწმდება.
- დასრულების პირობა (Completion Condition): ლოგიკური გამოთქმა, რომელიც განსაზღვრავს, როდის უნდა შეწყდეს მოლოდინი. ეს შეიძლება იყოს პასუხის გარკვეული სტატუსი (მაგალითად, 200 OK), პასუხის სხეულში მნიშვნელობა, რესურსის არსებობა ან არარსებობა და ა.შ.
- მოლოდინის ინტერვალი (Polling Interval): დრო შორის მიმდევრობით მიზნობრივი მოთხოვნების.
- დროის გასვლის დრო (Timeout): მაქსიმალური დრო, რომლის განმავლობაში Waiter-ი აგზავნის მოთხოვნებს, სანამ შეცდომით არ დასრულდება.
Python-ში requests ბიბლიოთეკის გამოყენებით მაგალითი:
import time
import requests
def wait_for_resource(url, expected_status=200, interval=5, timeout=60):
"""
API-ისთვის Waiter ნიმუშის განხორციელება.
Args:
url (str): რესურსის URL-ის მოლოდინი.
expected_status (int): მოლოდინული HTTP სტატუსი.
interval (int): ინტერვალი მოთხოვნების შორის წამებში.
timeout (int): მაქსიმალური დრო მოლოდინში წამებში.
Raises:
TimeoutError: თუ დროის გასვლის შემდეგ მოლოდინი არ შესრულდა.
Exception: თუ მოთხოვნის შესრულებისას შეცდომა მოხდა.
"""
start_time = time.time()
while time.time() - start_time < timeout:
try:
response = requests.get(url)
if response.status_code == expected_status:
print(f"რესურსი მისამართზე {url} ხელმისაწვდომია მოლოდინული სტატუსით {expected_status}.")
return response
else:
print(f"რესურსი მისამართზე {url} ხელმისაწვდომი არაა. მიმდინარე სტატუსი: {response.status_code}. მოლოდინში...")
except requests.exceptions.RequestException as e:
print(f"შეცდომა {url}-ზე მოთხოვნის დროს: {e}. მოლოდინში...")
time.sleep(interval)
raise TimeoutError(f"{url}-ის მოლოდინის დრო დასრულდა.")
# გამოყენების მაგალითი:
# try:
# wait_for_resource("http://example.com/some_resource", expected_status=200, interval=10, timeout=120)
# except (TimeoutError, Exception) as e:
# print(f"Waiter-ის შეცდომა: {e}")
ვარიაციები:
- პასუხის სხეულის საფუძველზე მოლოდინი: გარკვეული მნიშვნელობის ან სტრუქტურის შემოწმება JSON/XML პასუხში.
- ექსპონენციული გადახრა: ინტერვალის გაზრდა, რათა შემცირდეს სერვისზე დატვირთვა ხშირი тайმ-აუტების დროს.
- პარამეტრიზებული Waiter: შესაძლებლობა გადმოსცეთ პარამეტრები მიზნობრივ მოთხოვნაში.
- შეთანხმებული Waiter: გამოყენება უფრო რთული პირობების, მაგალითად სტატუსის და პასუხის შიგთავსის კომბინაცია.
Waiter ნიმუში სასარგებლოა ასინქრონული ოპერაციების დასრულების, სერვისის მზადყოფნის ან სხვა პროცესებით გენერირებული მონაცემების გამოჩენის მოლოდინში.