Москва: проверенные б/у ноутбуки с гарантией и проверкой перед оплатой
+7 906 722-94-45

Главная → Статьи → Сетевые таймауты и повторы

Сетевые таймауты и повторы: настройка и ограничения

Таймауты сетевых операций: подключение, чтение, запись, повтор с нарастающей задержкой и предотвращение лавины повторных запросов.

Прямой ответ

Таймаут ограничивает время ожидания сетевой операции, поэтому зависший собеседник не удерживает ресурс неограниченно. Повтор компенсирует единичный сбой, но требует ограничения.

Таймаут Что ограничивает
Подключение Время установки соединения
Чтение Время ожидания данных после установки
Запись Время передачи данных в буфер
Общее время Полный срок выполнения запроса
import socket

s = socket.create_connection(("host", 5432), timeout=5)  # подключение
s.settimeout(10)                                          # чтение и запись

Повтор выполняется с нарастающей задержкой, поэтому нагрузка на сервис не возрастает лавинообразно при массовом сбое. О паттернах устойчивости — в статье про retry и circuit breaker.

Нарастающая задержка и идемпотентность повтора

Два требования определяют безопасность повтора запроса.

Нарастающая задержка. Интервал между повторами увеличивается, поэтому нагрузка на сервис снижается. Случайная составляющая интервала исключает одновременный повтор множества клиентов.

Идемпотентность операции. Повтор запроса, изменяющего данные, может выполнить изменение дважды, поэтому операция должна допускать повтор без побочного эффекта. О механизме — в статье про идемпотентность.

Практическое следствие: повтор выполняется только для операций, допускающих повтор, либо с признаком, позволяющим сервису отличить повтор от нового запроса.

Отдельный аспект — ограничение числа повторов. Неограниченный повтор при длительном сбое удерживает ресурс и увеличивает нагрузку на сервис, поэтому число повторов ограничивается.

Три признака некорректной настройки таймаутов.

Отсутствие таймаута чтения. Ожидание данных длится неограниченно, поэтому ресурс удерживается при зависшем собеседнике.

Повтор без нарастающей задержки. Множество клиентов повторяет запрос одновременно, поэтому нагрузка на сервис возрастает.

Повтор неидемпотентной операции. Изменение выполняется дважды, поэтому состояние данных расходится с ожидаемым.

О распределении задержек по этапам — в статье про диагностику задержек.

Соотношение таймаутов в цепочке обращений

Таймауты в цепочке обращений согласуются, поэтому внешний таймаут превышает сумму внутренних.

Внешний таймаут больше внутреннего. Вызывающая сторона ожидает дольше, чем ожидает вызываемый сервис, поэтому внутренний таймаут срабатывает первым и причина отказа определяется на месте.

Обратное соотношение. Внешний таймаут меньше внутреннего, поэтому вызывающая сторона прерывает ожидание раньше, чем вызываемый сервис завершит попытку. Причина отказа не определяется, поскольку ответ не получен.

Суммирование в цепочке. Каждый уровень цепочки добавляет собственное ожидание, поэтому таймаут верхнего уровня превышает сумму таймаутов нижних уровней.

Практическое следствие: таймауты согласуются по цепочке обращений, чтобы причина отказа определялась на уровне, где она возникла.

Практика: настройка таймаутов и повторов

1. Задайте таймаут для каждой сетевой операции. Подключение, чтение и запись ограничиваются отдельно, поскольку причины задержки различаются.

2. Ограничьте общее время выполнения запроса. Таймаут операции не ограничивает суммарное время при нескольких операциях.

3. Используйте нарастающую задержку между повторами. Нагрузка на сервис снижается, поэтому восстановление не затрудняется.

4. Добавьте случайную составляющую к интервалу. Одновременный повтор множества клиентов исключается.

5. Повторяйте только идемпотентные операции. Операция, изменяющая данные, требует признака повтора.

6. Ограничьте число повторов. Неограниченный повтор удерживает ресурс и увеличивает нагрузку.

7. Фиксируйте факт повтора в журнале. Доля повторных запросов показывает частоту сбоев.

Рекомендации:

  1. Различайте таймаут подключения и таймаут чтения. Причины задержки различаются, поэтому значения выбираются отдельно.
  2. Учитываем влияние повторов на нагрузку. Повтор без нарастающей задержки увеличивает нагрузку на сервис в момент сбоя.
  3. Проверяйте идемпотентность операции. Повтор запроса, изменяющего данные, может выполнить изменение дважды.
  4. Фиксируйте значения таймаутов в конфигурации. Значение по умолчанию библиотеки может не соответствовать требованию.
  5. Пересматривайте при изменении времени ответа сервиса. Рост времени обработки требует увеличения таймаута чтения.

Практический сценарий: сбой сервиса привёл к лавине повторных запросов

Контекст: после кратковременного сбоя внешнего сервиса нагрузка на него выросла, и восстановление затянулось.

  1. Диагностика. Клиенты повторяли запрос сразу после таймаута без задержки. Множество клиентов выполняло повтор одновременно, поэтому нагрузка на сервис превышала обычную в момент восстановления.
  2. Причина. Повтор выполнялся без нарастающей задержки и без случайной составляющей, поэтому интервалы повторов совпадали у множества клиентов. Сервис не успевал обработать возросший объём.
  3. Действия. (а) Добавили нарастающую задержку между повторами, чтобы нагрузка снижалась; (б) внесли случайную составляющую в интервал, чтобы исключить одновременный повтор; (в) ограничили число повторов, чтобы неограниченный повтор не удерживал ресурс; (г) перевели изменяющие операции на схему с признаком повтора; (д) добавили метрику доли повторных запросов для контроля.
  4. Результат. Нагрузка на сервис в момент восстановления соответствует обычной, поэтому восстановление не затягивается.

Вывод: повтор без нарастающей задержки создаёт лавину запросов в момент сбоя. Нарастающая задержка со случайной составляющей распределяет повторы во времени и снижает нагрузку на сервис.

FAQ

Какие таймауты задаются для сетевого запроса? Подключение, чтение, запись и общее время выполнения. Причины задержки различаются, поэтому значения выбираются отдельно.

Зачем нужна нарастающая задержка между повторами? Нагрузка на сервис снижается, поэтому восстановление не затрудняется. Одновременный повтор множества клиентов исключается случайной составляющей.

Можно ли повторять любой запрос? Нет, операция, изменяющая данные, требует идемпотентности либо признака повтора, иначе изменение выполняется дважды.

Нужно ли ограничивать число повторов? Да, неограниченный повтор при длительном сбое удерживает ресурс и увеличивает нагрузку на сервис.

Источники: Python socket, RFC 9293, AWS builders library — ссылки в шапке.