Проверяет умение оптимизировать параллельные запросы к нескольким БД при генерации тяжёлых отчётов, включая работу с историческими данными.
Когда отчёт собирается через Promise.all из десятков запросов к разным базам, узким местом становится не сам параллелизм, а количество соединений, объём данных и отсутствие индексов. Promise.all лишь запускает промисы одновременно, но каждая БД имеет лимит соединений, а тяжёлые выборки конкурируют за IO и CPU.
WHERE id IN (...) или использовать DataLoader для группировки.GROUP BY, SUM), а не в Node.js.p-limit или пул соединений, чтобы не перегружать БД.import pLimit from 'p-limit';
const limit = pLimit(5); // не более 5 одновременных запросов
async function loadUsers(ids) {
// один запрос вместо N
return db.query('SELECT * FROM users WHERE id = ANY($1)', [ids]);
}
async function buildReport(userIds) {
const chunks = chunk(userIds, 100);
const users = await Promise.all(
chunks.map(c => limit(() => loadUsers(c)))
);
const history = await limit(() => historyDb.query(
'SELECT user_id, SUM(amount) FROM events WHERE user_id = ANY($1) GROUP BY user_id',
[userIds]
));
return merge(users.flat(), history);
}
Такой подход снижает нагрузку на БД, уменьшает число round-trip и позволяет контролировать потребление ресурсов. Для исторических данных агрегация на стороне БД даёт выигрыш в разы по сравнению с выгрузкой всех строк в приложение.
Итог: применяйте батчинг, индексы, кэш и ограничение параллелизма — тогда Promise.all станет безопасным инструментом, а не источником перегрузки баз данных.
Уровень
Рейтинг:
4
Сложность:
7
Навыки
JavaScript
Node.js
Ключевые слова
Подпишись на React Developer в телеграм
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию