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 е полезен за изчакване на завършване на асинхронни операции, готовност на услугата след деплой или появата на данни, генерирани от други процеси.