Это очень сложный вопрос на собеседовании, и мне потребовалось 2 часа, чтобы найти разумный ответ.
Это факт. Сегодня я пошел на собеседование в крупную компанию, и интервьюер задал мне следующий вопрос:
«Если запросов 10 000, как использовать промисы для управления параллелизмом?»
С 10000 запросов? он такой огромный!
Я знаю, что эти одновременные запросы к бэкэнду создадут огромную нагрузку на сервер. Если без ограничения скорости, серверная часть потенциально может выйти из строя. Тогда страницы внешнего интерфейса перестанут отвечать на запросы, что приведет к ухудшению пользовательского опыта.
Я понял, что интервьюер хотел оценить мои знания в области управления параллелизмом на основе Promise.
Подумав полчаса, я придумал следующий код.
Использование Promise.all()
const urls = ["followImdoddUrl1", "followImdoddUrl2", ... ,"followImdoddUrl10000"];
const maxConcurrentNum = 10; // Maximum concurrent requests// Split array into chunks, 'chunk' represents batch size, returns a two-dimensional array
function chunk(arr, chunk) {
let result = [];
for (let i = 0, len = arr.length; i < len; i += chunk) {
result.push(arr.slice(i, i + chunk));
}
return result;
}
// Asynchronous request function
function fetchUrl(url) {
return new Promise((resolve, reject) => {
fetch(url)
.then(res => resolve(res))
.catch(err => reject(err));
});
}
// Split the URL array into chunks
const chunkedUrls = chunk(urls, maxConcurrentNum);
(async function () {
try {
for (let urls of chunkedUrls) {
const promises = urls.map(url => fetchUrl(url));
// Wait for all promises to complete and store the results in the 'results' array
const results = await Promise.allSettled(promises);
console.log('results:', results);
}
} catch (err) {
console.error(err);
}
})();
Интервьюер кивнул после просмотра кода, похвалил мои усилия и упомянул:
- Вы правильно справились с проблемой обработки 10000 запросов, сгруппировав их, и решили проблему высокого параллелизма.
- Предоставленный вами код работоспособен и показывает…