Введение
Если вы слышали о узле или прочитали некоторые статьи, в которых утверждается, насколько велик узел, вы можете подумать: «Что такое узел?» Хотя не для всех, узел может быть правильным выбором для некоторых людей.
Чтобы попытаться объяснить, что такое node.js, эта статья исследует проблемы, которые она может решить, как это работает, как запустить простое приложение, и, наконец, когда узел и когда не является хорошим решением. Эта статья не охватывает, как написать сложное приложение узла, а также это всеобъемлющее руководство по узлу. Чтение этой статьи должно помочь вам решить, следует ли вы изучить узел, чтобы использовать ее для своего бизнеса.
Какой узел предназначен для решения?
Общедоступная цель Узела - «обеспечить простой способ создать масштабируемые сетевые программы». Каковы проблемы с текущей серверной программой? Давайте сделаем математическую проблему. На таких языках, как Java ™ и PHP, каждое соединение генерирует новый поток, который может потребовать 2 МБ сопутствующей памяти на новую ветку. В системе с 8 ГБ оперативной памяти теоретическое максимальное количество одновременных соединений составляет 4000 пользователей. По мере роста вашей клиентской базы вы хотите, чтобы ваше веб -приложение поддерживало больше пользователей, поэтому вам нужно добавить больше серверов. Конечно, это увеличивает затраты на бизнес, особенно затраты на сервер, затраты на доставку и затраты на рабочую силу. В дополнение к этому увеличению затрат существует техническая проблема: пользователи могут использовать разные серверы для каждого запроса, поэтому любой общий ресурс должен быть обмен всеми серверами. Например, в Java статические переменные и кэши должны быть переданы между JVM на каждом сервере. Это узкое место во всей архитектуре веб -приложений: максимальное количество одновременных соединений, с которыми может обработать сервер.
Решение Узела к этой проблеме состоит в том, чтобы изменить способ подключения подключения к серверу. Каждое соединение создает процесс, который не требует блока сопутствующей памяти, вместо того, чтобы генерировать новый поток ОС для каждого соединения (и распределять на него какую -то сопутствующую память). Узел утверждает, что он никогда не будет тупиться, потому что он вообще не допускает блокировки, и он не будет блокировать вызовы ввода -вывода напрямую. Узел также утверждает, что запуск сервера может поддерживать десятки тысяч параллельных соединений. Фактически, узел изменяет лицо сервера, изменяя узкие места по всей системе с максимального количества соединений на трафик для одной системы.
Теперь, когда у вас есть программа, которая может справиться с десятками тысяч параллельных соединений, что вы на самом деле можете построить с помощью узла? Если у вас есть веб -приложение, которое нужно обрабатывать так много соединений, это было бы «ужасной»! Это «если у вас есть эта проблема, это совсем не проблема». Прежде чем ответить на вопрос выше, давайте посмотрим, как работает узел и как он предназначен для работы.
Узел определенно не
Да, узел - это серверная программа. Тем не менее, это, конечно, не похоже на Apache или Tomcat. Эти серверы являются автономными продуктами сервера, которые позволяют немедленно устанавливать и развернуть приложения. С этими продуктами вы можете получить сервер и работать за одну минуту. Узел, конечно, не такой продукт. Apache может добавить модуль PHP, чтобы позволить разработчикам создавать динамические веб -страницы, и программисты, использующие Tomcat, могут развернуть JSP для создания динамических веб -страниц. Узел, конечно, не этот тип.
На ранних этапах узла (в настоящее время версия 0.4.6) это была не программа «готовый к выбеги», и вы не можете установить его, поместить в него файлы и иметь полностью функциональный веб-сервер. Даже если вы хотите реализовать основную функцию веб -сервера и запустить после завершения установки, много работы все еще требуется.
Как работает узел
Сам узел запускает v8 JavaScript. Подождите, JavaScript на сервере? Правильно, вы читаете это правильно. Сервер Javascript-это относительно новая концепция, упомянутая около двух лет назад при обсуждении продукта Aptana Jaxer на разработчиках (см. Ресурсы). Хотя Jaxer никогда не был действительно популярен, сама концепция не недоступна - почему мы не можем использовать язык программирования, используемый на клиенте на сервере?
Что делает V8? Двигатель JavaScript V8 - это базовый двигатель JavaScript, который использует Google для своего браузера Chrome. Мало кто думает о том, что на самом деле делает JavaScript на клиенте? Фактически, двигатель JavaScript отвечает за интерпретацию и выполнение кода. Используя V8, Google создал сверхбыстрый интерпретатор, написанный в C ++, который имеет еще одну уникальную функцию; Вы можете скачать двигатель и встроить его в любое приложение. Это не ограничивается бегом в одном браузере. Таким образом, Node фактически использует двигатель JavaScript V8, записанный Google, и восстанавливает его для использования на сервере. Слишком идеально! Теперь, когда есть хорошее решение, зачем создавать новый язык?
Программирование, управляемое событиями
Многие программисты обучали их полагать, что объектно-ориентированное программирование является идеальным дизайном программирования и пренебрегает другими методами программирования. Узел использует так называемую модель программирования, управляемую событиями.
Перечисление 1. Программирование, управляемое событиями, используя jQuery на клиенте
Кода -копия выглядит следующим образом:
// код jQuery на стороне клиента, показывающий, как работает программирование, управляемое событиями,
// Когда нажата кнопка, происходит событие - разбирайтесь с ней
// прямо здесь в анонимной функции, где все
// присутствуют необходимые переменные и могут быть направлены напрямую
$ ("#mybutton"). click (function () {
if ($ ("#mytextfield"). val ()! = $ (this) .val ())
Alert («Поле должно соответствовать кнопке текст»);
});
На самом деле, нет разницы между сервером и клиентом. Да, нет никакой работы кнопки, и нет никакого действия, чтобы ввести в текстовое поле, но на более высоком уровне происходит событие. Соединение установлено - событие! Данные получены через соединение - события! Данные останавливаются через соединение - событие!
Почему этот тип настройки идеально подходит для узла? JavaScript-это отличный язык программирования, управляемый событиями, потому что он позволяет анонимные функции и закрытия, и, что более важно, любой, кто написал код, знаком с его синтаксисом. Функция обратного вызова, вызванную, когда происходит событие, может быть написана на событии захвата. Таким образом, код легко писать и поддерживать, без сложных объектно-ориентированных структур, без интерфейсов и без потенциала для чего-либо структурировать на нем. Просто послушайте событие, напишите функцию обратного вызова, а затем программирование, управляемое событиями, позаботится обо всем!
Пример приложения узла
Наконец, давайте посмотрим на какой -то код! Давайте объединим все, что мы обсуждали, и создадим наше первое приложение узла. Поскольку мы уже знаем, что узел идеально подходит для обработки приложений с высоким трафиком, мы создадим очень простое веб -приложение - приложение, созданное для максимальной скорости. Вот конкретные требования для нашего образца приложения, объясненного «Boss»: создайте API RESTFUL REST -Generator случайных чисел. Это приложение должно принять вход: параметр с именем «номер». Затем приложение возвращает случайное число между 0 и параметром и возвращает сгенерированное число в абонента. Поскольку «Босс» хочет, чтобы это было широко популярным приложением, он должен иметь возможность обрабатывать 50 000 одновременных пользователей. Давайте посмотрим на код:
Листинг 2. Узел генератора случайных чисел узел
Кода -копия выглядит следующим образом:
// Эти модули должны быть импортированы, чтобы использовать их.
// Узел имеет несколько модулей. Они как любой #include
// или импортный оператор на других языках
var http = require ("http");
var url = require ("url");
// самая важная строка в любом файле узлов. Эта функция
// делает фактический процесс создания сервера. Технически,
// Узел сообщает базовой операционной системе, что всякий раз, когда
// соединение выполняется, эта конкретная функция обратного вызова должна быть
// выполнено. Поскольку мы создаем веб -сервис с API REST,
// Мы хотим сервер HTTP, который требует переменной HTTP
// Мы создали в линиях выше.
// Наконец, вы можете видеть, что метод обратного вызова получает «запрос»
// и «Ответный» объект автоматически. Это должно быть знакомо
// любому программисту PHP или Java.
http.createserver (function (запрос, ответ) {
// ответ должен обрабатывать все заголовки и коды возврата
// эти типы вещей обрабатываются автоматически в серверных программах
// нравится Apache и Tomcat, но узел требует, чтобы все было сделано самостоятельно
response.writehead (200, {"content-type": "text/plain"});
// Вот какой-то уникальный код. Вот как узел поиск
// Параметры, передаваемые из запросов клиента. Модуль URL
// обрабатывает все эти функции. Функция анализа
// деконструирует URL и помещает значения ключей запроса в
// Запрос объект. Мы можем найти значение для ключа "номер"
// Ссылаясь на это напрямую - красота JavaScript.
var params = url.parse (request.url, true) .query;
var input = params.number;
// это общие методы JavaScript, которые будут создавать
// Наше случайное число, которое возвращается обратно в абонента
var numinput = новый номер (вход);
var NumOutput = новый номер (Math.Random () * numinput) .tofixed (0);
// Написать случайное число в ответ
response.write (numOutput);
// Узел требует, чтобы мы явно закончили это соединение. Это потому, что
// Узел позволяет держать соединение открытым и передавать данные вперед и назад,
// хотя эта продвинутая тема не обсуждается в этой статье.
response.end ();
// Когда мы создаем сервер, мы должны явно подключить HTTP -сервер к
// порт. Стандартный HTTP -порт составляет 80, поэтому мы подключим его к этому.
}). Слушай (80);
// Вывод строки в консоли после запуска сервера, сообщая нам все
// запускается правильно
console.log ("работает генератор случайных чисел ...");
Поместите приведенный выше код в файл с именем "random.js". Теперь, чтобы запустить приложение и запустить его (а затем создать HTTP -сервер и прослушать подключения на порту 80), просто введите следующую команду в вашей командной строке: % node random.js. Вот как это выглядит, когда сервер уже запущен и работает:
Кода -копия выглядит следующим образом:
root@ubuntu:/home/moila/ws/mike# node random.js
Работает генератор случайных чисел ...
Получить доступ к приложению
Приложение работает и работает. Узел прислушивается к любому соединению, давайте проверим его. Поскольку мы создали простой API Restful, мы можем использовать наш веб -браузер для доступа к этому приложению. Введите следующий адрес (убедитесь, что вы выполнили приведенные выше шаги): http: // localhost/? Number = 27.
Окно вашего браузера изменится до случайного числа от 0 до 27. Нажмите кнопку перезагрузки в вашем браузере, и вы получите еще одно случайное число. Вот и все, это ваше первое приложение узла!
Для чего нужен узел?
До сих пор вы должны быть в состоянии ответить на вопрос «Что такое узел», но вы не можете быть ясно, когда вам следует его использовать. Это важный вопрос, который нужно задать, потому что узел хорош для некоторых вещей, но наоборот, узел может быть не хорошим решением для других в данный момент. Вы должны быть осторожны, чтобы решить, когда использовать узел, так как использование его в неправильной ситуации может привести к избыточному кодируемому участку.
Для чего это хорошо?
Как вы видели ранее, Node идеально подходит для ситуаций, когда вы ожидаете иметь высокий трафик, а логика на стороне сервера и требования к обработке не обязательно огромны, прежде чем реагировать на клиента. Типичные примеры выдающейся производительности узла включают:
1. Наибольший API
Веб -сервис, который предоставляет API Restful, получает несколько параметров, анализирует их, объединяет ответ и возвращает ответ (обычно меньше текста) пользователю. Это идеальная ситуация для узла, так как вы можете построить его, чтобы справиться с десятками тысяч соединений. Это еще не требует много логики; Он просто просматривает некоторые значения из базы данных и объединяет ответ. Поскольку ответ представляет собой небольшое количество текста и небольшое количество текста по входящим запросам, трафик не высокий, а машина может справиться даже с потребностями самых оживленных компаний API.
2. Очередь
Представьте себе такую компанию, как Twitter, которая должна получать твиты и написать их в базу данных. Фактически, почти тысячи твитов достигаются в секунду, и база данных невозможно своевременно обрабатывать количество записей, требуемых в пиковые периоды своевременно. Узел стал важной частью решения этой проблемы. Как вы можете видеть, узел может обрабатывать десятки тысяч входящих твитов. Это быстро и легко записывает их в механизм очереди памяти (например, Memcached), где другой отдельный процесс может написать их в базу данных. Роль Узела здесь состоит в том, чтобы быстро собирать твиты и передать эту информацию в другой процесс, ответственный за написание. Представьте себе еще один дизайн - обычный PHP -сервер пытается обрабатывать запись в самой базе данных - каждый твит будет вызывать краткую задержку при записи в базу данных, поскольку вызов базы данных блокирует канал. Из -за задержки базы данных машина, разработанная, подобная этой, может обрабатывать только 2000 входящих твитов в секунду. 1 миллион твитов в секунду требует 500 серверов. Вместо этого узел обрабатывает каждое соединение, не блокируя канал, тем самым захватывая как можно больше твитов. Машина узла, которая может обрабатывать 50 000 твитов, требует всего 20 серверов.
3. Файл -сервер изображения
Компания с большими распределенными веб -сайтами, такими как Facebook или Flickr, может принять решение использовать все машины только для изображений обслуживания. Узел был бы хорошим решением этой проблемы, так как компания может использовать его для написания простого резаверного файла, а затем обработать десятки тысяч соединений. Узел будет искать файл изображения, вернуть файл или ошибку 404, а затем ничего не сделает. Эта настройка позволит таким распределенным веб -сайтам уменьшить количество серверов, которые им необходимы для обслуживания статических файлов, таких как изображения, .js и .css файлы.
Для чего плохо?
Конечно, в некоторых случаях узел не идеален. Вот области, в которых узел не очень хорош:
1. Динамически созданные страницы
В настоящее время Node не предоставляет метод по умолчанию для создания динамических страниц. Например, при использовании технологии Javaserver Pages (JSP) вы можете создать страницу index.jsp, которая содержит цикл в таком фрагменте кода JSP. Узел не поддерживает такие динамические HTML-управляемые страницы. Точно так же узел не очень подходит в качестве веб -сервера, такого как Apache и Tomcat. Поэтому, если вы хотите предоставить такое серверное решение в узле, вы должны написать все решение самостоятельно. Программисты PHP не хотят писать преобразователь PHP для Apache каждый раз, когда они развертывают веб -приложение, и пока это именно то, что узел просит вас сделать.
2. Реляционная база данных тяжелые приложения
Цель узла-быстрая, асинхронная и не блокирующая. Базы данных не обязательно делятся этими целями. Они синхронны и блокируют, потому что вызовы в базе данных во время чтения и записи будут блокировать канал до тех пор, пока результат не будет сгенерирован. Таким образом, веб -приложение, которое требует много вызовов базы данных, много чтения, много записей на запрос, очень не подходит для узла, потому что сама реляционная база данных может компенсировать множество преимуществ узла. (Новая база данных NOSQL более подходит для узла, но это еще одна тема.)
Заключение
Вопрос в том, что такое node.js? » должен был быть ответить. Прочитав эту статью, вы сможете ответить на этот вопрос в нескольких ясных и кратких предложениях. Если это так, вы вышли на передний план многих кодировщиков и программистов. Я говорил о узле со многими людьми, но они были запутаны в том, что такое узел. Понятно, что у них есть мышление Apache - сервер - это приложение, которое вкладывает в него файлы HTML, и все будет работать должным образом. И узел управляется целеустремленным. Это программа, которая использует JavaScript, чтобы позволить программистам легко и быстро создавать быстрые, масштабируемые веб -серверы. Apache готов к запуску, в то время как Node кодирует готов к запуску.
Узел достигает своей цели обеспечения высоко масштабируемого сервера. Вместо того, чтобы выделить модель «один поток на соединение», она использует модель «один процесс на подключение» для создания только памяти, необходимой для каждого соединения. Он использует очень быстрый двигатель JavaScript от Google: двигатель V8. Он использует дизайн, управляемый событиями, чтобы сохранить код минимальным и простым в чтении. Все эти факторы способствуют идеальной цели узла - легче написать очень масштабируемое решение.
Настолько важным, как понимание узла, понимание того, чем он не является. Узел не является заменой Apache, который предназначен для того, чтобы сделать веб -приложения PHP более масштабируемыми. Это действительно так. На этом начальном этапе узла маловероятно, что большое количество программистов будет использовать его, но в сценариях, где он работает, он работает очень хорошо.
Чего я должен ожидать от узла в будущем? Это, пожалуй, самый важный вопрос, который поднимает эта статья. Теперь, когда вы знаете, что он делает сейчас, вам следует удивляться, что он будет делать дальше. В течение следующего года я с нетерпением жду возможности обеспечить лучшую интеграцию с существующими сторонними библиотеками поддержки. Многие сторонние программисты теперь разработали плагины для узла, включая добавление поддержки сервера файловых серверов и поддержку MySQL. Надеемся, что узел начинает интегрировать их в свою основную функциональность. Наконец, я также хочу узел, чтобы поддержать какой -то динамический модуль страниц, чтобы вы могли делать то, что вы делаете в PHP и JSP (возможно, NSP, страница сервера узлов) в файле HTML. Наконец, надеясь, что однажды появится «готовый к развертыванию сервер узлов», который можно загрузить и установить, просто поместите в него свои файлы HTML, точно так же, как использование Apache или Tomcat. Узел все еще находится на начальных этапах, но он развивается очень быстро и вскоре может быть в вашем видении.