Руководства

Разумные таймауты для пакетных задач большого объёма

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

Почему пакетным запросам нужно больше времени

Каждый элемент пакетного массива это самостоятельный поиск, поэтому запрос с 2 000 элементами требует примерно в 2 000 раз больше обработки, чем одиночный поиск, хотя с вашей стороны это один HTTP-вызов. Таймаута в одну-две секунды, разумного для одного адреса, для запроса такого размера совершенно недостаточно.

Масштабирование таймаута под размер пакета

Задавайте таймаут клиента пропорционально размеру отправляемого массива, с некоторым запасом на обычные колебания, а не используйте одно фиксированное значение для всех запросов вашего кода, маленьких и больших.

timeout_seconds = max(5, item_count * 0.05)

Это отправная точка для настройки по собственным наблюдениям, а не фиксированное число, которое следует считать истиной, поскольку реальное время обработки одного элемента не является опубликованной гарантией.

Лучше несколько небольших частей, чем один гигантский запрос

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

Что делать, если таймаут всё же произошёл

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

Настройки таймаута не влияют на стоимость

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

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