Node.js

Hype or hope?

Licencja: CC BY-ND 3.0 PL

Hello Node!


require("http").createServer(function(request, response) {

  response.writeHead(200, { "Content-Type": "text/plain" });
  response.end("Hello World\n");

}).listen(1337, "127.0.0.1");

console.log("Server running at http://127.0.0.1:1337/");
              

Analiza

Tworzymy serwer HTTP i nasłuchujemy


require("http")
  .createServer(handleRequest)
  .listen(1337, "127.0.0.1");

console.log("Server running at http://127.0.0.1:1337/");
              

Po nadejściu żądania wywołana zostanie funkcja handleRequest


function handleRequest(request, response) {
  response.writeHead(200, { "Content-Type": "text/plain" });
  response.end("Hello World\n");
}
              

Czym jest Node.js?

Node.js is a platform built on Chrome's JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices.

Marketingowy Bełkot

Rozszyfrujmy to!

V8

Chrome's JavaScript runtime

Event-Driven Model

Event Loop

Non-blocking I/O

No i gdzie ta innowacja?

  • JavaScript na serwerze nie jest nową koncepcją.
  • Asynchroniczna obsługa żądań również nie jest niczym nowym.
  • Innowacyjne jest dopiero połączenie obu elementów.

Dlaczego więc JavaScript?

Z trzech głównych powodów:

  • Asynchroniczna obsługa zdarzeń to standardowe podejście stosowane w JavaScript.
                      
    document.addEventListener("DOMContentLoaded", eventHandler);
                      
                    
  • Brak zależności w postaci bibliotek obsługujących operacje wejścia-wyjścia.
  • V8

Historia

Kartka z kalendarza

  1. 2009 Ryan Dahl prezentuje koncepcję Node.js
  2. 2009 - 2011 Ciągły rozwój, powstają wersje 0.2 oraz 0.4
  3. Wrzesień 2011 Powstaje
    libuv
  4. Listopad 2011 Powstaje wersja 0.6 - "pierwsza stabilna" gałąź
  5. Grudzień 2011 Wsparcie firmy Microsoft dla Node.js na Windows Azure
  6. Styczeń 2012 Ryan opuszcza Node.js, opiekunem zostaje Isaac
  7. Czerwiec 2012 Pojawia najpopularniejsza obecnie wersja 0.8
  8. Grudzień 2012 Pojawia się nowe API dla strumieni w wersji 0.10.x
  9. Maj 2013 Wersja 0.12 będzie ostatnią przed wydaniem 1.0

Motywacja

Jak efektywniej wykorzystać istniejącą infrastrukturę?

Joyent

  • Jeśli nie wiadomo o co chodzi, to chodzi o pieniądze...
  • ... a zwłaszcza o to jak ich zbyt dużo nie wydać ;)

C10k problem

concurrent ten thousand connections problem

Problem optymalizacji zasobów w celu osiągnięcia jak największej liczby żądań obsłużonych równolegle.

Inne rozwiązania problemu C10k

  • nginx
  • lighttpd
  • Sinatra
  • EventMachine
  • Twisted
  • Netty
  • IIS + WebSync
  • Yaws

Skalowalność

a zużycie pamięci serwera:
  • Tomcat
  • IIS
  • Apache
  • lighttpd
  • nginx
  • Node.js

Pro

DIRTy Applications

DIRT = Data Intensive Real-Time

Mashup Applications

IFTTT Visualization

Glue Layer / Middleware

Warstwa pomiędzy usługami

Contra

Aplikacje intensywnie wykorzystujące CPU


Aplikacje typu CRUD / CMS

Moda

Magic-Unicorn-NoSQL-Async-Non-Blocking-I/O
Buzzwords Bullshit

Kto?

  • PayPal Logo
  • Microsoft Logo
  • eBay Logo
  • Voxer Logo
  • LinkedIn Logo
  • Uber Logo
  • Nodejitsu Logo
  • Cloud9 IDE Logo
  • Yahoo! Logo
  • StrongLoop Logo
  • NY Times Logo
  • Transloadit Logo
  • backbeam Logo

Success Stories

  • Lekkość prototypowania
  • Asynchroniczna obsługa wejścia - wyjścia
  • Intensywne wykorzystanie Web Sockets
  • Strumieniowanie danych
  • API typu REST oparte o transport JSON
  • Narzędzia konsolowe (grunt, bower, yeoman)
  • Aplikacje desktopowe (moduł node-webkit - LightTable)
  • Reveal.js oraz slid.es

Co jeszcze?

libuv

Jest to biblioteka napisana w języku C, która wprowadza warstwę abstrakcji dla nieblokujących operacji wejścia-wyjścia, która jest niezależna od systemu operacyjnego.

NPM

Node Packaged Modules

Sam rdzeń platformy jest bardzo cienki, więc moduły przygotowane przez społeczność są bardzo ważnym elementem.

Codziennie powstaje 97 nowych modułów.
September 2011 September 2012 September 2013
4700 15000 42000

Oczywiście nigdy nie jest tak dobrze, żeby nie mogło być lepiej.

Unix Philosophy

Write programs that do one thing and do it well.
Write programs to work together.
Write programs to handle streams.

ECMAScript 5 oraz 6

              
# Node.js w wersji 0.11.2
$ node --v8-options | grep harmony
  --harmony_typeof
  --harmony_scoping
  --harmony_modules
  --harmony_symbols
  --harmony_proxies
  --harmony_collections
  --harmony_observation
  --harmony_typed_arrays
  --harmony_array_buffer
  --harmony_generators
              
            

Pytania?

Zapraszam do zapisów na warsztaty

Dziękuję za uwagę!

Odniesienia dla ciekawskich

Wykorzystane obrazy pochodzą ze stron: