Задать вопрос
@ericcartman

Асинхронность Node.js против Java, в чем подвох?

Добрый день, помогите разобраться, прочел:
В чём преимущество Node?

C Node проще масштабироваться. При одновременном подключении к серверу тысяч пользователей Node работает асинхронно, то есть ставит приоритеты и распределяет ресурсы грамотнее. Java же, например, выделяет на каждое подключение отдельный поток.
( если нужен источник - гуглите, ссылки не дает вставлять)

Во-первых, обрабатывает запросы не Node с Java, а сервера. Предположим, мы хотим создать веб-сервис с бекендом и базой. Если создаем на Java, то ставим Nginx + Apache, и вот Апач то уже и выделяет на каждый запрос по воркеру, который работает синхронно, то есть повисает при тяжелых запросах к базе. Правильно я думаю?
Тогда вопрос, каким таким чудесным образом Node это избегает? И что получается? Node работает на движке V8, которому тоже нужен сервер, например Nginx , так? Если можно на пальцах объясните, пожалуйста,как там все происходит ( а я потом уже почитаю и рунет и буржунет) ? Ну асинхронная она, но запрос то должен кто-то делать? Кто его делает?
Ну и вообще, цитата выше, это правда? или просто агитация за ноду?
  • Вопрос задан
  • 924 просмотра
Подписаться 2 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 5
@InoMono
Ну во первых, у Java дофига всяких разных greenlet и пр. технологий, где и явная асинхронность не нужна (она и неудобна)

Во вторых, отдельные воркеры в Apache нужны только для тех бэкэндов, которым это нужно.
Если вы хотите максимизировать число параллельно выполняемых бэкэндом запросов, то, очевидно, что нужно искать другой путь, без воркеров Apache. Например, https://habrahabr.ru/company/itsumma/blog/337346/

В третьих, для лучшего понимания следует изолировать мысленно задачу и вообще исключить тут Апач. Рассматриваем возможности только самой Ноды и самой JVM.

В четвертых, холивар абсолютнобессмысленнен, так как конкретное приложение будет реализовываться с учетом возможностей конкретной среды исполнения. Речь идет о качественной реализации, разумеется. И программист учтет особенности Ноды или JVM. Если он квалифицированный.

В пятых, неквалифицированному программисту не поможет никакой волшебный инструмент.

В шестых, при прочих равных (при одинаково хорошем познании программиста в обеих системах) - JVM будет завсегда быстрее. Ибо она и от С-то отстает ненамного.

В седьмых, но нельзя не обратить внимание на тот факт, что используя Ноду можно обойтись знанием одного языка. Собственно, взлет Ноды именно этим и обусловлен. Что множество фронтендеров, которые желают писать бэкенд. И написали уже для нее кучу вспомогательных инструментов/библиотек и пр. Более ничего такого особо волшебного в Ноде нет.
Ответ написан
Комментировать
leahch
@leahch
3D специалист. Dолго, Dорого, Dерьмово.
Полнейшая глупость! На данный момент: а по хорошему уже лет 10 минимум, существует куча асинхронных фреймворков и сетевых библиотек, которые работают ровно на том же самом принципе, как и nodejs.
Примеров, у нас их есть:
- фреймворки jooby.org, sparkjava, springboot
- библиотеки (серверы) netty, undertow, akka
По производительности ничуть не уступают nodejs.

Ну а как все это работает? Есть два вида программирования, которые можно совмещать:
Старый и много кем используемый
- сервер ждет сетевое соединение
- как только соединение произошло, сервер запускает процесс/поток и ему передает открытое соединение.
В этом случае мы ограничены количеством потоков/процессов в системе, имеем большой оверхед на создание процесса/потока. Зато нам не нужно сильно заботиться о работе с сокетами.
Новый хайповый/модерновый
- при старте в сервере региструются обработчики данных (наши сервисы/приложения)
- сервер открывает сокет и слушает все открытые им ранее сокеты, висит в ожидании события прихода/передачи данных на методе select/poll/epoll или побобном.
- как только сервер получил ответ, он вызывает зарегистрированный обработчик и передает туда порцию полученных данных, принимает эти данные обратно и и отправляет в сеть на нужное соединение
В этом случае сервер работает в один поток, просто последовательно вызывая обработчики и отдавая им данные. Быстро, очень быстро, ловко, нет накладных расходов. Зато, если какой обработчик пытается сделать блокирующую операцию - виснут все остальные обработчики, поэтому обработчики с сервером общаются сообщениями и стараются не занимать много процессорных ресурсов. Программирование получается сложное.

Также можно совмещать эти два подхода, делая и пул потоков и работая в асинхронном режиме.

На почитать сюда например - https://ru.wikipedia.org/wiki/Epoll
Ответ написан
Тогда вопрос, каким таким чудесным образом Node это избегает? Если можно на пальцах объясните, пожалуйста,как там все происходит


Синхронно: приняли запрос, обрабатываем: что-то там считаем, нужна инфа с базы/файло? - Ждем, пока ждем все висит мертвым грузом, получаем, что-то еще считаем, выдаем результат, принимаем следующий запрос.
Асинхронно: приняли запрос, обрабатываем: что-то там считаем, нужна инфа с базы/файло? - Не ждем, переходим к следующему запросу. Как только нужная инфа пришла - возвращаемся к невыполненному запросу, досчитываем недосчитанное, выдаем результат, переходим к следующему запросу.

Ну асинхронная она, но запрос то должен кто-то делать? Кто его делает?


Пользователь. Веб сервера обслуживают запросы от пользователей. При попытке посмотреть, например, эту страницу, ваш браузер отправляет веб-серверу запрос
HOST: toster.ru
GET: /q/500685

Получает ответ, содержащий html, парсит html, узнает, что ему нужно еще запросить: css-стили, js-скрипты, изображения и аналогично запрашивает их. И так далее...

Ну и вообще, цитата выше, это правда? или просто агитация за ноду?


И правда, и неправда одновременно. Правда в том, что Node действительно так работает. Неправда же заключается в том, что ничто не мешает на Java/C/C#/Go/Python/даже, при большом желании, на php написать приложение, которое будет обрабатывать пользовательские запросы точно так же.
Ответ написан
rework
@rework
Помог ответ? В благодарность отметь его решением
nodeJs не требует отдельного веб сервера, так как имеет свой собственный встроенный.
Ответ написан
sergey-gornostaev
@sergey-gornostaev Куратор тега Java
Седой и строгий
Во-первых, обрабатывает запросы не Node с Java, а сервера.

Нет.

Если создаем на Java, то ставим Nginx + Apache

Нет.

Правильно я думаю?

Нет. Вы абсолютно не представляете о чём пишите.
Ответ написан
Ваш ответ на вопрос

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

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