Ответ вслух Middle Асинхронные паттерны обновлено

Как обработать 10 000 URL не больше чем по 10 за раз

Вопрос

Нужно скачать 10 000 URL, но не больше 10 одновременно. Как бы ты это сделал?

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Запустить всё через Promise.all нельзя: десять тысяч соединений разом упрутся в лимиты внешнего сервиса, файловые дескрипторы и память. Делаю пул: создаю десять асинхронных воркеров, каждый в цикле берёт следующий индекс из общего счётчика и ждёт свой запрос.

Что должно прозвучать в ответе

  • Promise.all на всё сразу нельзя: дескрипторы, лимиты API, память

  • Пул воркеров: N асинхронных циклов берут следующий индекс из общего счётчика

  • Результаты складываются по индексу, чтобы сохранить порядок

  • Ошибка одной задачи не должна ронять всё: try/catch или allSettled-логика

  • Таймаут на каждый запрос через AbortSignal.timeout

  • Готовые решения: p-limit, очередь с concurrency

Что могут спросить следом

  • Как добавить повторы с экспоненциальной задержкой?
  • Как остановить всё при первой критической ошибке?
  • Что изменится, если URL приходят потоком, а не массивом?

Разбор

Запустить всё через Promise.all нельзя: десять тысяч соединений разом упрутся в лимиты внешнего сервиса, файловые дескрипторы и память.

Делаю пул: создаю десять асинхронных воркеров, каждый в цикле берёт следующий индекс из общего счётчика и ждёт свой запрос. Так как JavaScript однопоточный, инкремент счётчика безопасен, гонок нет. Результат кладу в массив по индексу, порядок сохраняется. Ждём все воркеры через Promise.all.

Каждый запрос оборачиваю в try/catch, чтобы одна ошибка не остановила остальные, и ставлю таймаут через AbortSignal.timeout. Для временных ошибок добавляю пару повторов с растущей паузой.

В проде я бы взял p-limit или очередь с параметром concurrency, но логика внутри у них именно такая.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме