Sobes.tech
Middle+

Kako implementirati obrazac Waiter za API?

sobes.tech АИ

Одговор од АИ

Шаблон 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 је користан за чекање на завршетак асинхроних операција, спремност сервиса након деплоја или појаву података које генеришу други процеси.