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