Sobes.tech
Middle

API үчүн күтүү (Waiter) үлгүсүн кантип ишке ашыруу керек?

sobes.tech AI

AIден жооп

API үчүн күтүүлөр үлгүсүнүн (Waiter) ишке ашуусу ресурстун абалын же операциянын аткарылышын циклдик текшерүүнү камтыйт, күтүлгөн шарт жетишкенче же белгиленген убакыт аяктаганча.

Негизги кадамдар:

  1. Текшерилүүчү шартты аныктоо: API же ресурстун кайсы абалы "дайын" деп саналат (мисалы, суроо-талаптын абалы өзгөрдү, жаңы жазуу пайда болду, күтүлгөн маалыматтар кайтарылды).
  2. Текшерүү механизмин тандоо: Абалдын текшерилиши кандай болорун аныктоо. Бул ошол эле соң чекитке кайра-кайра суроо берүү, атайын статус соң чекитине суроо берүү же жооптун мазмунун текшерүү болушу мүмкүн.
  3. Күтүү параметрлерин орнотуу: Максималдуу күтүү убактысын (тайм-аут) жана текшерүүлөр аралыгындагы интервалды белгилөө.
  4. Циклди ишке ашыруу: Абалдын текшерүүсүн белгиленген интервал менен аткаруучу цикл түзүү.
  5. Чыгуу шарттарын иштетүү:
    • Күтүлгөн шарт жетишкенде чыгуу.
    • Тайм-аут аяктагандан кийин чыгуу, исключение же ката менен.
  6. Ката өңүтүн иштетүү: Цикл ичинде текшерүү учурунда мүмкүн болгон ката-кааттарды алдын алуу (мисалы, API убакыттык жеткиликтүүлүгү жоктугу).

Псевдокоддун мисалы:

# wait_for_resource_ready(api_endpoint, expected_condition, timeout_seconds, interval_seconds)

start_time = current_time
while current_time - start_time < timeout_seconds:
    response = make_api_request(api_endpoint) # APIге суроо берүү

    if check_condition(response, expected_condition): # Даярдык шартын текшерүү
        return True # Шарт аткарылды

    sleep(interval_seconds) # Кийинки текшерүүгө чейин күтүү
    current_time = current_time # Учурдагы убакытты жаңылоо

raise TimeoutError("Ресурс белгиленген убакытта даяр эмес") # Тайм-аут аяктады

# check_condition(response, expected_condition):
# API жоопторуна негизделген даярдык шартын текшерүү логикасы
# Мисалы, return response['status'] == 'ready'

Python менен requests китепканасын колдонуу мисалы:

import requests
import time

def wait_for_status(url, expected_status, timeout=60, interval=5):
    """
    Эндпоинт белгиленген статус кайтарганча күтөт.
    """
    start_time = time.time()

    while time.time() - start_time < timeout:
        try:
            response = requests.get(url)
            if response.status_code == expected_status:
                print(f"[{time.strftime('%H:%M:%S')}] Статус {expected_status} алынган.")
                return True
        except requests.exceptions.RequestException as e:
            print(f"[{time.strftime('%H:%M:%S')}] Суроо катасы: {e}. Кийинки аракет {interval} секунддан кийин.")

        time.sleep(interval)

    raise TimeoutError(f"Статус {expected_status} алуу мүмкүн эмес {timeout} секундда.")

# Колдонуучу мисалы
# try:
#     wait_for_status("http://api.example.com/status", 200)
# except TimeoutError as e:
#     print(e)

Конкреттүү ишке ашыруу APIдин өзгөчөлүктөрүнө жана тестирлөө талаптарына жараша болот. Тайм-ауттар жана интервалдар настройкаланган болушу керек, ошондой эле тайм-ауттун аяктоо кабарламалары маалымдуулук менен берилет.