Много HTTP-запросов на своём агенте
Если нужно получать данные с большого числа адресов, выберите для агента профиль «Высокая нагрузка». Он добавит отдельный сетевой компонент с общей ёмкостью до 6000 одновременно выполняемых HTTP-запросов. Сценарии, расписания, результаты, выгрузки и обновления остаются в привычном агенте.
Когда это полезно
Например, вы собираете цены из каталога или проверяете доступность большого списка страниц. Пока сайт отвечает на один запрос, агент может ждать ответы на другие. Это сокращает время ожидания. Скорость разбора страниц, записи результатов и работы самого источника также влияет на длительность сбора.
6000 относится к HTTP-запросам в работе. Это не число сценариев, браузерных сессий или запросов в секунду. Если для каждой страницы нужен браузер, выбирайте ресурсы и настройки браузера отдельно.
Как включить
- Откройте «Агенты» и подготовку установки.
- На шаге «Возможности» выберите размер установки «Высокая нагрузка».
- Проверьте сервер. Этот профиль требует больше памяти, чем обычный агент.
- Завершите установку. В карточке агента появятся сведения о сетевом компоненте.
- В настройках нужного сайта выберите этого агента и задайте пределы запросов.
Обычные профили не включают эту возможность автоматически. Существующую установку
нужно подготовить к переходу с помощью специалиста: сохранить ключи, пароли и тома,
обновить установочный комплект и добавить сетевую службу в период обслуживания.
Не заменяйте действующий .env новым комплектом целиком: это может изменить ключ
шифрования уже сохранённых данных. До перехода обычный агент работает как прежде.
Три настройки, которые важно различать
| Настройка сайта | Что ограничивает |
|---|---|
| Одновременных запросов | Сколько HTTP-ответов можно ждать в один момент |
| Обращений за секунду | Как часто начинать новые обращения к источнику |
| Короткий пик | Сколько обращений разрешить подряд перед ожиданием |
Верхний предел задаёт сам агент. Настройки сайта, robots.txt, выбранный маршрут через прокси и другие правила продолжают действовать. Большая ёмкость не означает, что нужно ставить максимум для каждого сайта. Начните с умеренной нагрузки и проверьте ответы, ошибки и время сбора.
При смене исполнителя на облако или обычного агента уменьшите высокие пределы до доступных новому исполнителю. Сервер проверяет эти значения при сохранении.
Как использовать в сценарии
Во всех текущих языках есть pool(). Он загружает список независимых адресов
параллельно и возвращает ответы в порядке этого списка. На обычном агенте и в
обычном профиле вызов принимает до 8 адресов, максимум два запроса выполняются
одновременно. В профиле высокой нагрузки вызов принимает до 6000 адресов, а
конкурентность ограничивается настройками сайта и общей ёмкостью компонента.
Ожидающие ответы не мешают начинать следующие разрешённые запросы. Ограничение
частоты сохраняется: если сайту разрешено 100 обращений в секунду, агент не начнёт
все 6000 сразу. При достаточно долгих ответах число ожидающих запросов может
постепенно достигнуть выбранного предела, если это позволяют время ожидания
разрешений и общий предел выполнения.
PHP, внутри функции сценария:
$urls = $ctx->param('product_urls', []);
$responses = $ctx->http()->withoutCache()->pool($urls);
foreach ($responses as $response) {
$ctx->log('Страница получена', ['status' => $response->status]);
}
JavaScript, внутри async function run(ctx):
const urls = ctx.param('product_urls', []);
const responses = await ctx.http().withoutCache().pool(urls);
for (const response of responses) {
ctx.log('Страница получена', { status: response.status });
}
TypeScript использует тот же вызов:
const urls = ctx.param('product_urls', []) as string[];
const responses = await ctx.http().withoutCache().pool(urls);
for (const response of responses) {
ctx.log('Страница получена', { status: response.status });
}
Python, внутри def run(ctx):
urls = ctx.param('product_urls', [])
responses = ctx.http().without_cache().pool(urls)
for response in responses:
ctx.log('Страница получена', {'status': response.status})
withoutCache() или without_cache() запрашивает свежие страницы. Уберите этот
вызов, если можно использовать сохранённый ответ. Необязательный параметр управления
автоматической обработкой CAPTCHA у pool() сохраняется, его значение по умолчанию
не меняется. Этот профиль не добавляет новых типов проверок доступа.
Почему не стоит передавать все адреса сразу
Ответ одного вызова SDK ограничен 8 000 000 байт вместе с метаданными. Шесть тысяч коротких ответов могут поместиться, а шесть тысяч больших HTML-страниц не поместятся. Например, 6000 страниц по 100 КБ занимают около 600 МБ ещё до служебных полей.
Для крупных страниц передавайте небольшие пачки, например по 16 или 32 адреса.
Обработайте одну пачку и только затем запросите следующую. Так данные не будут
накапливаться в памяти сценария. Текущий pool() возвращает готовый список, а не
неограниченный поток. Если запрос не удался или результат слишком большой, вызов
вернёт ошибку. Ответ с HTTP-статусом 404 или 500 сам по себе не является сетевым
исключением: проверяйте status и ok() у каждого ответа. Агент не выдаёт
незаметно обрезанные страницы.
Одна сессия пула допускает до 20 000 сетевых обращений, включая перенаправления и повторы, и живёт не дольше 10 минут. Это дополнительная граница: один адрес может потребовать нескольких обращений. При её достижении уменьшите число адресов в пачке.
Каждый адрес расходует единицу бюджета обращений SDK. Пробный запуск и общий предел времени сценария также продолжают действовать. Будущие языки сценариев можно подключать к тому же сетевому механизму; выполнение сценариев на Go этот профиль само по себе не добавляет.
Где смотреть состояние
В карточке агента есть блок «HTTP-запросы»: число запросов в работе, общая ёмкость, максимум с запуска компонента и число завершённых обращений. История показывает нагрузку за выбранный период. При отсутствии связи остаются последние полученные значения, поэтому проверяйте время замера.
Отмена сбора останавливает оставшиеся запросы. Если сетевой компонент недоступен или занят, сбор покажет ошибку. Прежде чем повторять запуск, проверьте связь, состояние службы и размер пачки. Результат ошибочного пула не является частично успешным списком; учитывайте это, если запросы меняют данные на стороне источника. Обновление компонента использует тот же механизм подписанных выпусков агента; ручное обновление остаётся вариантом по умолчанию. Перед завершением обновления проверяется совместимость компонентов. Если проверка не проходит, агент возвращается к предыдущей версии.
Подробнее о методах: PHP, JavaScript, TypeScript, Python.