Вступление
Эта статья вдохновлена тем, что пишут приложения хост-узла Tomasz на IIS, в которых рассказывается о преимуществах запуска Node.js на сервере Windows через iisnode. В этой статье я хотел сосредоточиться на предоставлении ему цвета Windows Azure и перечислить преимущества запуска Node.js на облачной платформе Microsoft. Некоторые из этих преимуществ уникальны для Windows Azure, а другие применимы как для локальной Windows, так и для Windows Azure. Этот пост предназначен для разработчиков Node.js, которые не знакомы с запуском программ для узлов в Windows Azure. Основы разработки Node.js в Windows Azure можно узнать по адресу http://www.windowsazure.com/en-us/develop/nodejs/ .
Node.JS Архитектура развертывания в Windows Azure и режим ядра Буферизация HTTP-запросов
Iisnode — это включающий компонент, который связывает http.sys (прослушиватель HTTP режима ядра) в Windows с коллекцией процессов Node.exe через именованные каналы. Во время выполнения веб-роль Windows Azure преобразуется в экземпляр Windows Server и, следовательно, использует тот же iisnode для включения автоматического запуска приложений Node в Windows Azure.
Когда веб-сайт Node.js получает запрос на веб-страницу, iisnode запускает процесс Node.exe. Если это еще не сделано, он отправит запрос http через именованный канал. Node.exe обработает соответствующий файл JavaScript и отправит ответ обратно в веб-браузер через iisnode и http.sys. Когда запрос поступает в экземпляр службы Azure, http.sys объединяет их в буфер запроса режима ядра, а затем направляет их в экземпляр node.exe.
Поскольку сам node.js не выполняет буферизацию, архитектура буферизации запросов http.sys поможет уменьшить количество ошибок сервера на веб-сайтах с большим трафиком. Следующая схема показывает архитектуру обработки запросов Node.js с буферизацией http.sys.
Приведенная выше диаграмма представляет собой объединение статических и динамических архитектурных представлений, которые могут запутать некоторых; надеюсь, он передает суть потока обработки запросов Node.js.
Iisnode очень специфичен для Windows и Windows Azure. Он сочетает в себе преимущества кластера , супервизора , инспектора узлов , навсегда и статического узла [источник: блог Томаша Янчука ]. Iisnode упрощает настройку сценариев масштабирования и масштабирования в Windows по сравнению с платформами, отличными от Windows.
Node.JS Масштабируемость в Windows Azure
Масштабирование: Iisnode в Windows Azure порождает несколько процессов Node.exe на веб-сайтах с высоким трафиком автоматически. Это позволяет Node.JS использовать преимущества нескольких ядер в веб-роли, которые могут варьироваться от 1 ядра (маленький экземпляр) до 8 ядер (очень большой экземпляр), что позволяет масштабировать веб-приложение в данном экземпляре службы. На следующей диаграмме показано, что Iisnode породил 4 экземпляра Node.exe в 4-ядерном экземпляре службы Windows Azure:
Без iisnode в Azure необходимо использовать модуль Node, такой как «cluster», и писать код для разветвления дочерних процессов и управления экосистемой «главный / рабочий». Однако «основной» процесс может быть единственной точкой отказа — если мастер отключается, в конечном итоге потребуется ручное вмешательство, чтобы привести главный процесс и рабочие процессы к уровню, который соответствует количеству ядер.
Iisnode в Azure управляет рабочими процессами узла на основе количества экземпляров, заданного в файле конфигурации узла. Сам Iisnode управляется IIS, за которым, в свою очередь, следит ОС Windows. Следовательно, будет меньше возможностей для систематического сбоя обработки Node.js. По сути, с iisnode вам не нужен mater-процесс и вам не нужно писать код для разветвления и управления дочерними процессами.
Масштабирование : Windows Azure позволяет веб-приложениям Node.js автоматически масштабироваться по мере необходимости до веб-фермы из сотен экземпляров службы Azure. Это можно сделать с помощью простых изменений конфигурации службы, как показано ниже:
<?xml version="1.0" encoding="utf-16"?> <ServiceConfiguration> <Role name="Node_JS_WebRole"> <Instances count="4" /> <Certificates /> </Role> </ServiceConfiguration>
После того как указанные выше изменения конфигурации сохранены на портале Azure.com для приложения Node, контроллер фабрики Azure автоматически порождает экземпляры службы, так что окончательное число соответствует номеру, указанному в конфигурации. Windows Azure также предоставляет API-интерфейсы управления службами для сценариев автоматического масштабирования аспектов развертывания.
На приведенной выше диаграмме показано, что каждый большой экземпляр роли (4 ядра) охватывает 4 экземпляра Node.exe, и 4 таких экземпляра автоматически добавляются в балансировщик нагрузки с помощью Windows Azure Fabric Controller. Внутри данного экземпляра роли Azure трафик Http в коллекцию процессов Node.exe управляется iisnode посредством балансировки нагрузки.
Гибкость разработки с управляемыми сервисами
Легко разрабатывайте Node.js-решения на базе NoSQL
Windows Azure предлагает Azure Tables — базу данных NoSQL в качестве службы. Поскольку возможности Azure Table являются управляемой службой, разработчику не нужно беспокоиться о физической настройке базы данных NoSQL с учетом доступности, масштабируемости, работы в сети, резервного копирования и восстановления. Разработчики могут сразу начать работать с помощью привязок JavaScript, доступных как часть Azure NPM, для выполнения операций над таблицами Azure. Ниже приведен отрывок примера доступа к таблицам Azure в Node.JS из Службы программирования таблиц хранения в Node.Js :
var tableService = azure.createTableService(); var tableName = 'tasktable'; http.createServer(function serverCreated(req, res) { tableService.createTableIfNotExists(tableName, tableCreatedOrExists); function tableCreatedOrExists(error) { res.writeHead(200, { 'Content-Type': 'text/plain' }); if (error === null){ res.write('Using table ' + tableName + '\r\n'); res.end(); } else { res.end('Could not use table: ' + error.Code); } } }).listen(port);
Легко разрабатывайте распределенные облачные решения Node.JS в Windows Azure.
Windows Azure NPM содержит привязки Node.js для создания приложений, ориентированных на сообщения, с использованием очередей служебной шины. Поскольку Service Bus является управляемой службой, разработчикам не нужно беспокоиться о настройке инфраструктуры, кластеризации и любых других сетевых конфигурациях. Разработчикам просто необходимо создать пространство имен служебной шины и начать использовать службу для интеграции с другими приложениями и службами в слабосвязанной форме.
Разработчики Node.JS часто борются с такими библиотеками, как ZeroMQ, за типы интеграции, показанные выше. Хранилище служебной шины и очереди Azure может освободить разработчиков от сложности разработки на стороне клиента, а также от управления инфраструктурой на стороне сервера.
Ниже приведен пример кода: [источник: поддержка служебной шины в Azure npm 0.5.2 ]
var serviceBusService = azure.createServiceBusService(); serviceBusService.createQueueIfNotExists('taskqueue', function(error, created){ if(!created){ // Queue exists } });
Вот как вы отправляете сообщение с определенной темой [источник: http://codebetter.com/glennblock/2012/02/14/servicebus-support-in-azure-npm-0-5-2/]
var serviceBusService = azure.createServiceBusService(); serviceBusService.sendTopicMessage('taskdiscussion', 'Hello world!', function(error){ if(!error){ // Message sent } });
И, наконец, вот как вы опрашиваете очередь на наличие сообщения.
var serviceBusService = azure.createServiceBusService(), topic = 'taskdiscussion', subscription = 'client1'; serviceBusService.createSubscription(topic, subscription, function(error1){ if(!error1){ // Subscription created serviceBusService.receiveSubscriptionMessage(topic, subscription, function(error2, serverMessage){ if(!error2){ // Process message } }); } });
Поддерживает гетерогенные среды приложений
Node.JS в Windows Azure может работать параллельно с ASP.NET, PHP, RAILS и любыми другими средами серверов приложений, которые программист желает использовать для доставки полного приложения. Iisnode будет в пути выполнения только для предварительно настроенных файлов .js. Остальная часть контента будет обходить iisnode и, следовательно, может мирно сосуществовать на одном виртуальном сервере. Давайте проиллюстрируем это на простом примере. В данном виртуальном каталоге у меня есть webform.aspx, clientutil.js и productservice.js.
Следующий простой файл web.config гарантирует, что productservice.js будет обрабатываться Node.exe, а webform.aspx — через механизм asp.net на сервере. ClientUtil.js будет обрабатываться IIS как клиентский JavaScript и, следовательно, передает его как файл сценария.
//web.config file that maps .js files to node.exe <configuration> <system.webServer> <handlers> <add name="iisnode" path="productservice.js" verb="*" modules="iisnode" /> </handlers> </system.webServer> </configuration>
Управление и Операции
Несколько Node.JS Сред
Windows Azure автоматически поддерживает пару сред для каждого экземпляра службы Azure, в которой размещено приложение Node.js — подготовка и производство. После развертывания и тестирования приложения Node в промежуточной среде простой обмен виртуальными IP-адресами сделает его доступным в производственной среде. Конечно, необходимо убедиться, что любые зависимости, такие как базы данных, также переключаются на производственные среды перед таким VIP-обменом.
Многие реальные приложения требуют более двух сред; Azure позволяет создавать несколько экземпляров службы Azure и при необходимости перемещать развертывание из одной среды в другую. Вот схема, которая дает представление о типичной среде развертывания Node.js в Azure:
Windows Azure позволяет создавать несколько экземпляров службы, которые представляют типичную среду ALM. На приведенной выше диаграмме в Azure определены 3 экземпляра службы. Каждый экземпляр службы будет иметь промежуточную и производственную среду, между которыми можно переключать развертывания одним движением переключателя. Среди многих облачных платформ это уникально для Windows Azure; эта настройка позволяет развернуть сборку с ошибками регрессии путем простой замены IP-адреса. Несколько экземпляров службы позволяют разработчику изолировать зависимости приложений, что позволяет упростить управление конфигурацией.
Автоматическое обновление
Iisnode в Azure автоматически управляет жизненным циклом процесса Node.exe во время обновления кода. Если модуль JavaScript изменяется, iisnode позволяет обслуживать текущие запросы из существующих экземпляров Node.exe, в то время как он перенаправляет новые запросы во вновь созданный процесс Node.exe. Старые процессы в конечном итоге будут уничтожены, когда больше не будет запросов в полете.
Без iisnode нужно использовать такой Node-модуль, как supervisor, который отслеживает список файлов .js. Если файл JavaScript должен был измениться, супервизор убивает текущий процесс и перезапускает его для выполнения измененного кода. Чтобы получить то же поведение, что и в автоматическом управлении процессами Windows Azure с помощью iisnode, необходимо сочетание «кластер» и «супервизор». Кластер и супервизор создают два дополнительных процесса для управления трафиком и мониторинга изменений файлов, что добавляет дополнительные точки отказа.
Supportability
Отладка удаленного сервера часто включает запись console.log в stdout и / или stderr. Iisnode в Azure перенаправляет эти журналы в файл, к которому можно получить доступ как к обычным текстовым файлам. Это может быть включено с помощью простой конфигурации; iisnode создает специальный каталог для каждого файла .js и может скрывать файлы, чтобы скрыть их от посторонних глаз. Защита файлов журналов с помощью традиционной интернет-безопасности является ключом для предотвращения несанкционированного доступа к этим файлам журналов. Для доступа к журналу через http дополнительные модули NPM не требуются.
Доступ к файлу журнала Node.js в других операционных системах потребует дополнительных модулей NPM, таких как log.io, чтобы упростить доступ к файлу журнала, когда у вас нет доступа к серверу через удаленный рабочий стол или SSH.
Отладка нулевой настройки через нод-инспектор
Отладка приложений JavaScript требует ручного запуска процесса инспектора узлов перед отладкой логики приложения в ОС, отличной от Windows. В Windows Azure и Windows OS при установке iisnode автоматически устанавливается инспектор узлов. Доступ к отладчику отладки (например, http: // <dnsname> /server.js/debug) для данного файла .js автоматически запустит прослушиватель отладки инспектора узла, который позволяет устанавливать точки останова в веб-браузере с поддержкой WebKit.
Как только сеанс отладки подготовлен таким образом, последующая отладка приложения может начаться с обращения к соответствующему файлу .js в другом окне браузера. Как упоминалось выше, отладка Windows Azure с помощью инспектора узлов может быть выполнена в любом веб-браузере с поддержкой webkit, включая Google Chrome и FireFox. Пошаговое руководство по отладке приложений Node.js в Windows можно найти по адресу: http://tomasz.janczuk.org/2011/11/debug-nodejs-applications-on-windows.html .