Оправдано ли будет использование NodeJS в качестве бэкенда крупного приложения?

Доброго времени суток,

У кого есть (или знает) крупные проекты на NodeJS с большим количеством посетителей (именно одновременных запросов). Сейчас backend написан одним человеком на коленке для быстрого запуска и сейчас стоит большая задача, переписать с нуля. Хочется взять NodeJS в качестве бэкенда приложения (конечно же с TypeScript для типизации и прочих плюшек). Чем-то NodeJS меня подкупает, но опасаюсь, что не справится с очень большими нагрузками. Хочется услышать мнение людей, которые действительно работали с NodeJS и с большими нагрузками на него. Фронт стоит на Angular (5 мажорная версия на данный момент), тем самым снижая n-нагрузки (ощущается, кстати, прилично)

Участвовал на highload cup с NodeJS, сначала очутился в "попе" рейтинга, из-за некоторых блокирующих запросов, но после правок вышел в 80, но после, конечно же, сместили меня C, C++, GO с нестандартными решениями (которые, конечно же, в большинстве случаев не сработали бы в настоящих проектах). И вот тут у меня по сей день возникает смешанное чувство. В какой-то мере NodeJS меня порадовал, но всё же я думал, что будет намного лучше...
  • Вопрос задан
  • 9655 просмотров
Решения вопроса 4
zoonman
@zoonman
⋆⋆⋆⋆⋆
Paypal и Netflix используют Node.js. У обоих нагрузки очень даже приличные.
В плане масштабируемости думайте об архитектуре. Можно и на perl написать приложение, которое за секунду будет обслуживать миллион клиентов.
Node.js будет прекрасно работать в качестве движка для типичного веб-приложения вроде магазина, чата или CRM. Если у вас очень много компонентов, например тысячи, логичнее приложение разбить на модули и сделать вместо одного приложения несколько, которые можно запускать по-отдельности (здесь уместно упоминание микросервисной архитектуры). Разумеется запросы нужно распределять с помощью балансировщика.
Есть еще такая вот штука https://serverless.com/ - ее можно масштабировать практически до бесконечности. Были бы деньги.
Node.js будет плохо работать в области процессинга данных, например генерация картинок, потоковая обработка видео, нейронные сети и т.д. Здесь лидеры C, C++, Go, Rust, Java.
Можно даже создать гибридное приложение - большую часть выполнить на Node.js, а критичную по производительности на другом языке. Например генерация миллиона прайсов в сутки в старый xls или векторный pdf, упаковка в архив и рассылка - не самая лучшая идея для Node..JS. То же C++ здесь будет вне конкуренции.
Ответ написан
index0h
@index0h
PHP, Golang. https://github.com/index0h
Оправдано ли будет использование NodeJS в качестве бэкенда крупного приложения?

Если крупного - по нагрузкам и маленького по коду, вполне возможно. Если же предполагается крупная кодовая база, нода - это не лучшая идея.

На ноде легко быстро говнять, это главное ее преимущество. Для крупных проектов на первый план, как правило, становятся: безопасность, поддерживаемость, тестируемость, расширяемость и надежность.
Что бы сделать что-то действительно крупное вам потребуются драконовские соглашения, которые во многом будут противоречить идеологии этой платформы, которые в других экосистемах будут излишними.

Приведу несколько примеров.

Валидация аргументов, да можно заюзать typescript, как базу для этого, но есть момент: по хорошему, если вы вызвали некий метод с неправильными данными - его штатная работа не возможна, не плохо бы бросить исключение, но не все так просто, если ваш даже синхронный метод вызовется асинхронно - вы обязаны, либо сделать его сразу асинхронным и передавать ошибку, либо всюду хреначить try-catch, чего оптимизатор v8 не любит.

С тестами асинхронного кода все очень плохо, вам придется обмазываться всякими proxyquire, sinon и т.д. При этом очень внимательно следить за очисткой состояния. Да, я понимаю, что моки и в других языках нужно юзать, но тот же proxyquire можно сравнить с php-шным runkit, что как бы вообще по хорошему трогать не надо, а придется. Примите также за исходную, что вы будете много времени тратить на то, что бы понять какой из тестов асинхронщины у вас сфейлился.

Рано, или поздно у вас возникнет потребность в неком DI контейнере, привычный require 'myService' уже не прокатит. Пробросы зависимостей станут источником ошибок. Если вы не будете это дело покрывать функциональными тестами много ошибок обнаружите уже на stage сервере.

Изоморфные приложения - это просто маркетинговый булшит)) Для крупных проектов характерно использование одних и тех же сущностей в абсолютно разных контекстах, причем на бэке в своих, а на фронте в своих. Но, конечно же, если очень хочется - можно делать более абстракные сущности, что бы они работали и там и там, очень скоро ваш код станет не саппортабельным.

Лука Никитин
Не проводили тест, когда по 2 сервера и на ноду и на php?
Ответ написан
miraage
@miraage
Старый прогер
Мопед не мой.. Но знаю одного вендора игр для мобилок. Пару штук у них весьма популярны.
У них Nodejs (express, koa, sails - не знаю), основное хранилище - redis, вспомогательное - postgres.
Так же, есть общение по WebSocket и фоновый дэмон (вроде как на Kue). И немало Lua запросов в redis.

Я считаю, что с помощью многих инструметов можно написать одинаково как и хорошее приложение, так и плохое. Главное, как будете писать.

Само собой, будет несколько лидеров по производительности. Но не стоит забывать про экосистему/поддержку выбранного стэка.

Выбор за Вами. И совет, если возьмете NodeJS: никаких babel-node и ts-node не использовать. Только обычную ноду, без всяких флагов --harmony итд.
Ответ написан
staffID
@staffID
Если выбрать NodeJS, то будет очень просто создавать изоморфные приложения.
По нагрузке он отлично справляется, также очень хорошо дружит с mongoDB.
Нанять разработчиков на node стоит дешевле, чем на GO, Java и тем-более на c++.
У меня лично GO в качестве web-сервера.
NodeJS - для сборки, и чтобы использовать последние крутые фичи, которых еще нет в движках браузера (ts, scss).
В узких местах использую rust, очень крутой и безопасный язык, в качестве замены c++.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы