38. Entendiendo el event loop eventos Abrir archivo Sigo trabajando... FIN En espera Procesar loop Kernel I/O KERNEL Listo Callback
39.
40. No hay ejecución paralela... para VOS var http = require ( 'http' ); http. createServer ( function (req, res) { console. log ( 'New request' ); // Block for five seconds var now = new Date (). getTime (); while ( new Date (). getTime () < now + 5000 ) ; // Response res. writeHead ( 200 , { 'Content-type' : 'text/plain' }); res. end ( 'Hello world!' ); }). listen ( 1337 ); console. log ( 'Server running at http://localhost:1337' );
41. ¡¿ UN THREAD ?! ¿Y qué hago con este monstruo de 48 núcleos?
42.
43. ¡Tengo más de 1 procesador! var http = require ( 'http' ), cluster = require ( 'cluster' ); if (cluster.isMaster) { cluster. startMaster ({ workers: 4 }); process. on ( 'SIGCHLD' , function () { cluster. spawnWorker (); }); } else { http. createServer ( function (req, res) { res. writeHead ( 200 , { 'Content-type' : 'text/plain' }); res. end ( 'Hello world!' ); }). listen ( 1337 ); }
44.
45. Ok, Javascript no es tan malo... Pero en PHP tengo un montón de documentación
46. Bueno, acepto la comunidad ... Pero no tengo todas las librerías que tengo en Java
47.
48.
49. Módulos, módulos, módulos var m = require ( './module' ); m. sum ( 1 , 3 , function (err, res) { if (err) { return console. log ( 'ERROR: ' + err); } console. log ( 'RESULT IS: ' + res); }); exports.sum = function (a, b, callback) { if ( isNaN (a) || isNaN (b)) { return callback ( new Error ( 'Invalid parameter' )); } callback ( null , a+b); };
55. express var express = require ( 'express' ); var app = express. createServer (); app. get ( '/' , function (req, res) { res. send ( 'Hello world!' ); }); app. listen ( 3000 ); console. log ( 'Server listening in http://localhost:3000' ); app. configure ( function () { app. use (express. bodyParser ()); }); app. configure ( 'dev' , function () { app. use (express. logger ()); }); $ NODE_ENV=dev node app.js
56.
57. Middleware en rutas function getUser (req, res, next) { if (!req.params.id) { return next (); } else if (!users[req.params.id]) { return next ( new Error ( 'Invalid user' )); } req.user = users[req.params.id]; next (); } app. get ( '/users/:id?' , getUser, function (req, res, next) { if (!req.user) { return next (); } res. send (req.user); });
** QUE HACE: Esperando. Entra conexión, consultás la DB, y esperas resultados. Escribís un archivo, y esperás q se escriba. Encodeás un video, y esperás q termine. ** CACHING: Memcached ** WORKERS: Gearman, o ActiveMQ / RabbitMQ ** FASTER DB: NoSQL (MongoDB, CouchDB)
No podés simplemente abrir nuevos procesos o threads para cada conexión NGINX basado en eventos, uso de memoria muy bajo APACHE lanza un thread por request (o proceso dependiendo de la conf) THREADS están mucho tiempo bloqueados por operaciones I/O EVENTOS son mejores cuando se emplea mucho tiempo esperando recursos
** V8: Sin soporte DOM
** PROPS: Propiedades de objetos se cambian en runtime en JS: diccionarios de propiedades Variables de instancia tienen offsets fijos por compilador. V8 crea clases ocultas, una para cada propiedad agregada y las transiciones de clases representan cambios en las propiedades del obj (solo 1ra vez) ** CODIGO MAQUINA: en primera ejecucion de JS, se compila a maquina, NO a codigo intermedio ** GARBAGE: cuando se corre GC, se bloquea. Cada ciclo GC procesa parte del heap. En V8 3.7 (node 0.6) hay un nuevo GC q permite heaps de tamaño ilimitado
** Tornado (Python). Tambien Event Machine (Ruby)
** LIBEIO: similar a LIBEV, por Marc Lehmann. Puede ser usado con cualq lib de eventos, o en modo POLLING. Se basa unicamente en POSIX threads. Usa threads internamente, es usado por Node.JS para acceso de file/network, integrato en node via LIBEV ** LIBEV: tamb por Marc Lehmann. Notificacion asincrona de cambios en file descriptor a traves de ev_io() ** LIBUV: Separa lo propio del OS de V8 ** ReadFile(): mucho codigo JS, arriba de fs.open(), q es un wrapper sobre C++ Open(), q usa libeio
Node sobre Windows es tan rapido como Linux Soporte desde Windows Server 2003 a Windows 7
** BUFFER: Fuera del heap V8. Conversion a JS a través de encoding (binary, utf8, ascii, etc.) ** C-ARES: gethostbyname(), consultas DNS ** CHILD_PROCESSES: fork() esta en tierra JS, uso particular de spawn(), con mensajeo IPC ** CRYPTO: crear hashes, ciphers con diferentes algoritmos, firmar con private keys, verificar firmas ** HTTP_PARSER: NO allocation, NO buffer ** TIMER: setTimeout() una sola vez, setInterval() repetidas
* Todo pasa en un solo thread * Cola de eventos vacia * Al abrir archivo, se agrega tarea al event loop * Cuando hay tiempo libre, se procesa el event loop * El I/O se realiza usando herramientas del kernel que NO bloquean: epoll(), select(), kqueue() * El event loop sigue esperando * Kernel notifica al event loop q la tarea ta realizada * Event loop ejecuta callback * Cuando el event loop está vacío, el programa termina
** SOLO THREAD: todo lo que bloquea el thread ppal imposibilita procesar nuevas requests ** Para VOS: si tu código usa I/O de node, ese I/O NO bloquea ** Llamadas I/O es el punto en el que Node.js procesa otras requests. Entonces Node.js espera que las requests se procesen rápido. Tareas intensivas de CPU debieran ser en otro proceso
Como Node.JS corre en un solo proceso, esta atado a un solo CPU ** Usando al SO: el kernel hace load balancing de las conexiones a traves de los CPUs ** CLUSTER: usa muchos workers (en diferentes CPUs). Alternativa para Node < 0.6
** RUBY: Usá CoffeeScript
** Los paquetes pueden instalarse local o globalmente
** COMMONJS: defines JS APIs for any purpose, such as server side JS. Amongst the things it defines, are modules ** The EXPORTS object is created by the module system. If you want your module to be a class, assign the export object to MODULE.EXPORTS
** ROUTING: Including support for HTTP methods ** MIDDLEWARE: for manipulating all requests, or for specific routes ** VIEW RENDERING: with different template engines, and including partials (sort of like CakePHP elements) ** SESSION SUPPORT: part of Connect, can be configured even with Redis ** ENVIRONMENTS: Can specify different middleware for each environment, and change settings
** MIDDLEWARES: order is important. ** BodyParser() allows the parsing of forms (including JSON posted data as part of body) ** Other middlewares include: cookieParser(), session()
** JADE is one of the view engines available: $ npm install jade
With route middleware, it's easy to add authentication
* GENERIC_POOL: definis name, max (conexiones), create(), y destroy(). Luego adquiris con acquire(), y liberas con release() * ASYNC: SERIES (): corre en orden y stop on error, llama callback() cuando terminado. PARALLEL() no para si hay error. WATERFALL() es como series(), p cada resultado se pasa com arg al siguiente * NODEUNIT: usa modulo assert de node * SOCKET.IO: transportes WebSocket, Flash, AJAX long polling, AJAX multipart streaming, JSONP polling. IE 5.5+, Safari 3+, Chrome 4+, Firefox 3+, Opera 10.61+. Mobile (iPhone, iPad, Android, WebOs) * UNDERSCORE: Array, funciones, Object