Curso de




Día 1: Introducción

Vuestro anfitrión


(según mi hija de 5 años)

Más de 15 años de experiencia en desarrollo
Ingeniero senior en MediaSmart Mobile
Co-organizador de Node.js Madrid
Cacharreador impenitente
@pinchito

Guión


  • Primeros pasos
  • Sesión práctica 1: hola mundo.
  • Simplecached: Memcached en Node.js
  • Sesión práctica 2: simplecached.

Node.js



IntroduCCión

Pero primero, un chiste


- Oye, , ¿cómo es que eres tan rápido? 

+ Es que yo soy async.


Fuente: pinchito


JavaScript en el servidor

Motor de JS en Chrome: V8 (en cómic)

Adaptado para el servidor por Ryan Dahl

Software libre (conoce tu  software)

Soporte de Joyent

Modelo de ejecución

Asíncrono

No bloqueante

Event-driven


Servidores similares:

Python: Tornado, Twisted

Ruby: EventMachine

Java: Akka


Fuente: nodejs.org/about, Wikipedia

¿Eventos? ¿Por qué no hilos?


Un programador tenía un problema.

Pensó para sí mismo,

"Ya sé, ¡lo resolveré con hilos!".

tiene Ahora problemas. dos

Adaptado de: Davidlohr Bueso

Tres generaciones


Procesos: CGI, PHP core


Hilos: Apache MTM, Java Servlets


Eventos: nginx, node.js


Node.js es rápido

Pero, ¿es de verdad rápido?


No con código secuencial...

pero sí en ejecución concurrente


Sólo tiene un hilo de ejecución (básicamente sin hilos)

Multi-proceso usando el módulo cluster


Node.js es muy escalable

Node.js es muy lineal

Historia de éxito: PayPal

Página de vista de cuentas


2 ingenieros durante 4 meses

Desarrollado dos veces más rápido que la versión Java

33% menos código, 40% menos ficheros


Soporta el doble de peticiones por segundo

Tiempo de respuesta un 35% más rápido


Fuente: Node.js at PayPal

Historia de éxito: MediaSmart Mobile


Plataforma inicial: un ingeniero durante un año

Plataforma actual: tres ingenieros durante año y medio

Sirve anuncios para campañas en móvil


Soporta 80k peticiones/segundo (al menos)

Escala a 40 servidores (que sepamos)

Latencia < 80 ms


Fuente: datos internos

Sesión práctica 1


Crear proyecto node.js



Añadir a GitHub



¡Hola, mundo!

Especificación técnica

Servidor de sockets, puerto 1702


Al abrir una conexión, pregunta: "¿Hola?"

Al recibir "hola" responde "mundo" y termina

Cualquier otro mensaje resulta en "ERROR"


Nota técnica: ¡cuidado con los retornos de carro!

Siempre deben ser "\r\n".


Documentación: node.js net module

Código de muestra


var net = require('net');

var server = net.createServer(function(connection) {
console.log('Conexión abierta');
connection.write('¿Hola?');
connection.on('data', function(data) {
if (String(data).trim() != 'hola') {
connection.write('ERROR');
} else {
connection.write('mundo');
console.log('Conexión cerrada');
}
});
});
server.listen(port);

Tiene tres errores

Fuente: hello-world.js

¡Bien!



Memcached



La base de datos clave-valor en memoria

¿Qué es Memcached?


Creada en 2003 por Brad Fitzpatrick para LiveJournal


NoSQL antes de que NoSQL fuera cool


Clave-valor


Almacenamiento en memoria (sin persistencia)


Y por supuesto, ¡software libre!

Cacheo por capas

Almacenamiento de valores precalculados

Respuesta casi instantánea (~10 µs)


Uno de los dos grandes inventos en arquitecturas horizontales
(el otro es el gestor de colas)

API básico Memcached

set [key] [flags] [exptime] [bytes]\r\n
[data block]\r\n
\=> STORED
\=> NOT_STORED

almacena un valor en memoria

get [key]* \r\n
\=> VALUE [key] [flags] [bytes]\r\n
[data block]\r\n
END\r\n
extrae uno o más valores por clave
delete [key]
\=> DELETED
\=> NOT_FOUND
borra un valor de memoria


Fuente: protocol.txt

API Completo

get, gets

set, add, replace, append, prepend, cas

delete

incr, decr,

touch

slabs

stats

flush_all, version, quit


Fuente: protocol.txt

Sesión de prácticas 2: Simplecached


Servidor memcached simplificado


get, set, delete


Protocolo simplificado


Sólo acepta cadenas (sin saltos de línea)

ESpecificación técnica

Servidor tipo memcached en el puerto 11311

set [key] [value]\r\n
\=> STORED
\=> NOT_STORED

almacena un valor en memoria

get [key]\r\n
\=> VALUE [key] [value]\r\n
\=> END\r\n
extrae un valor por clave
delete [key]\r\n
\=> DELETED
\=> NOT_FOUND
borra un valor de memoria

Cualquier mensaje no conforme debe resultar en ERROR.

Pistas

string.trim(): elimina espacios en los extremos

string.split(separator): divide una cadena en un array de trozos

array.slice(begin): devuelve una subcadena desde begin

array.join(separator): une un array en una cadena


Un objeto JavaScript is an mapa asociativo por clave


El valor puede contener espacios (la clave no)


Cuidado con los casos de error

Vuelta extra: Comando Quit


Añade un comando quit:


quit\r\n

cierra el cliente


Pista: connection.end(): cierra la conexión


¡Verifica que tu software sea fácil de modificar!

¡Bien!


Seguramente no

Thanks!