max_shane
@max_shane
Javascript / Node.js dev

Какую часть сервера лучше писать на PHP/Java/Go/C#/Rust вместо Node.js?

Какие задачи в REST API приложении самые ресурсозатратные именно для Node.js? Иными словами, какую часть задач сервера выгоднее будет написать на PHP/Java/Go/C#/Rust вместо того, чтобы заниматься оптимизацией Node.js приложения?
Приведите примеры пожалуйста.
  • Вопрос задан
  • 694 просмотра
Решения вопроса 1
EvgenyMamonov
@EvgenyMamonov
Senior software developer, system architect
Максим, всё описанное ниже я пишу исходя из личного опыта, с некоторыми моими утверждениями можно поспорить :)

Так или иначе, но самая ресурсоёмкая задача, почти всегда, это работа с базой.

Несколько лет назад я делал бенчмарки Python, PHP, Node, Go.
Для меня были важны две вещи:
1 - скорость ответа сервера/кол-во запросов в секунду
2 - объём сервиса в памяти, т.к. от этого зависит стоимость ресурсов

На тесте, где сервисы не делали запросы в базу - из всех четверых лучше всего отработал Go с приличным отрывом, цифры, к сожалению, уже не помню.

Но вся эта разница сошла на нет, как только добавился всего один простой SQL запрос в базу, в таблицу с 10 строками. И на этом фоне разница по скорости ответа была меньше 10%.

Иными словами если ваш сервис работает с базой - критической разницы по скорости работы между Go/Rust/PHP/Node/Java, увы, не будет.

Но другое дело если для нас важно сколько памяти "съедает" каждый сервис.

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

Вот тут уже становится интереснее :)

Один экземпляр Go занимал в памяти порядка 6мб, при том, что Pytho+Django порядка 60мб.
Node уже не помню сколько, но что-то близкое к Python'у.
Вот тут уже, когда серверов у вас будет много - количество серверов с Go у вас будет в 10 раз меньше :)
Знаю случаи, когда с почти 40 серверов с API на Node перешли на 2 сервера с Go.

От части по этому и еще по ряду причин, последние несколько лет я использую Go и Python.
Лично я просто в мега восторге от Go :)
Еще Go идеально подходит для написания сетевых сервисов, CLI утилит и т.д.
Например Docker, Kubernetes и еще куча всего написаны на Go.
Я делал подобные вещи на разных языках, и ни на чём, как на Go не получался такой красивый и понятный код, который при этом работает достаточно хорошо.

Про PHP, если знаете его, можете писать на нём, если не знаете - учить не советую, как минимум потому, что есть Python, на нём код куда более читабельный получается, возможностей, вакансий с нормальной з\п больше.

На C# писать не довелось, сказать о нём ничего не могу.

Писал на Java несколько лет, но она мне очень не нравится :) Особенно, когда есть Go :)
Если будете учить Java - готовьтесь к тому, что вы будете обслуживать Legacy код, или скорее ...нокод :)
Но вакансий с хорошей з/п по Java тоже много. Как минимум без денег не останетесь точно.

Rust имеет смысл использовать, когда у вас очень большая нагрузка и для вас критична latency.
Например для показа рекламы нужно ответить за 100мс иначе вашу рекламу просто не покажут.
Вот тут Rust выиагает у Go за счёт того, что у Go будут периодические "провалы" во время сборки мусора.
В остальном, по моему мнению, Rust проиграет за счёт большего времени по разработке, худшей читаемости кода.

С другой стороны, если у вас есть рабочий сервис на Node, то вместо перехода на Rust, явно буде лучше сделать просто модуль на C/C++ для Node и всё будет летать + полный контроль выделения и освобождения памяти.

Я такую схему с модулями на C/С++ не раз использовал на Perl'е.
Очень помогало особенно там, где нужно было чётко освобождать память, чтобы скрипты со временем не пухли.

Надеюсь вам это как то поможет определиться :)
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
sergey-gornostaev
@sergey-gornostaev
Седой и строгий
Без разницы на чём писать сферическое REST API в вакууме. Языки выбираются не по этому принципу.
Ответ написан
mayton2019
@mayton2019
Bigdata Engineer
Все что написал автор не имеет особого значения. Языки выбирают вообще не по такому принципу.
Любой из них - вашу задачу решает. И на 99% выбор будет обусловлен экспертизой вашей команды
по отношению к ЯП.

И оцените риски принципиальной невозможности что-то сделать. Например - запустить фоновое задание или поток внутри процесса Node. Это - важный момент и Liberrum Veto, который может просто исключить какой-то
язык или технологию из списка вообще.
Ответ написан
Комментировать
alekciy
@alekciy
Вёбных дел мастер
В такой формулировке - никакие. Умеете и знаете ноду? Так и пишите на ней. Возникли проблемы? Решайте конкретные проблемы в рамках платформы. Появилась нерешаемая в рамках данной платформы проблема? Вот тут и настало время задумать, а стоит ли переходить.
Ответ написан
@razielvamp
Если под "выгодностью" подразумевается исключительно скорость вычислений, то любую часть сервера "выгоднее" написать на Java, Rust и др. компилируемых, максимально низкоуровневых языках.
Если грамотно сразу в байткоде сделать, то вообще "ракета" будет.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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