Sobes.tech
Middle+

როგორ განვახორციელოთ Waiter ნიმუში API-სთვის?

sobes.tech AI

პასუხი AI-სგან

Waiter ნიმუში API-სთვის განახორციელებს სერვისზე პერიოდული მოთხოვნების გაგზავნით, სანამ გარკვეული პირობა შესრულდება ან დროის გასვლის დრო არ დასრულდება.

ძირითადი კომპონენტები:

  1. მიზნობრივი მოთხოვნა (Target Request): მოთხოვნა, რომელიც ხორციელდება და რომლის შედეგიც შემოწმდება.
  2. დასრულების პირობა (Completion Condition): ლოგიკური გამოთქმა, რომელიც განსაზღვრავს, როდის უნდა შეწყდეს მოლოდინი. ეს შეიძლება იყოს პასუხის გარკვეული სტატუსი (მაგალითად, 200 OK), პასუხის სხეულში მნიშვნელობა, რესურსის არსებობა ან არარსებობა და ა.შ.
  3. მოლოდინის ინტერვალი (Polling Interval): დრო შორის მიმდევრობით მიზნობრივი მოთხოვნების.
  4. დროის გასვლის დრო (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 ნიმუში სასარგებლოა ასინქრონული ოპერაციების დასრულების, სერვისის მზადყოფნის ან სხვა პროცესებით გენერირებული მონაცემების გამოჩენის მოლოდინში.