Перейти к содержанию

Практикум: таймауты — не дедлайны

Скрипты, на которых основаны измерения в статье. Все серверы запускаются в том же процессе на loopback-интерфейсе; внешняя сеть не нужна.

uv venv --python 3.13 .venv
uv pip install --python .venv/bin/python "deadline-budget==0.1.3" "clientwright[httpx,deadline]==0.2.2" "grpc-client-kit[deadline]==0.1.0"
.venv/bin/python 01_read_timeout.py
.venv/bin/python 02_retry_multiplies.py
.venv/bin/python 03_grpc_chain.py
.venv/bin/python 04_deadline_header.py
Скрипт Что измеряет
01_read_timeout.py Поведение httpx с timeout=1.0: тело ответа поступает по частям четыре секунды; сервер задерживает заголовки; запрос выполняется внутри asyncio.timeout или с ограничением total в clientwright
02_retry_multiplies.py Самописный цикл из трёх попыток обращения к серверу, который не отвечает, и те же попытки с единым общим лимитом времени
03_grpc_chain.py Цепочку gateway → orders → inventory, billing: дедлайн на каждом сервере при отдельном таймауте каждого вызова и при передаче дедлайна шлюза; отдельно — бюджет 50 с при настроенном лимите вызова 5 с
04_deadline_header.py Значение X-Deadline-Ms, которое получает вышестоящий HTTP-сервис при каждой попытке, если у вызывающей стороны есть общий бюджет запроса

Исходный код практикума на GitHub.