В последнее время было много похвал за Node.js. Я не разработчик, который имел большое влияние на сетевые приложения. Исходя из моего простого понимания Nodes.js, его сила такова: у нас есть только один поток, обрабатывающий несколько соединений, предоставляющий архитектуру на основе событий.
Однако, например, в Java, я могу создать только один поток, используя NIO / AIO (который, как я понимаю, не блокирует API), и обрабатывать несколько соединений, используя этот поток, и я предоставляю архитектуру на основе событий для реализации данных обрабатывать логику (не должно быть так сложно обеспечить обратный вызов и т. д.)
Учитывая, что JVM является более зрелой виртуальной машиной, чем V8 (я ожидаю, что она тоже будет работать быстрее), а архитектуру обработки на основе событий, по-видимому, создать несложно, я не уверен, почему Node.js привлекает так много внимания. Я пропустил некоторые важные моменты?
источник
Ответы:
Хотя эта концепция действительно может быть реализована во многих языках (и, как упоминалось в dodgy_coder , она реализована, по крайней мере, в Ruby и Python), она не так тривиальна, как вы заявляете.
Правда, в Java есть неблокирующие IO API. Таким образом, вы можете выполнять необработанный дисковый / сетевой ввод-вывод неблокирующим образом. Однако каждый API, который каким-то образом оборачивает или обрабатывает IO, также должен быть реализован неблокирующим образом. Каждый синтаксический анализатор XML, каждый драйвер базы данных, каждый преобразователь формата файла должны быть написаны для поддержки неблокирующего ввода-вывода. Потому что если в этом шаблоне блокируется одна библиотека, то это снижает производительность ваших серверов до значений каменного века.
Node.js имеет эту библиотечную инфраструктуру, потому что она всегда проектировалась таким образом: каждая библиотека, которая стремится стать популярной , должна предоставлять асинхронный API, иначе она не будет использоваться.
источник
Вероятно, основная причина в том, что он использует JavaScript для написания серверных компонентов для таких вещей, как веб-серверы, веб-приложения или веб-сервисы. Это объединяет традиционный внешний (клиентский) язык разработки JavaScript с серверным языком.
Вы правы - тот факт, что он неблокирующий, использование шаблона реактора не уникально - это было сделано до использования других языков и сред, таких как, например, Ruby EventMachine или Python Twisted.
источник
Три основные причины, которые я бы назвал:
Неблокирующий ввод-вывод / асинхронный ввод-вывод. Это хэшируется везде в сети и на предыдущих постерах. Я хотел бы внести свой вклад в то, что разработка вашего кода с явным предположением асинхронного поведения помогает механизму компилятора максимизировать аппаратное обеспечение. Да, многие из JIT-компиляторов и процессоров гиперпоточности берут синхронный код и помогают распараллелить выполнение. Это, конечно, наилучший подход. Напротив, явно создавая приложение для async io, вы гарантируете, что движок и оборудование могут максимизировать время выполнения вашего кода. По общему признанию, у меня нет поддающихся количественной оценке данных, чтобы доказать это, но я чувствую тепло внутри, чтобы думать таким образом.
Единая база кода для клиента и сервера. Это имеет ряд преимуществ: помогает оптимизировать затраты на центры обработки данных, поскольку позволяет переносить бизнес-логику с сервера на клиент; помочь повторно использовать бизнес-логику / проверку данных; уменьшите сложность навыков разработчика, которые должны существовать для поддержки продукта (по сравнению с Python и javascript).
Низкий барьер для входа. Во многих отношениях Javascirpt похож на Basic, Pascal и Perl прошлого года. Начать писать код очень просто, и для этого не требуется много знаний предметной области. Это также помогает снизить ваши затраты на разработку благодаря возможности привлекать больше разработчиков-младших и ускорить реализацию проекта. [Конечно, вам нужно обойти идеологов, которые считают, что языки программирования должны быть трудными для того, чтобы отсеять низко функционирующих разработчиков]
источник