SlideShare une entreprise Scribd logo
1  sur  21
Node.js Асинхронный веб сервер с неблокирующим I/O
Что такое Node.js 1) V8 - компилируемый JavaScript движок от Google 2) Event-loop c неблокирующим вводом/выводом 3) Модульная система CommonJS
Философия Основная философия Node.js - асинхронное выполнение. Скрипты в Node не дожидаются завершения длительных операций, они оставляют callback, который будет выполнен позже. При этом возврат в цикл обработки событий происходит как можно скорее. 
Блокировка программы при обращении к диску / сети RAM: ~80 наносекунд HDD: ~130 000 наносекунд Сеть: ~500 000 наносекунд Это время можно было бы использовать с большей эффективностью
Асинхронный Ввод/Вывод (nonblocking I/O) 1) Как мы привыкли писать код на сервере: $result = $db->query(' ... '); // Запрос или, как бы  это выглядело на JS: var result = db.query(' ... '); // Запрос - Что происходит пока выполняется запрос к БД? Приложение простаивает -
Асинхронный Ввод/Вывод (nonblocking I/O) 2) Как мы пишем  асинхронный код : db.query(' ... ', function(result) {  // Запрос      // Обработчик }); - Что происходит пока выполняется запрос к БД? Приложение обслуживает следующего пользователя -
Современные вэб сервера используют многопоточность, Но разве это лучший подход? Давайте сравним Apache и Nginx
Apache использует многопоточность, Проблема в том, что при увеличении числа пользователей, потоков становится слишком много.
Переключение между потоками - ресурсоёмкая операция. Каждый поток потребляет оперативную память. Node.js также как и Nginx использует event-loop c неблокирующим вводом выводом. Пользователи обслуживаются по очереди в порядке поступления, однако, например если пользователю нужно обратиться к диску, то пока производится чтение с диска, обслуживается следующий пользователь. Event-loop
Event-loop Таким образом приложение не простаивает, и обслуживает пользователей максимально эффективно!
Почему JavaScript? Node.js - не первый проект призванный облегчить написание неболкирующих приложений, для Python есть Twisted и Tornado, для Ruby есть EventMachine Но событийно управляемый ввод/вывод является достаточно фундаментальным сдвигом, который требует глубокой интеграции с языком программирования.  Javascript - событийно-управляемый язык, так как своими корнями уходит в браузер.
Почему JavaScript? Кроме того, JavaScript очень гибкий язык, пример сервера с помощью (fab)
Система событий Стандартные библиотеки принимают callback в качестве параметра, и передают ему два аргумента, error и data. Это простая и прозрачная структура, однако она может быть изменена сторонними библиотеками.
Система событий Так-же вы можете использовать Promises: var  file  =  fs. open ( 'file' ) ;  file. addCallback ( function ( data ){   // Сделать что нибудь с данными   }) ;    file. addErrback ( 'error' ,   function ( error ){   // Если пришла ошибка, тоже что нибудь сделать   }) ; Просто подключив модуль node_promise
Система модулей 1) Система модулей создана по стандарту CommonJS      (Многие CommonJS модули можно использовать в Node) 2) Кеширование модулей      (один и тот же код дважды не компилируется) 3) Модули не привязаны к языку на котором они написаны      (Модуль написанный на С/С++ подключается так-же как и JS модуль)
Внутренние модули Пример подключения: var module_name = require('module_name'); Физически модуль может находиться по одному из следующих адресов: /home/user/.node_libraries/ /home/user/.node_libraries/module_name /usr/local/lib/node/libraries/ /usr/local/lib/node/libraries/module_name
Внешние модули Пример подключения: var module_name = require('./module_name'); //Указан абсолютный или относительный путь к модулю Физически модуль может находиться по одному из следующих адресов: ./ ./module_name
Модули на С++ Компилируются в бинарный файл с расширением .node, и подключаются как обычные внутренние или внешние модули. Так как из С++ API V8 доступны практически все возможности JavaScript почти любой модуль модет быть в последствии переписан на С++ Это  позволяет сначала писать весь проект на JavaScript, a потом при необходимости переписывать узкие места на С++.
Пример успешного использования Node.JS Plurk: более 200 000 одновременных соединений 1 сервер 8 экземпляров Node 32 гб памяти
Системы пакетов: Не смотря на молодость проекта, для него уже есть более 150 разных модулей (список:  http://wiki.github.com/ry/node/modules ) Поэтому появилось несколько менеджеров пакетов, позволяющих не заботиться о связях и обновлении установленных модулей, самые популярные из них:   - kiwi   - seed   - npm   - mode
“ two languages will never go away, C and JavaScript. ”  - Ryan Dahl (создатель nodeJS) Спасибо за внимание!

Contenu connexe

Tendances

Конструктор / Денис Паясь (Яндекс)
Конструктор / Денис Паясь (Яндекс)Конструктор / Денис Паясь (Яндекс)
Конструктор / Денис Паясь (Яндекс)Ontico
 
Процесс разработки и тестирования с Docker + gitlab ci
Процесс разработки и тестирования с  Docker + gitlab ciПроцесс разработки и тестирования с  Docker + gitlab ci
Процесс разработки и тестирования с Docker + gitlab ciАлександр Сигачев
 
Артём Ерошенко «Рецепт приготовления облачных тестингов»
Артём Ерошенко «Рецепт приготовления облачных тестингов»Артём Ерошенко «Рецепт приготовления облачных тестингов»
Артём Ерошенко «Рецепт приготовления облачных тестингов»WrikeTechClub
 
Maven как средство сборки проекта
Maven как средство сборки проектаMaven как средство сборки проекта
Maven как средство сборки проектаYova Stoika
 
Первые шаги с RabbitMQ
Первые шаги с RabbitMQПервые шаги с RabbitMQ
Первые шаги с RabbitMQAlexander Svetkin
 
Михаил Боднарчук "Docker для PHP разработчиков"
Михаил Боднарчук "Docker для PHP разработчиков" Михаил Боднарчук "Docker для PHP разработчиков"
Михаил Боднарчук "Docker для PHP разработчиков" Fwdays
 
Архитектура растущего проекта на примере ВКонтакте / Алексей Акулович (ВКонт...
 Архитектура растущего проекта на примере ВКонтакте / Алексей Акулович (ВКонт... Архитектура растущего проекта на примере ВКонтакте / Алексей Акулович (ВКонт...
Архитектура растущего проекта на примере ВКонтакте / Алексей Акулович (ВКонт...Ontico
 
Docker integration into Badoo
Docker integration into BadooDocker integration into Badoo
Docker integration into BadooAnton Turetsky
 
Обзор Linux Control Groups
Обзор Linux Control GroupsОбзор Linux Control Groups
Обзор Linux Control GroupsOSLL
 
Автоматизация тестирования клиентской производительности / Николай Лавлинский...
Автоматизация тестирования клиентской производительности / Николай Лавлинский...Автоматизация тестирования клиентской производительности / Николай Лавлинский...
Автоматизация тестирования клиентской производительности / Николай Лавлинский...Ontico
 
Олег Бартунов и Иван Панченко
Олег Бартунов и Иван ПанченкоОлег Бартунов и Иван Панченко
Олег Бартунов и Иван ПанченкоCodeFest
 
Кит на службе у человека microPaaS Deis / Алексей Медведчиков (2ГИС)
Кит на службе у человека microPaaS Deis / Алексей Медведчиков (2ГИС)Кит на службе у человека microPaaS Deis / Алексей Медведчиков (2ГИС)
Кит на службе у человека microPaaS Deis / Алексей Медведчиков (2ГИС)Ontico
 
Эволюция php code coverage в Badoo. Доклад Ильи Агеева на LoveQA РИТ.
Эволюция php code coverage в Badoo. Доклад Ильи Агеева на LoveQA РИТ.Эволюция php code coverage в Badoo. Доклад Ильи Агеева на LoveQA РИТ.
Эволюция php code coverage в Badoo. Доклад Ильи Агеева на LoveQA РИТ.Badoo Development
 
Движение по хрупкому дну / Сергей Караткевич (servers.ru)
Движение по хрупкому дну / Сергей Караткевич (servers.ru)Движение по хрупкому дну / Сергей Караткевич (servers.ru)
Движение по хрупкому дну / Сергей Караткевич (servers.ru)Ontico
 
Dump-IT Загрузка и инициализация JavaScript
Dump-IT Загрузка и инициализация JavaScriptDump-IT Загрузка и инициализация JavaScript
Dump-IT Загрузка и инициализация JavaScriptMikhail Davydov
 
ASP.Net Core
ASP.Net CoreASP.Net Core
ASP.Net CoreArturDr
 
Доклад "Docker в Badoo: от восторгов к внедрению" на DevOps Meetup
Доклад "Docker в Badoo: от восторгов к внедрению" на DevOps MeetupДоклад "Docker в Badoo: от восторгов к внедрению" на DevOps Meetup
Доклад "Docker в Badoo: от восторгов к внедрению" на DevOps MeetupBadoo Development
 
My talk on Docker from Moscow Django Meetup #25
My talk on Docker from Moscow Django Meetup #25My talk on Docker from Moscow Django Meetup #25
My talk on Docker from Moscow Django Meetup #25Alex Chistyakov
 
Абак Пресс
Абак ПрессАбак Пресс
Абак Прессit-people
 

Tendances (20)

Конструктор / Денис Паясь (Яндекс)
Конструктор / Денис Паясь (Яндекс)Конструктор / Денис Паясь (Яндекс)
Конструктор / Денис Паясь (Яндекс)
 
Процесс разработки и тестирования с Docker + gitlab ci
Процесс разработки и тестирования с  Docker + gitlab ciПроцесс разработки и тестирования с  Docker + gitlab ci
Процесс разработки и тестирования с Docker + gitlab ci
 
Артём Ерошенко «Рецепт приготовления облачных тестингов»
Артём Ерошенко «Рецепт приготовления облачных тестингов»Артём Ерошенко «Рецепт приготовления облачных тестингов»
Артём Ерошенко «Рецепт приготовления облачных тестингов»
 
Maven как средство сборки проекта
Maven как средство сборки проектаMaven как средство сборки проекта
Maven как средство сборки проекта
 
Первые шаги с RabbitMQ
Первые шаги с RabbitMQПервые шаги с RabbitMQ
Первые шаги с RabbitMQ
 
Михаил Боднарчук "Docker для PHP разработчиков"
Михаил Боднарчук "Docker для PHP разработчиков" Михаил Боднарчук "Docker для PHP разработчиков"
Михаил Боднарчук "Docker для PHP разработчиков"
 
Применяем Ansible
Применяем AnsibleПрименяем Ansible
Применяем Ansible
 
Архитектура растущего проекта на примере ВКонтакте / Алексей Акулович (ВКонт...
 Архитектура растущего проекта на примере ВКонтакте / Алексей Акулович (ВКонт... Архитектура растущего проекта на примере ВКонтакте / Алексей Акулович (ВКонт...
Архитектура растущего проекта на примере ВКонтакте / Алексей Акулович (ВКонт...
 
Docker integration into Badoo
Docker integration into BadooDocker integration into Badoo
Docker integration into Badoo
 
Обзор Linux Control Groups
Обзор Linux Control GroupsОбзор Linux Control Groups
Обзор Linux Control Groups
 
Автоматизация тестирования клиентской производительности / Николай Лавлинский...
Автоматизация тестирования клиентской производительности / Николай Лавлинский...Автоматизация тестирования клиентской производительности / Николай Лавлинский...
Автоматизация тестирования клиентской производительности / Николай Лавлинский...
 
Олег Бартунов и Иван Панченко
Олег Бартунов и Иван ПанченкоОлег Бартунов и Иван Панченко
Олег Бартунов и Иван Панченко
 
Кит на службе у человека microPaaS Deis / Алексей Медведчиков (2ГИС)
Кит на службе у человека microPaaS Deis / Алексей Медведчиков (2ГИС)Кит на службе у человека microPaaS Deis / Алексей Медведчиков (2ГИС)
Кит на службе у человека microPaaS Deis / Алексей Медведчиков (2ГИС)
 
Эволюция php code coverage в Badoo. Доклад Ильи Агеева на LoveQA РИТ.
Эволюция php code coverage в Badoo. Доклад Ильи Агеева на LoveQA РИТ.Эволюция php code coverage в Badoo. Доклад Ильи Агеева на LoveQA РИТ.
Эволюция php code coverage в Badoo. Доклад Ильи Агеева на LoveQA РИТ.
 
Движение по хрупкому дну / Сергей Караткевич (servers.ru)
Движение по хрупкому дну / Сергей Караткевич (servers.ru)Движение по хрупкому дну / Сергей Караткевич (servers.ru)
Движение по хрупкому дну / Сергей Караткевич (servers.ru)
 
Dump-IT Загрузка и инициализация JavaScript
Dump-IT Загрузка и инициализация JavaScriptDump-IT Загрузка и инициализация JavaScript
Dump-IT Загрузка и инициализация JavaScript
 
ASP.Net Core
ASP.Net CoreASP.Net Core
ASP.Net Core
 
Доклад "Docker в Badoo: от восторгов к внедрению" на DevOps Meetup
Доклад "Docker в Badoo: от восторгов к внедрению" на DevOps MeetupДоклад "Docker в Badoo: от восторгов к внедрению" на DevOps Meetup
Доклад "Docker в Badoo: от восторгов к внедрению" на DevOps Meetup
 
My talk on Docker from Moscow Django Meetup #25
My talk on Docker from Moscow Django Meetup #25My talk on Docker from Moscow Django Meetup #25
My talk on Docker from Moscow Django Meetup #25
 
Абак Пресс
Абак ПрессАбак Пресс
Абак Пресс
 

En vedette

AllcountJS VTB24 loan сonveyor POC
AllcountJS VTB24 loan сonveyor POCAllcountJS VTB24 loan сonveyor POC
AllcountJS VTB24 loan сonveyor POCPavel Tiunov
 
Web В РЕАЛЬНОМ ВРЕМЕНИ С Node.js - AgileBaseCamp - 2012
Web В РЕАЛЬНОМ ВРЕМЕНИ С Node.js - AgileBaseCamp - 2012Web В РЕАЛЬНОМ ВРЕМЕНИ С Node.js - AgileBaseCamp - 2012
Web В РЕАЛЬНОМ ВРЕМЕНИ С Node.js - AgileBaseCamp - 2012Dmytro Mindra
 
Moscow js node.js enterprise development
Moscow js node.js enterprise developmentMoscow js node.js enterprise development
Moscow js node.js enterprise developmentPavel Tiunov
 
Learn Developing REST API in Node.js using LoopBack Framework
Learn Developing REST API  in Node.js using LoopBack FrameworkLearn Developing REST API  in Node.js using LoopBack Framework
Learn Developing REST API in Node.js using LoopBack FrameworkMarudi Subakti
 
Use Node.js to create a REST API
Use Node.js to create a REST APIUse Node.js to create a REST API
Use Node.js to create a REST APIFabien Vauchelles
 
ВВЕДЕНИЕ В NODE.JS
ВВЕДЕНИЕ В NODE.JS ВВЕДЕНИЕ В NODE.JS
ВВЕДЕНИЕ В NODE.JS Pavel Tsukanov
 
Introduction to REST API with Node.js
Introduction to REST API with Node.jsIntroduction to REST API with Node.js
Introduction to REST API with Node.jsYoann Gotthilf
 
Архитектура программных систем на Node.js
Архитектура программных систем на Node.jsАрхитектура программных систем на Node.js
Архитектура программных систем на Node.jsTimur Shemsedinov
 
Асинхронность и параллелизм в Node.js
Асинхронность и параллелизм в Node.jsАсинхронность и параллелизм в Node.js
Асинхронность и параллелизм в Node.jsGeeksLab Odessa
 
Developing and Testing a MongoDB and Node.js REST API
Developing and Testing a MongoDB and Node.js REST APIDeveloping and Testing a MongoDB and Node.js REST API
Developing and Testing a MongoDB and Node.js REST APIAll Things Open
 
Anatomy of a Modern Node.js Application Architecture
Anatomy of a Modern Node.js Application Architecture Anatomy of a Modern Node.js Application Architecture
Anatomy of a Modern Node.js Application Architecture AppDynamics
 

En vedette (11)

AllcountJS VTB24 loan сonveyor POC
AllcountJS VTB24 loan сonveyor POCAllcountJS VTB24 loan сonveyor POC
AllcountJS VTB24 loan сonveyor POC
 
Web В РЕАЛЬНОМ ВРЕМЕНИ С Node.js - AgileBaseCamp - 2012
Web В РЕАЛЬНОМ ВРЕМЕНИ С Node.js - AgileBaseCamp - 2012Web В РЕАЛЬНОМ ВРЕМЕНИ С Node.js - AgileBaseCamp - 2012
Web В РЕАЛЬНОМ ВРЕМЕНИ С Node.js - AgileBaseCamp - 2012
 
Moscow js node.js enterprise development
Moscow js node.js enterprise developmentMoscow js node.js enterprise development
Moscow js node.js enterprise development
 
Learn Developing REST API in Node.js using LoopBack Framework
Learn Developing REST API  in Node.js using LoopBack FrameworkLearn Developing REST API  in Node.js using LoopBack Framework
Learn Developing REST API in Node.js using LoopBack Framework
 
Use Node.js to create a REST API
Use Node.js to create a REST APIUse Node.js to create a REST API
Use Node.js to create a REST API
 
ВВЕДЕНИЕ В NODE.JS
ВВЕДЕНИЕ В NODE.JS ВВЕДЕНИЕ В NODE.JS
ВВЕДЕНИЕ В NODE.JS
 
Introduction to REST API with Node.js
Introduction to REST API with Node.jsIntroduction to REST API with Node.js
Introduction to REST API with Node.js
 
Архитектура программных систем на Node.js
Архитектура программных систем на Node.jsАрхитектура программных систем на Node.js
Архитектура программных систем на Node.js
 
Асинхронность и параллелизм в Node.js
Асинхронность и параллелизм в Node.jsАсинхронность и параллелизм в Node.js
Асинхронность и параллелизм в Node.js
 
Developing and Testing a MongoDB and Node.js REST API
Developing and Testing a MongoDB and Node.js REST APIDeveloping and Testing a MongoDB and Node.js REST API
Developing and Testing a MongoDB and Node.js REST API
 
Anatomy of a Modern Node.js Application Architecture
Anatomy of a Modern Node.js Application Architecture Anatomy of a Modern Node.js Application Architecture
Anatomy of a Modern Node.js Application Architecture
 

Similaire à Node.js (RichClient)

Воюем за ресурсы (ZFConf2011)
Воюем за ресурсы (ZFConf2011)Воюем за ресурсы (ZFConf2011)
Воюем за ресурсы (ZFConf2011)Alexey Kachayev
 
Другая виртуализация
Другая виртуализацияДругая виртуализация
Другая виртуализацияYandex
 
C# Web. Занятие 13.
C# Web. Занятие 13.C# Web. Занятие 13.
C# Web. Занятие 13.Igor Shkulipa
 
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...ZFConf Conference
 
JavaScript-модули "из прошлого в будущее"
JavaScript-модули "из прошлого в будущее"JavaScript-модули "из прошлого в будущее"
JavaScript-модули "из прошлого в будущее"oelifantiev
 
What do you MEAN? или введение в Fullstack JavaScript
What do you MEAN? или введение в Fullstack JavaScriptWhat do you MEAN? или введение в Fullstack JavaScript
What do you MEAN? или введение в Fullstack JavaScriptVasiliy Teliatnikov
 
C# Desktop. Занятие 15.
C# Desktop. Занятие 15.C# Desktop. Занятие 15.
C# Desktop. Занятие 15.Igor Shkulipa
 
Доставка данных в реальном времени.
Доставка данных в реальном времени. Доставка данных в реальном времени.
Доставка данных в реальном времени. beshkenadze
 
Frontend: Путешествие в мир модульных загрузчиков
Frontend: Путешествие в мир модульных загрузчиковFrontend: Путешествие в мир модульных загрузчиков
Frontend: Путешествие в мир модульных загрузчиковCodeFest
 
Проверено и работает. Инструменты Oracle для разработки веб приложений
Проверено и работает. Инструменты Oracle для разработки веб приложенийПроверено и работает. Инструменты Oracle для разработки веб приложений
Проверено и работает. Инструменты Oracle для разработки веб приложенийMedia Gorod
 
Пора ли отправлять С на свалку истории? Пишем демонов на PHP с использованием...
Пора ли отправлять С на свалку истории? Пишем демонов на PHP с использованием...Пора ли отправлять С на свалку истории? Пишем демонов на PHP с использованием...
Пора ли отправлять С на свалку истории? Пишем демонов на PHP с использованием...Vadim Kruchkov
 
инструментарий
инструментарийинструментарий
инструментарийigdweb
 
Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...
Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...
Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...Stfalcon Meetups
 
Взломать сайт на ASP.NET
Взломать сайт на ASP.NETВзломать сайт на ASP.NET
Взломать сайт на ASP.NETPositive Hack Days
 
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...CodeFest
 
Как быть с большими сайтами на Word press
Как быть с большими сайтами  на Word pressКак быть с большими сайтами  на Word press
Как быть с большими сайтами на Word pressvovasik
 

Similaire à Node.js (RichClient) (20)

Воюем за ресурсы (ZFConf2011)
Воюем за ресурсы (ZFConf2011)Воюем за ресурсы (ZFConf2011)
Воюем за ресурсы (ZFConf2011)
 
Другая виртуализация
Другая виртуализацияДругая виртуализация
Другая виртуализация
 
C# Web. Занятие 13.
C# Web. Занятие 13.C# Web. Занятие 13.
C# Web. Занятие 13.
 
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...
 
JavaScript-модули "из прошлого в будущее"
JavaScript-модули "из прошлого в будущее"JavaScript-модули "из прошлого в будущее"
JavaScript-модули "из прошлого в будущее"
 
What do you MEAN? или введение в Fullstack JavaScript
What do you MEAN? или введение в Fullstack JavaScriptWhat do you MEAN? или введение в Fullstack JavaScript
What do you MEAN? или введение в Fullstack JavaScript
 
Java 9 - кратко о новом
Java 9 -  кратко о новомJava 9 -  кратко о новом
Java 9 - кратко о новом
 
C# Desktop. Занятие 15.
C# Desktop. Занятие 15.C# Desktop. Занятие 15.
C# Desktop. Занятие 15.
 
Доставка данных в реальном времени.
Доставка данных в реальном времени. Доставка данных в реальном времени.
Доставка данных в реальном времени.
 
Java: вчера, сегодня, завтра
Java: вчера, сегодня, завтраJava: вчера, сегодня, завтра
Java: вчера, сегодня, завтра
 
Frontend: Путешествие в мир модульных загрузчиков
Frontend: Путешествие в мир модульных загрузчиковFrontend: Путешествие в мир модульных загрузчиков
Frontend: Путешествие в мир модульных загрузчиков
 
Проверено и работает. Инструменты Oracle для разработки веб приложений
Проверено и работает. Инструменты Oracle для разработки веб приложенийПроверено и работает. Инструменты Oracle для разработки веб приложений
Проверено и работает. Инструменты Oracle для разработки веб приложений
 
Пора ли отправлять С на свалку истории? Пишем демонов на PHP с использованием...
Пора ли отправлять С на свалку истории? Пишем демонов на PHP с использованием...Пора ли отправлять С на свалку истории? Пишем демонов на PHP с использованием...
Пора ли отправлять С на свалку истории? Пишем демонов на PHP с использованием...
 
инструментарий
инструментарийинструментарий
инструментарий
 
Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...
Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...
Использование Java Native Interface (JNI) и кросплатформенных C/C++ реализаци...
 
Взломать сайт на ASP.NET
Взломать сайт на ASP.NETВзломать сайт на ASP.NET
Взломать сайт на ASP.NET
 
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
 
New Android NDK & JNI
New Android NDK & JNINew Android NDK & JNI
New Android NDK & JNI
 
Java 9 - Back to the Future
Java 9 - Back to the FutureJava 9 - Back to the Future
Java 9 - Back to the Future
 
Как быть с большими сайтами на Word press
Как быть с большими сайтами  на Word pressКак быть с большими сайтами  на Word press
Как быть с большими сайтами на Word press
 

Node.js (RichClient)

  • 1. Node.js Асинхронный веб сервер с неблокирующим I/O
  • 2. Что такое Node.js 1) V8 - компилируемый JavaScript движок от Google 2) Event-loop c неблокирующим вводом/выводом 3) Модульная система CommonJS
  • 3. Философия Основная философия Node.js - асинхронное выполнение. Скрипты в Node не дожидаются завершения длительных операций, они оставляют callback, который будет выполнен позже. При этом возврат в цикл обработки событий происходит как можно скорее. 
  • 4. Блокировка программы при обращении к диску / сети RAM: ~80 наносекунд HDD: ~130 000 наносекунд Сеть: ~500 000 наносекунд Это время можно было бы использовать с большей эффективностью
  • 5. Асинхронный Ввод/Вывод (nonblocking I/O) 1) Как мы привыкли писать код на сервере: $result = $db->query(' ... '); // Запрос или, как бы  это выглядело на JS: var result = db.query(' ... '); // Запрос - Что происходит пока выполняется запрос к БД? Приложение простаивает -
  • 6. Асинхронный Ввод/Вывод (nonblocking I/O) 2) Как мы пишем  асинхронный код : db.query(' ... ', function(result) {  // Запрос      // Обработчик }); - Что происходит пока выполняется запрос к БД? Приложение обслуживает следующего пользователя -
  • 7. Современные вэб сервера используют многопоточность, Но разве это лучший подход? Давайте сравним Apache и Nginx
  • 8. Apache использует многопоточность, Проблема в том, что при увеличении числа пользователей, потоков становится слишком много.
  • 9. Переключение между потоками - ресурсоёмкая операция. Каждый поток потребляет оперативную память. Node.js также как и Nginx использует event-loop c неблокирующим вводом выводом. Пользователи обслуживаются по очереди в порядке поступления, однако, например если пользователю нужно обратиться к диску, то пока производится чтение с диска, обслуживается следующий пользователь. Event-loop
  • 10. Event-loop Таким образом приложение не простаивает, и обслуживает пользователей максимально эффективно!
  • 11. Почему JavaScript? Node.js - не первый проект призванный облегчить написание неболкирующих приложений, для Python есть Twisted и Tornado, для Ruby есть EventMachine Но событийно управляемый ввод/вывод является достаточно фундаментальным сдвигом, который требует глубокой интеграции с языком программирования.  Javascript - событийно-управляемый язык, так как своими корнями уходит в браузер.
  • 12. Почему JavaScript? Кроме того, JavaScript очень гибкий язык, пример сервера с помощью (fab)
  • 13. Система событий Стандартные библиотеки принимают callback в качестве параметра, и передают ему два аргумента, error и data. Это простая и прозрачная структура, однако она может быть изменена сторонними библиотеками.
  • 14. Система событий Так-же вы можете использовать Promises: var file = fs. open ( 'file' ) ; file. addCallback ( function ( data ){ // Сделать что нибудь с данными }) ;   file. addErrback ( 'error' , function ( error ){ // Если пришла ошибка, тоже что нибудь сделать }) ; Просто подключив модуль node_promise
  • 15. Система модулей 1) Система модулей создана по стандарту CommonJS      (Многие CommonJS модули можно использовать в Node) 2) Кеширование модулей      (один и тот же код дважды не компилируется) 3) Модули не привязаны к языку на котором они написаны      (Модуль написанный на С/С++ подключается так-же как и JS модуль)
  • 16. Внутренние модули Пример подключения: var module_name = require('module_name'); Физически модуль может находиться по одному из следующих адресов: /home/user/.node_libraries/ /home/user/.node_libraries/module_name /usr/local/lib/node/libraries/ /usr/local/lib/node/libraries/module_name
  • 17. Внешние модули Пример подключения: var module_name = require('./module_name'); //Указан абсолютный или относительный путь к модулю Физически модуль может находиться по одному из следующих адресов: ./ ./module_name
  • 18. Модули на С++ Компилируются в бинарный файл с расширением .node, и подключаются как обычные внутренние или внешние модули. Так как из С++ API V8 доступны практически все возможности JavaScript почти любой модуль модет быть в последствии переписан на С++ Это  позволяет сначала писать весь проект на JavaScript, a потом при необходимости переписывать узкие места на С++.
  • 19. Пример успешного использования Node.JS Plurk: более 200 000 одновременных соединений 1 сервер 8 экземпляров Node 32 гб памяти
  • 20. Системы пакетов: Не смотря на молодость проекта, для него уже есть более 150 разных модулей (список:  http://wiki.github.com/ry/node/modules ) Поэтому появилось несколько менеджеров пакетов, позволяющих не заботиться о связях и обновлении установленных модулей, самые популярные из них:   - kiwi   - seed   - npm   - mode
  • 21. “ two languages will never go away, C and JavaScript. ”  - Ryan Dahl (создатель nodeJS) Спасибо за внимание!