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):
    """
    Waiter ձևանմուշի իրականացման API-ի համար:

    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 ձևանմուշը օգտակար է՝ սպասելու համար ասինխրոնային գործողությունների ավարտին, ծառայության պատրաստ լինելուն՝ տեղադրման հետո կամ տվյալների հայտնաբերման համար, որոնք ստեղծվել են այլ գործընթացների կողմից։