Node.js (RichClient)

2,870
-1

Published on

Published in: Technology
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
2,870
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
25
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

Node.js (RichClient)

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

×