Вступить в клуб →
сложнаявопросАсинхронность и event loop

3000 внешних вызовов: цикл с await против Promise.all на всё сразу

Ночная джоба обогащает 3000 заказов данными из внутреннего сервиса. Сейчас так:

for (const order of orders) {
  await enrich(order); // ~80 мс: HTTP-вызов + запись в PostgreSQL
}

Джоба идёт около четырёх минут и не укладывается в окно. Разработчик предлагает заменить цикл на await Promise.all(orders.map(enrich)). Что произойдёт и как сделать правильно?

  • Скорость вырастет линейно и без побочных эффектов: `Promise.all` сам ограничивает конкурентность размером пула соединений
  • Ничего не изменится: операции всё равно выполнятся по очереди, ведь JavaScript-код в Node.js исполняется в одном потоке
  • Джоба ускорится, но потеряет часть заказов: `Promise.all` пропускает элементы, которые не успели завершиться вовремя
  • Стартуют 3000 одновременных операций: пул БД и внешний сервис захлебнутся; нужна ограниченная конкурентность

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела