6 небольших советов, чтобы подготовить NodeJS к высоким нагрузкам
- суббота, 15 июня 2019 г. в 00:18:35
Разработка на NodeJS в качестве хобби — сплошное удовольствие, но когда речь о продакшене для множества пользователей, есть пара вещей, которые стоит знать, чтобы избежать долгого отклика и сбоев.
В рамках работы в MyHeritage мы разработали сервис doppelgänger для Евровидения 2019 года, с помощью которого, загрузив селфи, можно узнать на кого из участников конкурса вы похожи больше всего.
Помимо логики распознавания лиц, приложение имело крайне ясное требование: оно должно было обслуживать десятки тысяч одновременных пользователей, ведь Евровидение смотрят миллионы людей по всему миру.
Весьма быстро мы поняли, что балансировщика нагрузки перед приложением, настроенного с помощью Auto Scaling, недостаточно для отказоустойчивости. Нам очень помогло следующее:
fs.readSync
) заманчивы, потому что код выглядит чище, но они буквально убивают производительность. Вместо них используйте async
/await
операции, потому что во время выполнения асинхронной работы ЦП будет доступен и для других задач (см. Цикл событий).const res = fs.readSync('file.txt');
После: const res = await fs.readAsync('file.txt');
Node
по умолчанию настроен на ограничение в 1 ГБ. Если серверу доступно, скажем, 4 ГБ специально под ваше приложение, установить максимальный предел памяти вам придется вручную, используя CLI со следующим флагом: --max-old-space-size
Пример: node --max-old-space-size=4096 server.js
Node
работает в одном треде. Если вы специально не настраивали конфигурацию, которая запускала бы несколько тредов, сэкономьте деньги, выбрав сервер с 1 ядром.В нашем случае эти советы привели к десятикратному улучшению производительности и помогли сохранить в чистоте окружение на продакшене, даже когда приходилось обслуживать тысячи пользователей одновременно.
Спасибо, что дочитали.