Что такого уникального в Node.js? [закрыто]

48

В последнее время было много похвал за Node.js. Я не разработчик, который имел большое влияние на сетевые приложения. Исходя из моего простого понимания Nodes.js, его сила такова: у нас есть только один поток, обрабатывающий несколько соединений, предоставляющий архитектуру на основе событий.

Однако, например, в Java, я могу создать только один поток, используя NIO / AIO (который, как я понимаю, не блокирует API), и обрабатывать несколько соединений, используя этот поток, и я предоставляю архитектуру на основе событий для реализации данных обрабатывать логику (не должно быть так сложно обеспечить обратный вызов и т. д.)

Учитывая, что JVM является более зрелой виртуальной машиной, чем V8 (я ожидаю, что она тоже будет работать быстрее), а архитектуру обработки на основе событий, по-видимому, создать несложно, я не уверен, почему Node.js привлекает так много внимания. Я пропустил некоторые важные моменты?

Адриан Шум
источник
3
Интересно, почему за него проголосовали ... Я чувствую, что этот вопрос - скорее дискуссия по программированию, поэтому я не включил стекпотоки. Я также пытался искать похожие темы, но нашел только информацию о силе Nodes.js, но моя проблема в том, что я не совсем понимаю, почему «сила» настолько уникальна (которую я до сих пор не могу найти)
Адриан Шум
6
Попробуйте реализовать этот шаблон в Java. Это работает, конечно. Но вы увидите одно: это будет очень, очень многословно в Java: вам нужны тонны обратных вызовов, что почти всегда означает создание новых классов. Это может звучать как незначительный придирка, но в большой программе это может стать уродливым и громоздким довольно быстро.
Иоахим Зауэр
6
Обратные вызовы Javascript столь же склонны становиться громоздкими - и такие спагетти гораздо легче отлаживать и реорганизовывать в Java, чем в Javascript IMO.
фанкибро
5
@AdrianShum: это эффект слэшдота, все, что не вписывается в образ мышления группы, будет отвергнуто - как похвала Microsoft за /.
gbjbaanb
3
Я удивлен, что не вижу никого, кто упоминает об этом обмане.
Deadalnix

Ответы:

33

Хотя эта концепция действительно может быть реализована во многих языках (и, как упоминалось в dodgy_coder , она реализована, по крайней мере, в Ruby и Python), она не так тривиальна, как вы заявляете.

Правда, в Java есть неблокирующие IO API. Таким образом, вы можете выполнять необработанный дисковый / сетевой ввод-вывод неблокирующим образом. Однако каждый API, который каким-то образом оборачивает или обрабатывает IO, также должен быть реализован неблокирующим образом. Каждый синтаксический анализатор XML, каждый драйвер базы данных, каждый преобразователь формата файла должны быть написаны для поддержки неблокирующего ввода-вывода. Потому что если в этом шаблоне блокируется одна библиотека, то это снижает производительность ваших серверов до значений каменного века.

Node.js имеет эту библиотечную инфраструктуру, потому что она всегда проектировалась таким образом: каждая библиотека, которая стремится стать популярной , должна предоставлять асинхронный API, иначе она не будет использоваться.

Йоахим Зауэр
источник
18
Ага. Другими словами: самая важная сила Node.js - самая главная слабость ECMAScript: невероятно дрянная стандартная библиотека ECMAScript. Поскольку разработчики Node.js все равно должны были заново изобретать каждое колесо, у них была возможность изобретать его правильно.
Йорг Миттаг
4
Ну, насколько я знаю, ECMAScript всегда разрабатывался как встроенный язык, поэтому не было необходимости в каких-либо API-интерфейсах на уровне ОС (даже сетевой ввод-вывод был в основном абстрагирован). Этот недостаток действительно был преимуществом для Node.js.
Иоахим Зауэр
«Каждая библиотека, которая стремится стать популярной, должна предоставлять асинхронный API, иначе она не будет использоваться». Я думаю, что это именно то, что я ищу. Есть ли какой-нибудь ресурс для изучения того, как асинхронный API-интерфейс предоставляется, например, для разбора XML и доступа к БД, в Node.js?
Адриан Шум
1
@AdrianShum в общем, ищите примеры программирования, управляемого событиями. Конкретные реализации могут быть найдены на многих языках. Помимо модулей Node.js, вы можете посмотреть примеры Twisted в Python, twistedmatrix.com/trac/wiki , примеры POE в Perl, poe.perl.org , а в Ruby есть EventMachine, github.com/eventmachine/eventmachine
mghicks,
19

Вероятно, основная причина в том, что он использует JavaScript для написания серверных компонентов для таких вещей, как веб-серверы, веб-приложения или веб-сервисы. Это объединяет традиционный внешний (клиентский) язык разработки JavaScript с серверным языком.

Вы правы - тот факт, что он неблокирующий, использование шаблона реактора не уникально - это было сделано до использования других языков и сред, таких как, например, Ruby EventMachine или Python Twisted.

dodgy_coder
источник
5
очень немногие технологии имеют действительно уникальные особенности, уникальность заключается в их особой комбинации всех их функций
jk.
1
Согласен, здесь есть список библиотек, которые поддерживают его на всех основных языках ... Шаблон Reactor в Википедии
dodgy_coder
10

Три основные причины, которые я бы назвал:

  1. Неблокирующий ввод-вывод / асинхронный ввод-вывод. Это хэшируется везде в сети и на предыдущих постерах. Я хотел бы внести свой вклад в то, что разработка вашего кода с явным предположением асинхронного поведения помогает механизму компилятора максимизировать аппаратное обеспечение. Да, многие из JIT-компиляторов и процессоров гиперпоточности берут синхронный код и помогают распараллелить выполнение. Это, конечно, наилучший подход. Напротив, явно создавая приложение для async io, вы гарантируете, что движок и оборудование могут максимизировать время выполнения вашего кода. По общему признанию, у меня нет поддающихся количественной оценке данных, чтобы доказать это, но я чувствую тепло внутри, чтобы думать таким образом.

  2. Единая база кода для клиента и сервера. Это имеет ряд преимуществ: помогает оптимизировать затраты на центры обработки данных, поскольку позволяет переносить бизнес-логику с сервера на клиент; помочь повторно использовать бизнес-логику / проверку данных; уменьшите сложность навыков разработчика, которые должны существовать для поддержки продукта (по сравнению с Python и javascript).

  3. Низкий барьер для входа. Во многих отношениях Javascirpt похож на Basic, Pascal и Perl прошлого года. Начать писать код очень просто, и для этого не требуется много знаний предметной области. Это также помогает снизить ваши затраты на разработку благодаря возможности привлекать больше разработчиков-младших и ускорить реализацию проекта. [Конечно, вам нужно обойти идеологов, которые считают, что языки программирования должны быть трудными для того, чтобы отсеять низко функционирующих разработчиков]

cflat
источник
Я не уверен, что рекомендую создавать команду Node полностью с младшим. JS Devs. Архитектура - это не то, о чем мы должны думать в большем количестве jr-классов веб / UI-проектов, и JS требуется столько же времени, чтобы действительно хорошо разбираться в построении в течение длительного времени, как любой другой язык, даже если вы можете получить результаты относительно Быстро на более низком уровне опыта в менее сложных проектах, чем обычно.
Эрик Реппен
Я согласен с @ErikReppen; Команда архитекторов, полностью состоящая из младших разработчиков (независимо от языка), похожа на проектирование и строительство дома, полностью используя плотников, которые хорошо умеют строить стулья, столы и собачьи будки.
Wildcard